HBase_HBase表行数统计实战
一、HBase统计表行数的常见四种方法
1.hbase-shell的count命令
这是最简单直接的操作,但是执行效率非常低,适用于百万级以下的小表RowCount统计。本质就是scan,扫描3000w行数据耗时达到130min。
2.java代码请求带过滤器的scan接口
这是通过在scan中添加FirstKeyOnlyFilter类型的过滤器来实现的,本质就是每一行数据只扫描第一列,相比于第一种方法有两个优点:
1.自行编写扫表java代码工具,可以自定义一些想要扫描的rowkey范围、时间戳范围、指定列,较为灵活;
2.扫描传输数据量成倍减少,花费时间成倍减少。
扫描3000w行数据使用45min。
3.利用hbase.RowCounter包执行MR任务
RowCounter也就是 HBase 中的 org.apache.hadoop.hbase.mapreduce.RowCounter 这个类,这个类使用了MapReduce框架来实现并行计算表中的行数。
通过 $HBASE_HOME/bin/hbase 命令即可执行:
1 | [root@cdh1 ~]# hbase org.apache.hadoop.hbase.mapreduce.RowCounter tableName |
本质就是启动一个mapreduce任务分布式读取全表数据,map中就是一个简单的计数器,reduce就是将map输出结果进行累加。如果想要实现一些特殊的过滤计数,也可以自己实现一个类似的mapreduce任务,在map中添加相应的过滤逻辑。
这种MR的方式进行计数优点是非常快,扫描3000w行数据只需要100s;缺点是需要部署hadoop集群和mapreduce引擎,且任务执行时对线上表压力较大。
4.利用hbase协处理器
Coprocessor协处理器的本质就是利用分布式运算,减少客户端与服务器之前的数据传输。
HBase提供的org.apache.hadoop.hbase.coprocessor.AggregateImplementation协处理器中提供了一些基本简单运算接口,比如其中的rowCount()方法就是在每个rs上分别计算行数,然后将每个节点上的行数返回客户端累加即可得到总行数。
这种协处理器计数速度最快,扫描3000w行数据只需要23s;缺点是安装协处理器时,需要先将目标表置为disable状态,如果是线上表会影响查询,需要在建表时就装上,或者通过主备切换轮流安装。
参考文献:HBase统计表行数的四种方法
二、使用MR与过滤器scan实战
HBase封装好了一些通过MR扫描全表或者快照表的方法(Scan读取Hbase表与Hbase表快照),如使用TableMapReduceUtil.initTableMapperJob(),可以直接利用该方法结合scan,进行分布式scan。
1 | package ads.filter; |
三、使用协处理器实战
要将hbase表置于disable需要ddl权限,所以一般不会把协处理器的安装与使用放在一起,所以如下实战代码不能用于线上。
1 | package ads.coprocessor; |