在關心到hbase中rowkey設計的時候,說明hbase基本的知識已經了解了。就直接上干貨(如果不了解的可以參考我上面一片關于hbase的自我總結的文章,我覺得總結的還是很好的)。如果文章中有錯誤或是不規范的地方,歡迎隨時找我哈
rowkey長度原則
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按照時間戳的方式遞增,不要將時間放在二進制碼的前面,建議將rowkey的高位作為散列字段,由程序隨機生成,低位放時間字段,這樣將提高數據均衡分布在每個RegionServer,以實現負載均衡的幾率。如果沒有散列字段,首字段直接是時間信息,所有的數據都會集中在一個RegionServer上,這樣在數據檢索的時候負載會集中在個別的RegionServer上,造成熱點問題,會降低查詢效率。
rowkey唯一原則
必須在設計上保證其唯一性,rowkey是按照字典順序排序存儲的,因此,設計rowkey的時候,要充分利用這個排序的特點,將經常讀取的數據存儲到一塊,將最近可能會被訪問的數據放到一塊。
其他一些建議
盡量減少行和列的大小在HBase中,value永遠和它的key一起傳輸的。當具體的值在系統間傳輸時,它的rowkey,列名,時間戳也會一起傳輸。如果你的rowkey和列名很大,甚至可以和具體的值相比較,那么你將會遇到一些有趣的問題。HBase storefiles中的索引(有助于隨機訪問)最終占據了HBase分配的大量內存,因為具體的值和它的key很大。可以增加block大小使得storefiles索引再更大的時間間隔增加,或者修改表的模式以減小rowkey和列名的大小。壓縮也有助于更大的索引。
列族盡可能越短越好,最好是一個字符
冗長的屬性名雖然可讀性好,但是更短的屬性名存儲在HBase中會更好