5-Hbase Rowkey設計
HBase是採用Key-Value形式的列存儲,rowkey是HBase的key-value存儲中的key,所以rowkey的設計是非常重要,直接影響到HBase的性能。
HBase按單個Rowkey檢索的效率是很高的,耗時在1毫秒以下就可以完成,下面就來說說rowkey的設計原則:
1、RowKey的四大特性
1.1 字元串類型
雖然行鍵在HBase中是以byte[]位元組數組的形式存儲的,但是建議在系統開發過程中將其數據類型設置為String類型,保證通用性;如果在開發過程中將RowKey規定為其他類型,譬如Long型,那麼數據的長度將可能受限於編譯環境等所規定的數據長度。
常用的行鍵字元串有以下幾種:
純數字字元串,譬如9559820140512;
數字+特殊分隔符,譬如95598-20140512;
數字+英文字母,譬如city20140512;
數字+英文字母+特殊分隔符,譬如city_20140512。
1.2 有明確意義
RowKey的主要作用是為了進行數據記錄的唯一性標示,但是唯一性並不是其全部,具有明確意義的行鍵對於應用開發、數據檢索等都具有特殊意義。譬如上面的數字字元串9559820140512,其實際意義是這樣:95598(電網客服電話)+20140512(日期)。
行鍵往往由多個值組合而成,而各個值的位置順序將影響到數據存儲和檢索效率,所以在設計行鍵時,需要對日後的業務應用開發有比較深入的了解和前瞻性預測,才能設計出可盡量高效率檢索的行鍵。
1.3 具有有序性
RowKey是按照字典序存儲,因此,設計RowKey時,要充分利用這個排序特點,將經常一起讀取的數據存儲到一塊,將最近可能會被訪問的數據放在一塊。
舉個例子:如果最近寫入HBase表中的數據是最可能被訪問的,可以考慮將時間戳作為RowKey的一部分,由於是字典序排序,所以可以使用Long.MAX_VALUE – timestamp作為RowKey,這樣能保證新寫入的數據在讀取時可以被快速命中。
1.4 具有定長性
行鍵具有有序性的基礎便是定長,譬如20140512080500、20140512083000,這兩個日期時間形式的字元串是遞增的,不管後面的秒數是多少,我們都將其設置為14位數字形式,如果我們把後面的0去除了,那麼201405120805將大於20140512083,其有序性發生了變更。所以我們建議,行鍵一定要設計成定長的。
2、RowKey設計原則
2.1 RowKey長度原則
Rowkey是一個二進位碼流,Rowkey的長度被很多開發者建議說設計在10~100個位元組,不過建議是越短越好,不要超過16個位元組。
原因如下:
(1)數據的持久化文件HFile中是按照KeyValue存儲的,如果Rowkey過長比如100個位元組,1000萬列數據光Rowkey就要佔用100*1000萬=10億個位元組,將近1G數據,這會極大影響HFile的存儲效率;
(2)MemStore將緩存部分數據到內存,如果Rowkey欄位過長內存的有效利用率會降低,系統將無法緩存更多的數據,這會降低檢索效率。因此Rowkey的位元組長度越短越好。
(3)目前操作系統是都是64位系統,內存8位元組對齊。控制在16個位元組,8位元組的整數倍利用操作系統的最佳特性。
2.2 RowKey散列原則
如果Rowkey是按時間戳的方式遞增,不要將時間放在二進位碼的前面,建議將Rowkey的高位作為散列欄位,由程序循環生成,低位放時間欄位,這樣將提高數據均衡分布在每個Regionserver實現負載均衡的幾率。如果沒有散列欄位,首欄位直接是時間信息將產生所有新數據都在一個RegionServer上堆積的熱點現象,這樣在做數據檢索的時候負載將會集中在個別RegionServer,降低查詢效率。
2.3 RowKey唯一原則
必須在設計上保證其唯一性。
推薦閱讀:
※HBaseCon&灣區見聞及感想
※hbase分散式集群搭建
※大數據查詢——HBase讀寫設計與實踐
※hdfs本身是不支持文件隨機插入數據。那麼hbase中隨機寫入記錄,在hdfs中是怎麼實現的呢?
※region HFile DataNode 三者的區別與關係?
TAG:HBase |