1. 程式人生 > >Hbase優化之RowKey設計

Hbase優化之RowKey設計

1. Hbase的預分割槽

HBase預設建表時有一個region,這個region的rowkey是沒有邊界的,即沒有startkey和endkey。在資料寫入時,所有資料都會寫入這個預設的region。隨著資料量的不斷增加,這個預設的region會越來越大,當達到某個閾值會自動split成為2個region。


2. Hbase的Rowkey設計

Hbase的RowKey設計,一般也需要參考預分割槽個數(或者預分割槽的個數通常根據RowKey的分佈情況來設計),保證RowKey均勻分佈到每個預分割槽上可以提供更好的Hbase讀寫效能。


3. 預分割槽及RowKey設計方案示例

本文使用的hbase叢集有3個RegionServer,因此簡單的將測試表TEST的預分割槽設定為3個,建表語句如下:

# Phoenix建表語句
# ----------------------------------------
CREATE TABLE "TEST" (
"row_key" varchar primary key,
"id_number" varchar,
"star_time" varchar,
"x_coordinate" varchar,
"y_coordinate" varchar
) SPLIT ON ('1','2');

4.1 RowKey設計原則

Salt
讓資料均衡的分佈到各個 Region 上,結合 pre-split,我們對查詢鍵即 check 表的 check_id 求 hashcode 值,然後 modulus(numRegions) 作為字首,注意補齊資料。

Hash 雜湊
因為 check_id 本身是不定長的字元數字串,為使資料雜湊化,方便 RowKey 查詢和比較,我們對 check_id 採用 SHA1 雜湊化,並使之 32 位定長化。

唯一性
以上 salt+hash 作為 RowKey 字首,加上 TEST表的start_time時間欄位來保障 RowKey 唯一性。

最終生成RowKey如下:

# 使用`Salt+HASH(id_number)+start_time+collection_type`的組合作為RowKey。
# --------------------------------------------------------------------
# 生成的RowKey如下:
0fd5f3068412d587cd12ddeaf981e5c27201810101556120201

5. 檢視資料分佈情況

向TEST表插入資料,檢視資料分佈情況如下:

Name	Region Server	Start Key	End Key	Locality	Requests
TEST,,1539158154473.3f541e93e42a6bfbbff141ed4636ce38.	node5:16020		1	0.0	621
TEST,1,1539158154473.503b0c00b29aed14ec9e0e5dd1514ef3.	node6:16020	1	2	0.0	514
TEST,2,1539158154473.6929ab9e93e4592903011b48f1327d68.	node4:16020	2		0.0	600