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、参考资料



相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库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
目录
相关文章
|
1月前
|
缓存 监控 Shell
如何使用 HBase Shell 进行数据的实时监控和备份?
如何使用 HBase Shell 进行数据的实时监控和备份?
|
1月前
|
Shell 分布式数据库 Hbase
如何使用 HBase Shell 进行数据的批量导入和导出?
如何使用 HBase Shell 进行数据的批量导入和导出?
|
5月前
|
存储 分布式数据库 数据库
Hbase学习二:Hbase数据特点和架构特点
Hbase学习二:Hbase数据特点和架构特点
92 0
|
5月前
|
缓存 监控 Shell
使用 HBase Shell 进行数据的实时监控和备份
使用 HBase Shell 进行数据的实时监控和备份
|
5月前
|
Shell 分布式数据库 Hbase
使用 HBase Shell 进行数据的批量导入和导出
使用 HBase Shell 进行数据的批量导入和导出
652 6
|
4月前
|
存储 分布式计算 分布式数据库
《HBase MapReduce之旅:我的学习笔记与心得》——跟随我的步伐,一同探索HBase世界,揭开MapReduce的神秘面纱,分享那些挑战与收获,让你在数据的海洋里畅游无阻!
【8月更文挑战第17天】HBase是Apache顶级项目,作为Bigtable的开源版,它是一个非关系型、分布式数据库,具备高可扩展性和性能。结合HDFS存储和MapReduce计算框架,以及Zookeeper协同服务,HBase支持海量数据高效管理。MapReduce通过将任务拆解并在集群上并行执行,极大提升处理速度。学习HBase MapReduce涉及理解其数据模型、编程模型及应用实践,虽然充满挑战,但收获颇丰,对职业发展大有裨益。
55 0
|
5月前
|
存储 Java 分布式数据库
HBase构建图片视频数据的统一存储检索
HBase构建图片视频数据的统一存储检索
|
7月前
|
SQL Java 分布式数据库
实现HBase表和RDB表的转化(附Java源码资源)
该文介绍了如何将数据从RDB转换为HBase表,主要涉及三个来源:RDB Table、Client API和Files。文章重点讲解了RDB到HBase的转换,通过批处理思想,利用RDB接口批量导出数据并转化为`List<Put>`,然后导入HBase。目录结构包括配置文件、RDB接口及实现类、HBase接口及实现类,以及一个通用转换器接口和实现。代码中,`RDBImpl`负责从RDB读取数据并构造`Put`对象,`HBaseImpl`则负责将`Put`写入HBase表。整个过程通过配置文件`transfer.properties`管理HBase和RDB的映射关系。
61 3
实现HBase表和RDB表的转化(附Java源码资源)
|
7月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之使用 Event Time Temporal Join 关联多个 HBase 后,Kafka 数据的某个字段变为 null 是什么原因导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
144 0
|
7月前
|
SQL 消息中间件 Kafka
实时计算 Flink版操作报错合集之使用 Event Time Temporal Join 关联多个 HBase 后,Kafka 数据的某个字段变为 null 是什么原因导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
105 0