分布式数据库HBase本身不支持SQL语法,要统计表的行数,只能通过其他的方式来实现。HBase的shell脚本提供了count命令,但该命令只是简单地scan全表然后将行数累加,效率很低只能用于测试或者统计小表了。另一解决方案是使用MapReduce,HBase自身提供了org.apache.hadoop.hbase.mapreduce.RowCounter类,可以方便地在命令行调用进行统计,但执行效率仍难以达到我们的需求。HBase 0.92引入了Coprocessor这项特性,可以很方便地在RegionServer端实现各类聚集操作,通过AggregationClient#rowCount这个接口就可以相对高效地统计表的行数了。
Coprocessor提供了Observer和Endpoint两项特性,前者允许通过重写函数在RegionServer端注入用户代码,后者则相当于数据库中的触发器(详细介绍参考Reference[1])。社区依此为聚集操作提供了AggregateProtocol接口和AggregateImplement实现,我们使用AggregationClient就可以并发对每个region进行rowCount等操作,同时设置了FirstKeyOnlyFilter以提高执行效率,然后将结果返回client端进行累加,与直接scan全表相比极大提高了统计的并行度,配置HBase使用Coprocessor可以参考Reference[2]。
当然,我们在实际统计过程中也遇到了不少的问题,首先就是跑Coprocessor消耗了太多系统资源。如果全速跑的话,每个region线程都可能把100%的CPU利用率耗完,当一台RegionServer有多个region时对其他服务的影响就更大了,这对在线业务可是不能接受的。我们的解决方案是选择在凌晨低峰期跑,而且优先选择离线集群和备集群,于是我们实现了CoprocessorRowcounter这样一个工具,在给定的时间内调用统计函数并将结果输出到本地或HBase数据库中,代码已经反馈到社区了(请参考Reference[3])。但实际上如果不限制并行scan的region数和访问的qps,这个程序还是有可能把RegionServer跑垮,于是我们改进了AggregationClient的线程池,允许用户指定最大的并发数,同时加入对qps的限制,保证对服务端不会有过于频繁的访问。还有一个微小的改进,就是对划分出来的region key数组进行shuffle,然后将数组依次放入线程池中,这样尽可能保证了scan的压力可以均分到每台RegionServer上。开发时还发现rowCount必须指定colum family,于是找到相应的issue并backport到0.94(详见Reference[4]),问题解决同时反馈到社区了。
CoprocessorRowcounter已经在实践中统计了我们大部分表的行数,正确性也经过了验证,存在的问题主要是资源占用率过高,不宜用于在线集群。其次效率仍需提高,即使能够对region进行并发操作,大表的统计仍需要分钟级甚至是小时级的耗时。实践也发现每次rpc调用时间都比正常操作长很多,所以务必将hbase.rpc.timeout设置为Integer.MAX_VALUE,才能保证程序不会因为rpc超时而退出。
Reference:
[1]Coprocessor Introduction http://blogs.apache.org/hbase/entry/coprocessor_introduction
[2]HBase Aggregation Example http://michaelmorello.blogspot.jp/2012/01/row-count-hbase-aggregation-example.html
[3]CoprocessorRowcounter Issue https://issues.apache.org/jira/browse/HBASE-9800
[4]Backport HBASE-9605 https://issues.apache.org/jira/browse/HBASE-9830
相关推荐
例如,使用HBaseshell创建表时,首先确定列族,然后可以插入数据,查询数据,进行数据的扫描和删除,表结构的修改,行数统计,以及表的启用、禁用和删除等操作。 在Java操作HBase方面,涉及到连接原理和配置、创建...
Hbase应用开发实验报告及代码;(1) 列出HBase所有的表的相关信息,...(4) 清空指定的表的所有记录数据(5) 统计表的行数。2. 现有以下关系型数据库中的表和数据,要求将其转换为适合于HBase存储的表并插入数据:
5. **统计表的行数**:使用`count 'tableName'`命令,可以得到表的行数。 此外,实验还涉及将关系型数据库数据转换为适合HBase存储的格式: 1. **学生表(Student)**、**课程表(Course)**和**选课表(SC)**是关系型...
- rowcounter:统计HBase表中的行数。 - verifyrep:比较两个不同集群中表的数据,用于数据验证。 在使用HBase时,合理地设计Rowkey、配置列族属性、理解数据操作命令、表属性以及数据导入导出操作,对于构建高效的...
### HBase Shell 常用命令详解 #### 一、HBase Shell 概述 HBase Shell 是一个基于命令行的工具,用于与HBase进行交互。它提供了一系列丰富的命令来执行基本的数据管理任务,例如创建表、插入数据、查询数据等。...
据统计,截止到目前为止,HBase项目的代码行数已超过100万行,有76位Committer和42位PMC成员,共有328位贡献者参与其中。 #### HBase 2.0版本发布历程 HBase 2.0版本自分支创建以来,经过长时间的开发与测试,最终...
- 统计`member`表中的行数。 ```sql count 'member' ``` - **删除行或列** - 删除`member`表中指定行或列的数据。 ```sql delete 'member','wanglei','info:age' ``` ### Hive 常用命令总结 #### 创建外部...
除此之外,HBase Shell还支持查询特定行或列的数据,更新指定字段(通过新的`put`命令覆盖旧数据),查看表结构,统计表数据行数,以及删除数据等操作。例如,删除表(`disable '表名'; drop '表名';`),获取单行...
Endpoint使得用户可以实现自定义的RPC服务,例如统计表的行数。Endpoint的实现涉及protobuf文件的定义,Java类的生成以及服务接口的实现。 Coprocessor 实现: Observer的实现通常涉及到对特定操作(如preGetOp、...
- **Row Counter Example**(行计数示例):通过MapReduce统计表中的行数。 - **Map-Task Splitting**(Map任务分割):根据HBase的特性进行Map任务的优化分割。 - **HBase MapReduce Examples**(HBase MapReduce...
2. **数据过滤**:当HBase在RegionServer上遍历数据行时,PageFilter会记录已返回的行数。一旦达到预设的limit,PageFilter就会阻止更多的行被返回,从而实现分页。 3. **获取总条目数**:PageFilter并不直接提供总...
5. 统计表的行数:HBase不直接提供统计行数的命令,通常需要通过扫描表并计数来实现。 三、HBase数据模型与转换 1. 将关系型数据库数据转换为HBase:HBase的数据模型基于行、列族和列。学生表、课程表和选课表可以...
5. **统计表的行数**:通过`HTable`的`getScanner()`方法创建扫描器,然后使用迭代器计算行数。 接下来,我们需要将关系型数据库的数据转换为适合HBase的格式。例如,对于学生表、课程表和选课表,我们可以创建三个...
- **实用性**:两者都需启动MapReduce作业,可能占用资源,但提供了行数统计。 - **影响**:3星,适合定期统计,但HBase shell中的`count`命令效率较低。 4. **Clean工具** - **功能**:彻底清除HBase在...
RowCounter和CellCounter工具用于统计HBase表中的行数和单元格数。这些信息对于容量规划和性能调优非常有帮助。 ##### 1.1.10 hbaseclean工具 hbaseclean工具用于清理不再使用的数据文件,释放磁盘空间。这对于维护...
- **计数操作**:使用`count 'tablename'`命令统计表中的行数。 - **扫描操作**:使用`scan 'tablename'`命令遍历表中的所有行。 - **过滤器**:通过`filter`选项指定过滤条件来筛选数据。 #### 八、HBase Java API...
- **统计行数**:虽然HBase不直接提供行数统计功能,但可以通过扫描全表并计数来实现。 6. **实验步骤**: 实验者创建了三个表——`Student`、`Course`和`SC`,并进行了数据插入操作。这些操作模拟了在教育场景中...
5. **统计表的行数**:HBase原生命令并不直接提供行数统计,通常需要通过MapReduce任务或者第三方工具来计算。 实验实例: 实验中创建了三个表,分别是`Student`、`Course`和`SC`,并进行了数据插入。`Student`表...
实验的主要内容是实现指定的功能,包括列出HBase所有表的相关信息、在终端打印出指定表的所有记录数据、向已经创建好的表添加和删除指定的列族或列、清空指定表的所有记录数据和统计表的行数。 知识点一:HBase的...