Spring Boot 2.x :通過 spring-boot-starter-hbase 集成 HBase


摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝!

本文內容

  • HBase 簡介和應用場景
  • spring-boot-starter-hbase 開源簡介
  • 集成 HBase 實戰
  • 小結

摘錄:Many a Man thinks he is buying Pleasure,when he is really sellinghimself a Slave to it.
許多人認為自己花錢買了快樂,其實是花錢做了快樂的奴隸。

一、HBase 簡介和應用場景

1.1 HBase 是什么?

HBase 是什么?HBase 是在 Hadoop 分布式文件系統(簡稱:HDFS)之上的分布式面向列的數據庫。而且是 2007 最初原型,歷史悠久。

那追根究底,Hadoop 是什么?Hadoop是一個分布式環境存儲並處理大數據。Hadoop 使用 MapReduce 算法統計分析大數據。這時候不得不說下 Google 的著名的三篇大數據的論文,分別講述 GFS、MapReduce、BigTable,詳見 https://www.bysocket.com/archives/2051。

那回到 HBase,HBase 在 Hadoop 之上提供了類似 BigTable 的能力,它不同於一般的關系數據庫,是一個適合非結構化數據存儲的數據庫。它也不同於行式數據庫,是基於列的模式。

HBase 一個面向列的數據庫,排序由行決定。簡而言之:

  • 表是行的集合。
  • 行是列族的集合。列族,就是鍵值對。每個列族以 key 為列命名,可以有無數的列。
  • 列族就是列的集合。列連續存儲,並且每個單元會有對應的時間戳
  • 列的存儲也是鍵值對。

file

與行式數據庫最大的區別就是,可以面向列設計巨大表,適用於在線分析處理 OLAP。
與關系型數據庫 RDBMS 也有些區別如下:

  • HBase 寬表,橫向擴展。RDBMS 小表,難成規模
  • HBase 沒有事務
  • HBase 無規范化數據,都是鍵值對 key value
1.2 HBase 應用場景

官網上 hbase.apache.org,特性這么多:

Features:
Linear and modular scalability.
Strictly consistent reads and writes.
Automatic and configurable sharding of tables
Automatic failover support between RegionServers.
Convenient base classes for backing Hadoop MapReduce jobs with Apache HBase tables.
Easy to use Java API for client access.
Block cache and Bloom Filters for real-time queries.
Query predicate push down via server side Filters
Thrift gateway and a REST-ful Web service that supports XML, Protobuf, and binary data encoding options
Extensible jruby-based (JIRB) shell
Support for exporting metrics via the Hadoop metrics subsystem to files or Ganglia; or via JMX

最主要的還是特性能有什么應用場景?大致搜集了下業界的:

  • 監控數據的日志詳情
  • 交易訂單的詳情數據(淘寶、有贊)
  • facebook 的消息詳情

二、spring-boot-starter-hbase 開源簡介

spring-boot-starter-hbase 是自定義的spring-boot 的 hbase starter,為 hbase 的 query 和更新等操作提供簡易的 api 並集成spring-boot 的 auto configuration。

具體地址:

https://github.com/SpringForAll/spring-boot-starter-hbase

三、集成 HBase 實戰

具體代碼地址:https://github.com/JeffLi1993/springboot-learning-example

工程名:springboot-hbase

3.1 安裝 spring-boot-starter-hbase 組件依賴

因為不在公共倉庫,只能自行安裝。如果有 maven 私庫,可以考慮安裝到私庫。

下載項目到本地:

git clone https://github.com/SpringForAll/spring-boot-starter-hbase.git

安裝依賴:

cd spring-boot-starter-hbase
mvn clean install

等待安裝完畢即可。

3.2 工程集成依賴

目錄結構如下:

springboot-hbase git:(master)
├── pom.xml
└── src
    └── main
        ├── java
        │   └── org
        │       └── spring
        │           └── springboot
        │               ├── Application.java
        │               ├── controller
        │               │   └── CityRestController.java
        │               ├── dao
        │               │   └── CityRowMapper.java
        │               ├── domain
        │               │   └── City.java
        │               └── service
        │                   ├── CityService.java
        │                   └── impl
        │                       └── CityServiceImpl.java
        └── resources
            └── application.properties

先在 pom.xml 加入 spring-boot-starter-hbase 組件依賴,也就是上面安裝的依賴,核心加入代碼如下:

    <properties>
        <hbase-spring-boot>1.0.0.RELEASE</hbase-spring-boot>
    </properties>

    <!-- Spring Boot HBase 依賴 -->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>spring-boot-starter-hbase</artifactId>
            <version>${hbase-spring-boot}</version>
        </dependency>

然后配置相關 HBase 連接信息,具體 HBase 安裝,網上文章一大堆。在 spring-boot 項目的 application.properties 文件中加入對應的配置項目,並檢查配置是否正確:

## HBase 配置
spring.data.hbase.quorum=xxx
spring.data.hbase.rootDir=xxx
spring.data.hbase.nodeParent=xxx

具體配置項信息如下:

  • spring.data.hbase.quorum 指定 HBase 的 zk 地址
  • spring.data.hbase.rootDir 指定 HBase 在 HDFS 上存儲的路徑
  • spring.data.hbase.nodeParent 指定 ZK 中 HBase 的根 ZNode
3.3 HBase 保存查詢操作

定義 DTO ,即 domain 包下的 City 對象:

public class City { /** * 城市編號 */ private Long id; /** * 省份年齡 */ private Integer age; /** * 城市名稱 */ private String cityName; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } } 

然后定義該對象的 RowMapper,是用來和 HBase 存儲作為映射:

public class CityRowMapper implements RowMapper<City> { private static byte[] COLUMN_FAMILY = "f".getBytes(); private static byte[] NAME = "name".getBytes(); private static byte[] AGE = "age".getBytes(); @Override public City mapRow(Result result, int rowNum) throws Exception { String name = Bytes.toString(result.getValue(COLUMN_FAMILY, NAME)); int age = Bytes.toInt(result.getValue(COLUMN_FAMILY, AGE)); City dto = new City(); dto.setCityName(name); dto.setAge(age); return dto; } } 

然后可以用 spring-boot-starter-hbase 組件的 HbaseTemplate 操作 HBase API 。具體操作邏輯寫在 CityServiceImpl 業務邏輯實現:

@Service public class CityServiceImpl implements CityService { @Autowired private HbaseTemplate hbaseTemplate; public List<City> query(String startRow, String stopRow) { Scan scan = new Scan(Bytes.toBytes(startRow), Bytes.toBytes(stopRow)); scan.setCaching(5000); List<City> dtos = this.hbaseTemplate.find("people_table", scan, new CityRowMapper()); return dtos; } public City query(String row) { City dto = this.hbaseTemplate.get("people_table", row, new CityRowMapper()); return dto; } public void saveOrUpdate() { List<Mutation> saveOrUpdates = new ArrayList<Mutation>(); Put put = new Put(Bytes.toBytes("135xxxxxx")); put.addColumn(Bytes.toBytes("people"), Bytes.toBytes("name"), Bytes.toBytes("test")); saveOrUpdates.add(put); this.hbaseTemplate.saveOrUpdates("people_table", saveOrUpdates); } } 

HbaseTemplate 提供常見的操作接口如下:

  • hbaseTemplate.find 返回 HBase 映射的 City 列表
  • hbaseTemplate.get 返回 row 對應的 City 信息
  • hbaseTemplate.saveOrUpdates 保存或者更新

如果 HbaseTemplate 操作不滿足需求,完全可以使用 hbaseTemplate 的getConnection() 方法,獲取連接。進而類似 HbaseTemplate 實現的邏輯,實現更復雜的需求查詢等功能

具體代碼地址:https://github.com/JeffLi1993/springboot-learning-example

工程名:springboot-hbase

四、小結

其實 starter 這種好處,大家也都知道。低耦合高內聚,類似 JDBCTemplate,將操作 HBase、ES 也好的 Client 封裝下。然后每個業務工程拿來即用,不然肯定會有重復代碼出現。

另外還是強調一點,合適的業務場景選擇 HBase,常見如下:

  • 監控數據的日志詳情
  • 交易訂單的詳情數據(淘寶、有贊)
  • facebook 的消息詳情
 
(關注微信公眾號,領取 Java 精選干貨學習資料)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM