如何统计表行数

更新时间:
复制为 MD 格式

本文介绍如何获取 云原生多模数据库 Lindorm宽表的行数大小的方法。

云原生多模数据库 Lindorm 支持获取表的精确行数以及预估行数的多种方法。统计精确行数往往需要扫描全表,而统计预估行数通常是直接从文件层面获取元数据,因此一般情况下,统计预估行数的速度要远快于统计精确行数。

关于 Lindorm 宽表的精确行数和预估行数使用的区分如下所示:

精确行数

预估行数

统计方式

通常是扫描全表,获取一张表中准确的行数。

直接从文件层面获取元数据,因此与真实表大小可能存在出入。

统计性能

统计耗时长,并发执行时带来的额外负载高。

统计耗时短,并发执行时带来的额外负载低。

适用场景

数据搬迁前后的数据校验等场景。

应用页面展示表大小的变化趋势时用于显示表信息的场景。

统计宽表精确行数的方法

可通过以下多种方式获取宽表的精确行数,建议结合具体业务场景选择使用:

说明

使用 Lindorm SQL 统计表行数通常情况下比使用 HBase RowCounter 更快,因为 Lindorm 自动将 COUNT 操作分布式并行处理(多线程执行),而 HBase Shell 是单线程统计。但 COUNT 仍需扫描全表,且默认 120 秒超时,超时会报错。对于大表,可通过 SQL 中的 HINT 调大超时时间。Lindorm SQL 处理速度可达每台每秒数十万行,由于COUNT是分布式进行,集群的机器越多越快。

基于 SQL 统计宽表的精确行数

您可使用Lindorm-cliMySQL命令行或者DMS连接 Lindorm 宽表引擎来统计行数,或者可直接参考基于SQL的应用开发在您的业务代码中直接执行 SQL 来使您的业务应用在运行时获取宽表的行数。

比如:可执行以下 SQL,统计表 table_name 的行数,且设置该语句的执行超时时间为 5 分钟。

SELECT /*+ _l_operation_timeout(300000)_ */ COUNT(*) FROM table_name;

执行结果如下:

+--------+
| EXPR$0 |
+--------+
| 160000 |
+--------+
重要

精确统计表的行数需要扫描全表,请慎重操作,如果数据量超过百万,建议如下:

  1. 使用搜索索引加速:通过搜索索引查询宽表数据

  2. 在语句中添加 _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 插件统计NameSpacens中的目标表table的总行数。

./alihbase-2.0.18/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter  "ns:table_name"

RowCounter 插件执行后的统计结果都保存在Log目录中的hbase.log文件,如下所示 image

统计宽表预估行数的方法

可通过以下多种方式获取宽表的预估行数:

基于 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区域下,找到目标表,在预估行列中单击查看,查看目标表的粗略行数。image

说明

如果表中有数据但预估行数显示为0,则说明当前Lindorm宽表引擎小版本过低,请升级Lindorm宽表引擎小版本。如何升级,请参见升级小版本