1、背景
06年,Google发布了《BigTable: A Distributed StorageSystem for Structured Data》,由PowerSet实现并开源,HBase是一种分布式、可扩展的大数据存储结构,如果在HBase中存放了时序数据,常常需要访问最近的若干数据LastN。本文基于上述背景进行LastN的优化实现。
2、方案设计
hbase版本基于公司hbase组件1.0.19-kwai,假设Rowkey为:分钟级时间戳,由于hbase根据rowkey的字典序从小到大存储,因此,显而易见可以使用,设置startRowkey、stopRowkey,同时设置reverse函数。
3、scan and reversed scan
3.1、scan
用户可以通过hbase client的scan操作完成多样的查询,常见的有startRow、endRow、Filter、caching、batch、reversed等,其中scan操作涉及到reverse的几种场景。cloudera官方文档,有对几种场景的详细说明https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/admin_hbase_scanning.html
下边从图文的角度
正确scan场景:不设置startRow、stopRow
错误场景:设置startRow、stopRow,设置Reverse,但未正确使用
3.2、reversed scan
设置startRow、stopRow,正确使用Reversed
同时通过源码阅读,分析scan.next()–>scan.nextRow—>nextInternal()–>isStopRow(),从startRow不断去找stopRow,因此设置reversed就是比较器的方向改变,从startRow另一个方向迭代。
3.3、reversed效率测试
数据样本 | 时间段 | 正序(ms) | 逆序(ms) |
---|---|---|---|
样本数据1 | 1000个点 | 152 | 152 |
样本数据2 | 30720个点 | 1492 | 1964 |
样本数据3 | 30720个点 | 1589 | 2080 |
通过较大数据量的reverse查询,发现逆序比正序的效率低。 |