HBase 统计表中数据量

启动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();
    }
}

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值