背景:
对于其他数据存储系统来说,统计表的行数是再基本不过的操作了,一般实现都非常简单;但对于HBase这种key-value存储结构的列式数据库,统计 RowCount 的方法却有好几种不同的花样,并且执行效率差别巨大!下面来研究下吧~


测试集群:HBase1.2.0 - CDH5.13.0 四台服务器

注:以下4种方法效率依次提高


一、hbase-shell的count命令

这是最简单直接的操作,但是执行效率非常低,适用于百万级以下的小表RowCount统计!

 hbase> count 'ns1:t1'hbase> count 't1'hbase> count 't1', INTERVAL => 100000hbase> count 't1', CACHE => 1000hbase> count 't1', INTERVAL => 10, CACHE => 1000

此操作可能需要很长时间,来运行计数MapReduce作业。默认情况下每1000行显示当前计数,计数间隔可自行指定。

默认情况下在计数扫描上启用缓存,默认缓存大小为10行。

行数为 3000W 的表测试结果:

hbase(main):001:0> count 'sda_crm_calls20180102'


默认INTERVAL为1000行时花了80分钟。。

hbase(main):001:0> count 'sda_crm_calls20180102', INTERVAL => 1000000

INTERVAL为1000000行时花了130分钟。。


二、scan方式设置过滤器循环计数(JAVA实现)

这种方式是通过添加 FirstKeyOnlyFilter 过滤器的scan进行全表扫描,循环计数RowCount,速度较慢! 但快于第一种count方式!

基本代码如下:

public void rowCountByScanFilter(String tablename){long rowCount = 0;try {//计时StopWatch stopWatch = new StopWatch();stopWatch.start();TableName name=TableName.valueOf(tablename);//connection为类静态变量Table table = connection.getTable(name);Scan scan = new Scan();//FirstKeyOnlyFilter只会取得每行数据的第一个kv,提高count速度scan.setFilter(new FirstKeyOnlyFilter());ResultScanner rs = table.getScanner(scan);for (Result result : rs) {rowCount += result.size();}stopWatch.stop();System.out.println("RowCount: " + rowCount);System.out.println("统计耗时:" +stopWatch.getTotalTimeMillis());} catch (Throwable e) {e.printStackTrace();}
}

耗时45分钟!


三、利用hbase.RowCounter包执行MR任务

这种方式效率非常高!利用了hbase jar中自带的统计行数的工具类!

通过 $HBASE_HOME/bin/hbase 命令执行:

[root@cdh1 ~]# hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'sda_crm_calls20180102'


耗时1m40s,速度较上面两种有了质的飞跃!


四、利用HBase协处理器Coprocessor(JAVA实现)

这是我目前发现效率最高的RowCount统计方式,利用了HBase高级特性:协处理器

我们往往使用过滤器来减少服务器端通过网络返回到客户端的数据量。但HBase中还有一些特性让用户甚至可以把一部分计算也移动到数据的存放端,那就是协处理器 (coprocessor)。

协处理器简介:

(节选自《HBase权威指南》)

使用客户端API,配合筛选机制,例如,使用过滤器或限制列族的范围,都可以控制被返回到客户端的数据量。如果可以更进一步优化会更好,例如,数据的处理流程直接放到服务器端执行,然后仅返回一个小的处理结果集。这类似于一个小型的MapReduce框架,该框架将工作分发到整个集群。

协处理器 允许用户在region服务器上运行自己的代码,更准确地说是允许用户执行region级的操作,并且可以使用与RDBMS中触发器(trigger)类似的功能。在客户端,用户不用关心操作具体在哪里执行,HBase的分布式框架会帮助用户把这些工作变得透明。

实现代码:

public void rowCountByCoprocessor(String tablename){try {//提前创建connection和confAdmin 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();}
}


发现只花了 23秒 就统计完成!

为什么利用协处理器后速度会如此之快?

Table注册了Coprocessor之后,在执行AggregationClient的时候,会将RowCount分散到Table的每一个Region上,Region内RowCount的计算,是通过RPC执行调用接口,由Region对应的RegionServer执行InternalScanner进行的。

因此,性能的提升有两点原因:

1.分布式统计。将原来客户端按照Rowkey的范围单点进行扫描,然后统计的方式,换成了由所有Region所在RegionServer同时计算的过程。

2.使用了在RegionServer内部执行使用了InternalScanner。这是距离实际存储最近的Scanner接口,存取更加快捷。

HBase统计表行数(RowCount)的四种方法相关推荐

  1. 统计内表行数常用的三种方法

    以下是统计内表行数常用的三种方法, 如下:   1.LOOP AT it_itab.    g_lines2 = g_lines2 + 1.    ENDLOOP.    该方法是通过循环内部表自己累 ...

  2. excel多列多行堆叠成多列一行_「Excel技巧」Excel快速实现将一行转为多行多列的四种方法...

    今天来说说在Excel中,将表格里的一列转换为多行多列的几种方法. 例如,以下表格,是一个行业分类表,都放在同一列中.现我们准备把它转为多列. 表格里数据除掉标题行行,总共有60列数据,干脆我们就给它 ...

  3. 多行文字垂直居中实现--四种方法

    1. 将父元素设置为块级表格来显示display:table;子元素设置为表格单元格 来显示,设置vertical-align: middle. <div style="margin: ...

  4. Java实现回文数四种方法

    干货分享 | 打印回文数的四种方法!! 本文提供了四种方法来打印回文数,大家可以根据题目的要求(如:时间复杂度.运行时间.内存等限制条件)来选取合适的方法.如果题目要求打印的回文数较大,我们可以选择将 ...

  5. (转).NET导出Excel的四种方法及评测

    .NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspo ...

  6. mysql 统计条目_mysql 统计表中条目数量的几种方法

    mysql 统计表中条目数量的几种方法 展开 通常的方法是: select count(*) from `table_name` select count(1) from `table_name` s ...

  7. 【Java】数组拷贝的四种方法

    四种方法 System.arraycopy() 这是一个native的方法,也是对大数组最高效的方法. Arrays.copyOf() 源码如下: public static <T> T[ ...

  8. 单一修改高程值lisp_浅谈AutoCAD中修改高程的四种方法

    浅谈 AutoCAD 中修改高程的四种方法 摘 要: 在使用 AutoCAD 进行数字化成图工作中,经常遇到线划的标高不为零,及高程点的值与实地不符,需要对其进行修改等情况,结合实 际工作经验,简单介 ...

  9. java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此 ...

最新文章

  1. Pycharm那些隐藏的实用小技巧,yyds!
  2. Python--day28--set去重
  3. 「交互式梦境」首次被验证:睡着后,还能回答数学问题
  4. elasticsearch不能使用root启动问题解决
  5. 汉克尔变换matlab,HankelTransform
  6. java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化
  7. 深度学习笔记(1) 深度学习简介
  8. 异步fifo_FIFO工作的原理
  9. 100个常用的Linux命令
  10. linux中probe函数中传递的参数来源
  11. 基于SSM的酒店客房预订管理系统
  12. 谈谈你对Spring 事务的理解
  13. AndroidStudio 自带avd模拟器WiFi网络受限无法连接
  14. centos+mono+nginx+jexus 搭建linux下c#运行环境测试
  15. 4G商用:看不见的“网”,看得见的改变
  16. 计算机毕业设计php旅游网站的设计与实现
  17. 程序员怒怼外包公司HR:1万块钱还想招C语言开发,简直石乐志!
  18. HIFI音箱中最常用的七种音箱摆位方法
  19. python实训三 编写函数,接收一个字符串,分别统计大写字母,小写字母,数字,其他字符的个数,并以元组的形式返回结果
  20. Nero刻录ISO文件的过程步骤详解

热门文章

  1. tensorRT 7 8+ DEB安装教程
  2. 变电站通信网络和系统协议IEC61850介绍
  3. c语言专业自我评价,简历自我评价it
  4. 六级备考24天|CET-6|翻译技巧3|翻译红楼梦|22:40~23:40
  5. 通用文件模型及VFS-VFS结构
  6. 炉石传说 服务器 维护,《炉石传说》出现严重运营事故,维护近40小时,数据将回档至14日...
  7. 纺织助剂能够提效降本,市场需求前景广阔
  8. 和腾讯工作十几年的资深测试工程师讨论今年校招标准。
  9. 张颖:给创业者的几点建议
  10. 数独游戏题解.(DFS)