rowkey長度原則
rowkey是一個(gè)二進(jìn)制碼流熟呛,可以是任意字符串静檬,最大長度 64kb 炭懊,實(shí)際應(yīng)用中一般為10-100bytes,以 byte[]形式保存拂檩,一般設(shè)計(jì)成定長侮腹。建議越短越好,不要超過16個(gè)字節(jié)稻励,原因如下:
- 數(shù)據(jù)的持久化文件HFile中是按照KeyValue存儲(chǔ)父阻;
- MemStore大小固定,rowkey字段過長,存儲(chǔ)的row就越少钉迷。
- 目前操作系統(tǒng)都是64位系統(tǒng)至非,內(nèi)存8字節(jié)對齊,控制在16個(gè)字節(jié)糠聪,8字節(jié)的整數(shù)倍利用了操作系統(tǒng)的最佳特性荒椭。
rowkey散列原則
如果rowkey按照時(shí)間戳的方式遞增,不要將時(shí)間放在二進(jìn)制碼的前面舰蟆,建議將rowkey的高位作為散列字段趣惠,由程序隨機(jī)生成,低位放時(shí)間字段身害,這樣將提高數(shù)據(jù)均衡分布在每個(gè)RegionServer味悄,以實(shí)現(xiàn)負(fù)載均衡的幾率。
rowkey唯一原則
必須在設(shè)計(jì)上保證其唯一性塌鸯,rowkey是按照字典順序排序存儲(chǔ)的
熱點(diǎn)
下面是一些常見的避免熱點(diǎn)的方法以及它們的優(yōu)缺點(diǎn):
時(shí)間戳反轉(zhuǎn)
一個(gè)常見的數(shù)據(jù)處理問題是快速獲取數(shù)據(jù)的最近版本侍瑟,使用反轉(zhuǎn)的時(shí)間戳作為rowkey的一部分對這個(gè)問題十分有用,可以用Long.Max_Value - timestamp
追加到key的末尾,例如 [key][reverse_timestamp]