本文介绍如何获取 云原生多模数据库 Lindorm宽表的行数大小的方法。
云原生多模数据库 Lindorm 支持获取表的精确行数以及预估行数的多种方法。统计精确行数往往需要扫描全表,而统计预估行数通常是直接从文件层面获取元数据,因此一般情况下,统计预估行数的速度要远快于统计精确行数。
关于 Lindorm 宽表的精确行数和预估行数使用的区分如下所示:
精确行数 | 预估行数 | |
统计方式 | 通常是扫描全表,获取一张表中准确的行数。 | 直接从文件层面获取元数据,因此与真实表大小可能存在出入。 |
统计性能 | 统计耗时长,并发执行时带来的额外负载高。 | 统计耗时短,并发执行时带来的额外负载低。 |
适用场景 | 数据搬迁前后的数据校验等场景。 | 应用页面展示表大小的变化趋势时用于显示表信息的场景。 |
统计宽表精确行数的方法
可通过以下多种方式获取宽表的精确行数,建议结合具体业务场景选择使用:
使用 Lindorm SQL 统计表行数通常情况下比使用 HBase RowCounter 更快,因为 Lindorm 自动将 COUNT 操作分布式并行处理(多线程执行),而 HBase Shell 是单线程统计。但 COUNT 仍需扫描全表,且默认 120 秒超时,超时会报错。对于大表,可通过 SQL 中的 HINT 调大超时时间。Lindorm SQL 处理速度可达每台每秒数十万行,由于COUNT是分布式进行,集群的机器越多越快。
基于 SQL 统计宽表的精确行数
您可使用Lindorm-cli,MySQL命令行或者DMS连接 Lindorm 宽表引擎来统计行数,或者可直接参考基于SQL的应用开发在您的业务代码中直接执行 SQL 来使您的业务应用在运行时获取宽表的行数。
比如:可执行以下 SQL,统计表 table_name 的行数,且设置该语句的执行超时时间为 5 分钟。
SELECT /*+ _l_operation_timeout(300000)_ */ COUNT(*) FROM table_name;执行结果如下:
+--------+
| EXPR$0 |
+--------+
| 160000 |
+--------+精确统计表的行数需要扫描全表,请慎重操作,如果数据量超过百万,建议如下:
使用搜索索引加速:通过搜索索引查询宽表数据。
在语句中添加
_l_operation_timeout这个 HINT 调大语句超时时间:HINT。
如SELECT /*+ _l_operation_timeout(600000)_ */ COUNT(*) FROM table。
基于 HBase Shell 统计宽表的精确行数
首先,通过HBase Shell连接Lindorm宽表引擎,具体操作请参见通过Lindorm Shell访问宽表引擎。
使用COUNT命令(常用方法)
通过HBase Shell工具使用COUNT命令可以精确地统计HBase表行数。执行COUNT命令的原理是将表的数据分批次全部扫描出来进行统计,所以建议在相同内网的ECS客户端上执行COUNT命令。如果通过公网执行COUNT命令,网络使用率会较大,导致统计效率降低。根据表结构的不同,扫描的速度会有所差别,使用COUNT命令扫描全表的速度可以小于10万行每秒。执行以下语句统计table表的总行数。
count 'table_name'执行结果如下:
使用 HBase RowCounter 插件加速
在 HBase Shell 中使用 count 命令,固然可以获取宽表的精确行数,但是当表很大时,这个速度会很慢。RowCounter插件会在本地启动一个伪分布式的MR任务来进行COUNT操作。默认情况下这种方式是按照单个线程来执行的,统计速率与HBase Shell执行COUNT命令的统计速率差不多。如果您想提高统计速度,可以通过指定Dmapreduce.local.map.tasks.maximum=线程数来进行多线程并发执行,需要注意以下两点:
线程数小于等于表Region的个数。
线程数增多可能造成集群负载过高从而影响线上业务,请根据业务需求设置。
比如,在HBase Shell中执行下述命令来使用 RowCounter 插件统计Lindorm宽表的行数。
在HBase Shell中执行以下代码统计Lindorm宽表的行数。
使用 RowCounter 插件统计目标表table的总行数。
./alihbase-2.0.18/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter "table_name"使用 RowCounter 插件以 16个线程并发统计表 table 的总行数。
./alihbase-2.0.18/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter -Dmapreduce.local.map.tasks.maximum=16 "table_name"使用 RowCounter 插件统计NameSpace为ns中的目标表table的总行数。
./alihbase-2.0.18/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter "ns:table_name"RowCounter 插件执行后的统计结果都保存在Log目录中的hbase.log文件,如下所示 
统计宽表预估行数的方法
可通过以下多种方式获取宽表的预估行数:
基于 SQL 获取宽表的预估行数
与统计精确行数时使用SELECT语句不同,获取预估行数需要通过以下SHOW语句来获取:
要求宽表引擎版本为2.8.2.6及以上,Lindorm SQL版本为2.9.3.6及以上。
SHOW ESTIMATED ROWS FROM table_name;执行结果如下:
+---------------------+
| ESTIMATED_ROW_COUNT |
+---------------------+
| 15000 |
+---------------------+通过集群管理系统查看表的预估行数
请先登录集群管理系统。
Lindorm集群管理系统中,在概览页面可以粗略查看表行数。该估计值是通过将数据文件的行数元信息累加计算出来的。如果用户存在更新,删除等操作,同一行数据可能分布在多个文件当中。同时,文件的行数元信息是在生成文件时统计的,如果用户使用了TTL功能,文件中的部分数据可能已经过期了,从而导致该信息不准。因此,该值仅仅只是一个估计值。但如果用户的表没有更新,没有删除和TTL过期,显示的行数是完全准确的,可以在历史数据迁移完成时用于估计数据完整性。
Lindorm集群管理系统中,单击左侧导航栏概览,在当前idc区域下,找到目标表,在预估行列中单击查看,查看目标表的粗略行数。
如果表中有数据但预估行数显示为0,则说明当前Lindorm宽表引擎小版本过低,请升级Lindorm宽表引擎小版本。如何升级,请参见升级小版本。