HBase查询一张表的数据条数的方法

简介: HBase查询一张表的数据条数的方法

HBase查询一张表的数据条数的方法


a53fa7633514475fa766316fab7a2e3e.jpeg


0、写在前面

  • Linux版本:Ubuntu Kylin 16.04
  • Hadoop版本:Hadoop-2.7.2
  • Zookeeper版本:HBase自带
  • HBase版本:HBase-1.1.5
  • Hive版本:Hive-2.1.0


1、HBase-Shell的count命令

hbase(main):017:0> help 'count'Count the number of rows in a table.  Return value is the number of rows.
This operation may take a LONG time (Run '$HADOOP_HOME/bin/hadoop jarhbase.jar rowcount' to run a counting mapreduce job). Current count is shown every 1000 rows by default. Count interval may be optionally specified. Scan caching is enabled on count scans by default. Default cache size is 10 rows.If your rows are small in size, you may want to increase this
parameter. Examples:
 hbase> count 'ns1:t1' hbase> count 't1' hbase> count 't1', INTERVAL => 100000 hbase> count 't1', CACHE => 1000 hbase> count 't1', INTERVAL => 10, CACHE => 1000The same commands also can be run on a table reference. Suppose you had a reference
t to table 't1', the corresponding commands would be:
 hbase> t.count
 hbase> t.count INTERVAL => 100000 hbase> t.count CACHE => 1000 hbase> t.count INTERVAL => 10, CACHE => 1000


可以看到「使用count查询表的数据条数」这个操作可能需要 消耗过长时间 (运行'$HADOOP_HOME/bin/hadoop jar hbase.jar rowcount' 来运行计数 mapReduce 作业)。


默认情况下,当前计数每 1000 行显示一次。可以选择指定计数间隔。默认情况下,对计数扫描启用扫描缓存。默认缓存大小为 10 行。


2、Scan操作获取数据条数

通过Java API的方式,使用 scan 进行全表扫描,循环计数RowCount,速度较慢! 但快于第一种count方式!


基本代码如下:

publicvoidrowCountByScanFilter(Stringtablename){
longrowCount=0;
try {
// 计时StopWatchstopWatch=newStopWatch();
stopWatch.start();
TableNamename=TableName.valueOf(tablename);
// connection为类静态变量Tabletable=connection.getTable(name);
Scanscan=newScan();
// FirstKeyOnlyFilter只会取得每行数据的第一个kv,提高count速度scan.setFilter(newFirstKeyOnlyFilter());
ResultScannerrs=table.getScanner(scan);
for (Resultresult : rs) {
rowCount+=result.size();
        }
stopWatch.stop();
System.out.println("RowCount: "+rowCount);
System.out.println("统计耗时:"+stopWatch.getTotalTimeMillis());
    } catch (Throwablee) {
e.printStackTrace();
    }
}


3、执行Mapreduce任务

zhangsan@node01:/usr/local/hbase-1.1.5/bin$ ./hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘yourtablename’

这种方式效率比第一种要高,调用的HBase jar中自带的统计行数的类。


4、Hive与HBase整合

我们通过建立Hive和HBase关联表的方式,可以直接在Hive中执行sql语句统计出HBase表的行数。


  • 启动hdfs
zhangsan@node01:/usr/local/hadoop-2.7.2/sbin$ ./start-dfs.sh
  • 启动HBase
zhangsan@node01:/usr/local/hbase-1.1.5/bin$ ./start-hbase.sh
zhangsan@node01:/usr/local/hbase/bin$ jps3648 Jps
2737 DataNode
3555 HRegionServer
2948 SecondaryNameNode
3337 HQuorumPeer
2604 NameNode
3436 HMaster



  • 启动hiveserver2服务
zhangsan@node01:/usr/local/hive-2.1.0/bin$ hiveserver2


  • 启动HBase Shell,建表
zhangsan@node01:/usr/local/hbase-1.1.5/bin$ hbase shell
# HBase 建表
create'hbase_hive_test','cf1'


  • hive建立映射表
zhangsan@node01:/usr/local/hive-2.1.0/bin$ hive


hive>createtable hive_hbase_test(key int,value string)>stored by'org.apache.hadoop.hive.hbase.HBaseStorageHandler'>with serdeproperties("hbase.columns.mapping"=":key,cf1:val")>tblproperties("hbase.table.name"="hive_hbase_test");OK
Time taken:8.018 seconds


  • 在HBase中查看是否存在映射表
hbase(main):001:0>  list
TABLEhive_hbase_test                                                         
1 row(s)in0.6800 seconds
=>["hive_hbase_test"]


5、协处理器Coprocessor实现


该方法是目前最快实现「查询一张表的数据条数」的方法


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


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


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


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


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


publicvoidrowCountByCoprocessor(Stringtablename){
try {
//提前创建connection和confAdminadmin=connection.getAdmin();
TableNamename=TableName.valueOf(tablename);
//先disable表,添加协处理器后再enable表admin.disableTable(name);
HTableDescriptordescriptor=admin.getTableDescriptor(name);
StringcoprocessorClass="org.apache.hadoop.hbase.coprocessor.AggregateImplementation";
if (!descriptor.hasCoprocessor(coprocessorClass)) {
descriptor.addCoprocessor(coprocessorClass);
        }
admin.modifyTable(name, descriptor);
admin.enableTable(name);
//计时StopWatchstopWatch=newStopWatch();
stopWatch.start();
Scanscan=newScan();
AggregationClientaggregationClient=newAggregationClient(conf);
System.out.println("RowCount: "+aggregationClient.rowCount(name, newLongColumnInterpreter(), scan));
stopWatch.stop();
System.out.println("统计耗时:"+stopWatch.getTotalTimeMillis());
    } catch (Throwablee) {
e.printStackTrace();
    }
}


## 6、参考资料



相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
存储 分布式数据库 数据库
Django项目中使用Hbase的方法
Django项目中使用Hbase的方法
|
4月前
|
机器学习/深度学习 分布式计算 Hadoop
一种HBase表数据迁移方法的优化
一种HBase表数据迁移方法的优化
50 0
|
6月前
|
SQL 存储 分布式数据库
【通过Hive清洗、处理和计算原始数据,Hive清洗处理后的结果,将存入Hbase,海量数据随机查询场景从HBase查询数据 】
【通过Hive清洗、处理和计算原始数据,Hive清洗处理后的结果,将存入Hbase,海量数据随机查询场景从HBase查询数据 】
|
1月前
|
存储 Java Linux
Linux安装HBase的详细教程及常用方法
Linux安装HBase的详细教程及常用方法
75 1
|
3月前
|
分布式计算 分布式数据库 API
Spark与HBase的集成与数据访问
Spark与HBase的集成与数据访问
|
3月前
|
存储 缓存 分布式数据库
HBase的性能优化有哪些方法?
HBase的性能优化有哪些方法?
60 0
|
3月前
|
分布式数据库 Hbase
HBase的数据删除是如何进行的?
HBase的数据删除是如何进行的?
100 0
|
4月前
|
分布式数据库 Hbase
HBase 清空表数据
HBase 清空表数据
48 0
|
4月前
|
存储 分布式计算 分布式数据库
对给定的数据利用MapReduce编程实现数据的清洗和预处理,编程实现数据存储到HBase数据库,实现数据的增删改查操作接口
对给定的数据利用MapReduce编程实现数据的清洗和预处理,编程实现数据存储到HBase数据库,实现数据的增删改查操作接口
27 0
|
4月前
|
缓存 分布式数据库 API
hbase查询速度很慢
hbase查询速度很慢
195 1