理解Hbase RowKey的字典排序,以及设计_hbase字典排序_一个行走的民的博客

CSDN博客 · · 723 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

理解Hbase RowKey的字典排序,以及设计

写点自己的理解和实践。

HBase是三维有序存储的,是指rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度是依照ASCII码表排序的。(比如A排在a前面)

  1. 先rowkey升序排序,
  2. rowkey相同则column key升序排序
  3. 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表时,行键是唯一重要的事情

  1. 若热点数据的RowKey都是以相同开头,则很容易被存储在同一RegionServer上,这样就会造成访问的性能瓶颈。
  2. 对RowKey散列可以获取定长行键,且更好的数据分布,但是失去了排序的好处
  3. 过长的RowKey会加长硬盘和网络IO的开销,所以应该尽量精简

其中还有很多思想可以参考《Hbase实战》
关于RowKey设计:https://juejin.im/entry/5764f4c95bbb500063f949f9

既然上面说了RowKey是按字典序排列的,那么在HbaseClient中Scan类的两个方法setStartRow()、setStopRow()也是根据字典序来比较的。具体使用见我的另外一篇博客:http://blog.csdn.net/zhaominpro/article/details/79423462

723 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传