HBase统计表行数(RowCount)的四种方法

背景:
对于其他数据存储系统来说,统计表的行数是再基本不过的操作了,一般实现都非常简单;但对于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接口,存取更加快捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/351662.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

2023年测试人前景归途?我主攻自动化测试拿到了25k的offer...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

sqlserver 中 @@rowcount的简单用法

返回受上一语句影响的行数。如果行数大于 20 亿,请使用 ROWCOUNT_BIG。 语法 ROWCOUNT 返回类型 int 注释 Transact-SQL 语句可以通过下列方式设置 ROWCOUNT 的值: 将 ROWCOUNT 设置为 受影响或被读取的行的数目。可以将行发送到客户端,…

SQL中row_number函数用法

row_number函数用法 1、函数讲解2、LeetCode实战 1、函数讲解 语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)简单的说,row_number()从1开始,为每条分组记录返回一个数字,举例: ROW_NUMBER() OVER(OR…

Hbase进行RowCount统计

对于Table内RowKey个数的统计,一直是HBase系统面临的一项重要工作,目前有三种执行该操作的方式。 测试环境: Apache版的 hadoop-2.6.0 (cdh版的hadoop-2.6.0-cdh5.5.2也可以) Apache版的 hbase-1.0.0 (一…

【完整版】2023二级建造师《建筑实务》真题答案解析(2天考3科)

2023二级建造师考试将在6月3日、4日举行,2023二建《市政实务》考试时间(2天考3科):6月4日 9:00-12:00, 考后甘建二将及时发布2023年二建市政实务真题及答案解析,敬请关注 2天考3科地区:四川、山…

DMBOK知识梳理for CDGA/CDGP——第三章数据治理

关 注gzh“大数据食铁兽” 回复“知识点”获取《DMBOK知识梳理for CDGA/CDGP》常考知识点(第三章数据治理) 第三章 数据治理 第三章在是CDGA|CDGP考试的重点考核章节之一,知识点比较密集,本章重点为语境关系图及数据治理概念…

LiangGaRy-学习笔记-Day19

1、回顾知识 1.1、文件系统说明 xfs与ext4文件系统 CentOS7以上:默认的就是XFS文件系统 xfs 使用的就是restore、dump等工具 CentOS6默认的就是ext4文件系统 extundelete工具就是用于ext4系统 1.2、回顾Linux文件系统 Linux文件系统是由三个部分组成 inode文…

一文学会MySQL四种安装方式

目录 🍁rpm方式安装 🍀下载软件包 🍀前置配置 🍀安装MySQL 🍁yum方式安装 🍀下载软件包 🍀安装MySQL 🍁二进制方式安装 🍀下载软件包 🍀安装MySQL &#x1f3…

2023最新网络安全面试题大全,看完这篇你的秋招offer就到手了!

前言 随着国家政策的扶持,网络安全行业也越来越为大众所熟知,想要进入到网络安全行业的人也越来越多。 为了拿到心仪的 Offer 之外,除了学好网络安全知识以外,还要应对好企业的面试。 作为一个安全老鸟,工作这么多年…

【自定义CPU占用率】

题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况: 1. CPU的占用率固定在50%,为一条直线&…

控制cpu占有率

http://www.cnblogs.com/Ripper-Y/archive/2012/05/19/2508511.html CPU正弦曲线 1 #include <iostream>2 #include <cmath>3 #include <ctime>4 #include <windows.h>5 6 using namespace std;7 8 //得到循环0xFFFFFFFF次用的秒数9 unsigned int te…

CPU正弦曲线

CPU正弦曲线 1 #include <iostream>2 #include <cmath>3 #include <ctime>4 #include <windows.h>5 6 using namespace std;7 8 //得到循环0xFFFFFFFF次用的秒数9 unsigned int test() 10 { 11 unsigned int c 0xFFFFFFFF; 12 13 time_t t1…

(1.5.1.1)编程之美:让CPU占用率曲线听你指挥

题目&#xff1a;写一个程序&#xff0c;让用户来决定Windows任务管理器&#xff08;Task Manager&#xff09;的CPU占用率。程序越精简越好&#xff0c;计算机语言不限。例如&#xff0c;可以实现下面三种情况&#xff1a; 1. CPU的占用率固定在50%&#xff0c;为一条直线&…

让CPU占用率曲线听你指挥

由于网上已经有很多有关此问题的博客&#xff0c;本文参考了http://blog.csdn.net/wesweeky/article/details/6402564 题目&#xff1a;写一个程序&#xff0c;让用户来决定Windows任务管理器&#xff08;Task Manager&#xff09;的CPU占用率。程序越精简越好&#xff0c;计…

现代计算机理论基础是什么_为什么旧游戏在现代计算机上运行得太快?

现代计算机理论基础是什么 If you’ve ever tried to get a vintage computer game up and running on a modern system, you’ve likely been shocked at how fast the game ran. Why do old games run out of control on modern hardware? 如果您曾经尝试过在现代系统上启动…

《编程之美》读书笔记23: 1.1 让CPU占用率曲线听你指挥

题目&#xff1a;写一个程序&#xff0c;让用户来决定Windows任务管理器&#xff08;Task Manager&#xff09;的CPU占用率。程序越精简越好&#xff0c;计算机语言不限。例如&#xff0c;可以实现下面三种情况&#xff1a; 1. CPU的占用率固定在50%&#xff0c;为一条直线&…

编程之美:让CPU占用率曲线听你指挥

题目&#xff1a;写一个程序&#xff0c;让用户来决定Windows任务管理器&#xff08;Task Manager&#xff09;的CPU占用率。程序越精简越好&#xff0c;计算机语言不限。例如&#xff0c;可以实现下面三种情况&#xff1a; 1. CPU的占用率固定在50%&#xff0c;为一条直线…

Python+Pytest+Allure+Git+Jenkins数据驱动接口自动化测试框架

一、接口基础   接口测试是对系统和组件之间的接口进行测试&#xff0c;主要是效验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP&#xff0c;RPC&#xff0c;Webservice&#xff0c;Dubbo&#xff0c;RESTful等类型。 …

【Mysql数据库从0到1】-入门基础篇--sql语句简单使用

【Mysql数据库从0到1】-入门基础篇--sql语句简单使用 &#x1f53b;一、数据库创建、删除、选择1.1 &#x1f343; create database 创建数据库1.2 &#x1f343; 使用 mysqladmin 创建数据库1.3 &#x1f343; drop 命令删除数据库--一般不建议在数据库执行delete、drop等命令…

火狐浏览器下载网页视频

1、打开火狐浏览器菜单栏&#xff0c;点击“附件组件”&#xff1a; 2、在搜素框内输入“VideoGrab” 回车。 3、点击搜索结果&#xff1a; 4、点击添加&#xff0c;我这里已经添加&#xff0c;所以显示的是可“移除”&#xff1b;