理解Hbase RowKey的字典排序,以及设计
写点自己的理解和实践。
HBase是三维有序存储的,是指rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度是依照ASCII码表排序的。(比如A排在a前面)
- 先rowkey升序排序,
- rowkey相同则column key升序排序
- rowkey、column key相同则timestamp降序排序
如下: 假设存在table:test,family:info
scan表得到结果如下:
//列族默认VERSIONS值为1,可以通过命令:alter 'tableName','familyName',VERSINOS =>5来设置
//不同version保存不同时间戳的数据,默认是只显示最新version数据。要想显示所有,scan时应该加上{VERSIONS =>5}
hbase(main):009:0> scan 'test', {VERSIONS =>5}
ROW COLUMN+CELL
12Aabb column=info:name,timestamp=1519957330893,value=123
3aabb column=info:name,timestamp=1519963129863,value=3234
3aabb column=info:name,timestamp=1519962895984,value=234
3aabb column=info:name,timestamp=1519962889791,value=234
3aabb column=info:name,timestamp=1519960252203,value=999
Aabb column=info:address,timestamp=1519969857611,value=cccc
Aabb column=info:friend,timestamp=1519969916299,value=jack
Aabb column=info:name,timestamp=1519957330890,value=123
aabb column=info:name,timestamp=1519957330859,value=123
4 row(s) in 0.0530 seconds
因为RowKey是按照字典序排列的,且Hbase表只有键可以建立索引(这里键是指:行键,列限定符,时间戳),所以:
在设计Hbase表时,行键是唯一重要的事情
- 若热点数据的RowKey都是以相同开头,则很容易被存储在同一RegionServer上,这样就会造成访问的性能瓶颈。
- 对RowKey散列可以获取定长行键,且更好的数据分布,但是失去了排序的好处
- 过长的RowKey会加长硬盘和网络IO的开销,所以应该尽量精简
其中还有很多思想可以参考《Hbase实战》
关于RowKey设计:https://juejin.im/entry/5764f4c95bbb500063f949f9
既然上面说了RowKey是按字典序排列的,那么在HbaseClient中Scan类的两个方法setStartRow()、setStopRow()也是根据字典序来比较的。具体使用见我的另外一篇博客:http://blog.csdn.net/zhaominpro/article/details/79423462