HBase學習之HBase的RowKey設計原則

2021-07-22 16:54:38 字數 2422 閱讀 3719

hbase是三維有序儲存的,通過rowkey(行鍵),column key(column family和qualifier)和timestamp(時間戳)這個三個維度可以對hbase中的資料進行快速定位。

hbase中rowkey可以唯一標識一行記錄,在hbase查詢的時候,有以下幾種方式:

通過get方式,指定rowkey獲取唯一一條記錄

通過scan方式,設定startrow和stoprow引數進行範圍匹配

全表掃瞄,即直接掃瞄整張表中所有行記錄

rowkey是乙個二進位製碼流,可以是任意字串,最大長度

64kb

,實際應用中一般為10-100bytes,以byte形式儲存,一般設計成定長。

建議越短越好,不要超過16個位元組,原因如下:

資料的持久化檔案hfile中是按照keyvalue儲存的,如果rowkey過長,比如超過100位元組,1000w行資料,光rowkey就要占用100*1000w=10億個位元組,將近1g資料,這樣會極大影響hfile的儲存效率;

memstore將快取部分資料到記憶體,如果rowkey欄位過長,記憶體的有效利用率就會降低,系統不能快取更多的資料,這樣會降低檢索效率。

目前作業系統都是64位系統,記憶體8位元組對齊,控制在16個位元組,8位元組的整數倍利用了作業系統的最佳特性。

如果rowkey按照時間戳的方式遞增,不要將時間放在二進位製碼的前面,建議將rowkey的高位作為雜湊字段,由程式隨機生成,低位放時間字段,這樣將提高資料均衡分布在每個regionserver,以實現負載均衡的機率。如果沒有雜湊字段,首字段直接是時間資訊,所有的資料都會集中在乙個regionserver上,這樣在資料檢索的時候負載會集中在個別的regionserver上,造成熱點問題,會降低查詢效率。

必須在設計上保證其唯一性,rowkey是按照字典順序排序儲存的,因此,設計rowkey的時候,要充分利用這個排序的特點,將經常讀取的資料儲存到一塊,將最近可能會被訪問的資料放到一塊。

hbase中的行是按照rowkey的字典順序排序的,這種設計優化了scan操作,可以將相關的行以及會被一起讀取的行訪問在臨近位置,便於scan。然而糟糕的rowkey設計是熱點的源頭。 熱點發生在大量的client直接訪問集群的乙個或極少數個節點(訪問可能是讀,寫或者其他操作)。大量訪問會使熱點region所在的單個機器超出自身承受能力,引起效能下降甚至region不可用,這也會影響同乙個regionserver上的其他region,由於主機無法服務其他region的請求。 設計良好的資料訪問模式以使集群被充分,均衡的利用。

為了避免寫熱點,設計rowkey使得不同行在同乙個region,但是在更多資料情況下,資料應該被寫入集群的多個region,而不是乙個。

下面是一些常見的避免熱點的方法以及它們的優缺點:

加鹽

這裡所說的加鹽不是密碼學中的加鹽,而是在rowkey的前面增加隨機數,具體就是給rowkey分配乙個隨機字首以使得它和之前的rowkey的開頭不同。分配的字首種類數量應該和你想使用資料分散到不同的region的數量一致。加鹽之後的rowkey就會根據隨機生成的字首分散到各個region上,以避免熱點。

雜湊

雜湊會使同一行永遠用乙個字首加鹽。雜湊也可以使負載分散到整個集群,但是讀卻是可以**的。使用確定的雜湊可以讓客戶端重構完整的rowkey,可以使用get操作準確獲取某乙個行資料

反轉

第三種防止熱點的方法時反轉固定長度或者數字格式的rowkey。這樣可以使得rowkey中經常改變的部分(最沒有意義的部分)放在前面。這樣可以有效的隨機rowkey,但是犧牲了rowkey的有序性。

反轉rowkey的例子以手機號為rowkey,可以將手機號反轉後的字串作為rowkey,這樣的就避免了以手機號那樣比較固定開頭導致熱點問題

時間戳反轉

乙個常見的資料處理問題是快速獲取資料的最近版本,使用反轉的時間戳作為rowkey的一部分對這個問題十分有用,可以用long.max_value - timestamp追加到key的末尾,例如[key][reverse_timestamp],[key]的最新值可以通過scan [key]獲得[key]的第一條記錄,因為hbase中rowkey是有序的,第一條記錄是最後錄入的資料。

比如需要儲存乙個使用者的操作記錄,按照操作時間倒序排序,在設計rowkey的時候,可以這樣設計

[userid反轉][long.max_value - timestamp],在查詢使用者的所有操作記錄資料的時候,直接指定反轉後的userid,startrow是[userid反轉][000000000000],stoprow是[userid反轉][long.max_value - timestamp]

如果需要查詢某段時間的操作記錄,startrow是[user反轉][long.max_value - 起始時間],stoprow是[userid反轉][long.max_value - 結束時間]

其他一些建議

Hbase學習之四 Hbase表設計案例

環境 虛擬機器 vmware 10 linux版本 centos 6.5 x86 64 客戶端 xshell4 ftp xftp4 jdk8 hadoop 2.6.5 hbase 0.98.12.1 hadoop2 hbase中表的設計 主要是將原來的關係解開 問題 例子 表設計一 表設計二 這是乙...

Hbase 學習筆記 Hbase 概覽

hbase構建在 hdfs 之上,hbase內部管理的檔案全部儲存在hdfs 中 行鍵,table的主鍵,table中的記錄按照row key排序。型別為byte array 列簇,table在水平方向有乙個或者多個column family組成,乙個column family中可以由任意多個col...

HBase學習筆記(一) 《HBase簡介》

hbase簡介 1 hbase表的結構 hbase以表 table 的形式儲存資料 row key 行鍵 與nosql資料庫們一樣,row key是用來檢索記錄的主鍵。row key行鍵 row key 可以是任意字串 最大長度是 64kb,實際應用中長度一般為 10 100bytes 在hbase...