启动hbase shell
进去hbase客户端所在服务器,cd hbase客户端路径
cd /usr/local/services/hbase/alihbase-2.0.0
启动hbase shell
./bin/hbase shell
找到要统计的表名
hbase(main):001:0> list
假设表名为 'foo'
执行RowCounter
首先退出Hbase shell
hbase(main):002:0> exit
执行RowCounter
[root@iZbp11w36qswr2zr3n7aymZ alihbase-2.0.0]# ./bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'foo'
因为RowCounter执行原理实际为执行MapReduce,如果表中数据量较大,需要等待较长时间,一般统计结果会打印在控制台中,我们使用alihbase 客户端2.0实际打印到的hbase.log文件中,因为执行时间略长,不能一直等着控制台输出,可以喝杯coffee,再回来看统计结果。
查看结果
进入log路径,默认在hbase客户端的所在路径下logs中,在统计任务启动至查看日志任务编号
日志中会打印:Submitting tokens for job: job_local518921693_0001
其中 job_local518921693_0001 就是任务编号,后续可以根据此编号查看统计结果
[root@iZbp11w36qswr2zr3n7aymZ alihbase-2.0.0]# cd logs/
[root@iZbp11w36qswr2zr3n7aymZ logs]# ls
hbase.log
[root@iZbp11w36qswr2zr3n7aymZ logs]#
统计内容如下:
2019-04-02 17:23:05,056 INFO [main] mapreduce.Job: map 100% reduce 0%
2019-04-02 17:23:05,057 INFO [main] mapreduce.Job: Job job_local512717422_0001 completed successfully
2019-04-02 17:23:05,085 INFO [main] mapreduce.Job: Counters: 29
File System Counters
FILE: Number of bytes read=443041682
FILE: Number of bytes written=450744300
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
Map-Reduce Framework
Map input records=35468113
Map output records=0
Input split bytes=3260
Spilled Records=0
Failed Shuffles=0
Merged Map outputs=0
GC time elapsed (ms)=560
Total committed heap usage (bytes)=6106644480
HBase Counters
BYTES_IN_REMOTE_RESULTS=2332960233
BYTES_IN_RESULTS=2332960233
MILLIS_BETWEEN_NEXTS=202221
NOT_SERVING_REGION_EXCEPTION=0
NUM_SCANNER_RESTARTS=0
NUM_SCAN_RESULTS_STALE=0
REGIONS_SCANNED=12
REMOTE_RPC_CALLS=6187
REMOTE_RPC_RETRIES=0
ROWS_FILTERED=6175
ROWS_SCANNED=35468113
RPC_CALLS=6187
RPC_RETRIES=0
org.apache.hadoop.hbase.mapreduce.RowCounter$RowCounterMapper$Counters
ROWS=35468113
File Input Format Counters
Bytes Read=0
File Output Format Counters
Bytes Written=0
统计结果为 ROWS=35468113 ,foo表中有 35468113 条记录。
高阶统计方案-协处理器
这是我目前发现效率最高的RowCount统计方式,利用了HBase高级特性:协处理器!
我们往往使用过滤器来减少服务器端通过网络返回到客户端的数据量。但HBase中还有一些特性让用户甚至可以把一部分计算也移动到数据的存放端,那就是协处理器 (coprocessor)。
协处理器简介:
(节选自《HBase权威指南》)
使用客户端API,配合筛选机制,例如,使用过滤器或限制列族的范围,都可以控制被返回到客户端的数据量。如果可以更进一步优化会更好,例如,数据的处理流程直接放到服务器端执行,然后仅返回一个小的处理结果集。这类似于一个小型的MapReduce框架,该框架将工作分发到整个集群。
协处理器 允许用户在region服务器上运行自己的代码,更准确地说是允许用户执行region级的操作,并且可以使用与RDBMS中触发器(trigger)类似的功能。在客户端,用户不用关心操作具体在哪里执行,HBase的分布式框架会帮助用户把这些工作变得透明。
java代码如下:
public void rowCountByCoprocessor(String tablename){
try {
//提前创建connection和conf
Admin admin = connection.getAdmin();
TableName name=TableName.valueOf(tablename);
//先disable表,添加协处理器后再enable表
admin.disableTable(name);
HTableDescriptor descriptor = admin.getTableDescriptor(name);
String coprocessorClass = "org.apache.hadoop.hbase.coprocessor.AggregateImplementation";
if (! descriptor.hasCoprocessor(coprocessorClass)) {
descriptor.addCoprocessor(coprocessorClass);
}
admin.modifyTable(name, descriptor);
admin.enableTable(name);
//计时
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Scan scan = new Scan();
AggregationClient aggregationClient = new AggregationClient(conf);
System.out.println("RowCount: " + aggregationClient.rowCount(name, new LongColumnInterpreter(), scan));
stopWatch.stop();
System.out.println("统计耗时:" +stopWatch.getTotalTimeMillis());
} catch (Throwable e) {
e.printStackTrace();
}
}