python脚本快速统计Argodb集群每张表的条数

  其他常见问题
内容纲要

概述

count_all_tables.py 是一个用于统计 Quark(ArgoDB / Inceptor)集群中所有数据库、所有表记录条数的脚本。脚本通过 Beeline 连接集群,利用 system.tables_v 一次性获取库表列表,再 10 并发执行 SELECT COUNT(*) 逐表统计,最终将结果输出到文本文件。

适用场景

  • 数据盘点:快速了解全库各表的数据量分布
  • 运维巡检:定期统计表条数,监控数据增长趋势
  • 迁移校验:数据迁移前后对比各表条数,确认数据完整性

环境要求

项目 要求
集群节点 需能 SSH 登录到安装了 TDH Client 的节点
TDH Client 已安装并位于 /root/TDH-Client/
Python 2.7(TDH集群自带版本,脚本已做兼容处理)
Beeline /root/TDH-Client/inceptor/bin/beeline 可用
网络 执行节点需能访问 JDBC 地址

快速使用

1. 上传脚本到服务器

count_all_tables.py 上传到目标节点的 /root/ 目录:

2. 执行脚本

SSH 登录到服务器后,使用以下命令执行:

source /root/TDH-Client/init.sh n n 
python -u /root/count_all_tables.py

为什么要先 source /root/TDH-Client/init.sh

source /root/TDH-Client/init.sh 用于初始化 TDH 环境变量(包括 JAVA_HOME、Hadoop 配置等)。单独执行 python 不会继承 source 设置的环境变量,因此必须在同一个 bash -c 中先 source 再执行。

3. 查看结果

脚本执行完成后,结果文件位于:

/root/all_table_counts.txt

输出格式示例:

数据库                      表名                                           条数
-------------------------------------------------------------------------------------
default                  emp_holo                                       1
-------------------------------------------------------------------------------------
test_db                  orders                                         150000
test_db                  users                                          28000
-------------------------------------------------------------------------------------
                                                                 总计: 3 张表

运行过程说明

脚本运行时会依次输出以下信息:

[*] beeline 已就绪: /root/TDH-Client/inceptor/bin/beeline
[*] 通过 system.tables_v 获取所有库/表列表 ...
[*] 共发现 156 张表
    default: 3 张表
    test_db: 45 张表
    dw_prod: 108 张表
[*] 开始并发统计(10 并发)...
    进度: 5/156
    进度: 10/156
    ...
[*] 清理残留进程 ...

[*] 统计完成!耗时 342.5 秒
[*] 结果已写入 /root/all_table_counts.txt

执行耗时参考:单表 COUNT(*) 约 2-5 秒,100 张表 10 并发约需 3-6 分钟,具体取决于表大小和集群负载。

自定义配置

如需调整脚本行为,编辑 count_all_tables.py 顶部的配置段:

# ============ 配置 ============
BEELINE = "/root/TDH-Client/inceptor/bin/beeline"   # Beeline 路径
JDBC = "jdbc:hive2://172.18.131.171:10000/default?ngmr.session.name=session-test1"  # JDBC 连接地址,ngmr.session.name参数透传,方便DBAService定位
USER = "hive"                                        # 数据库LDAP用户名
PASS = "123456"                                      # 数据库LDAP密码
WORKERS = 10                                         # 并发线程数
OUTPUT = "/root/all_table_counts.txt"                # 结果输出路径
BEEELINE_TIMEOUT = 300                               # 单条 SQL 超时(秒)
# ==============================

常见问题

Q1:执行报错 "beeline 不存在"

原因init.sh 未正确初始化,或 TDH Client 安装路径不是默认的 /root/TDH-Client/

解决:确认正确的TDH-Client beeline 路径并修改脚本中的 BEELINE 配置项:

Q2:统计某张表时返回 ERROR

原因:可能表已损坏、权限不足、或超时。

解决

  1. 手动验证该表是否可查:SELECT COUNT(*) FROM 库名.表名;
  2. 如超时,增大 BEEELINE_TIMEOUT 值(如 600
  3. 如权限问题,确认 USER / PASS 配置的账号是否有该库的读权限

Q3:脚本运行中卡住不动

原因:某张表特别大导致 COUNT 耗时很长,或 beeline 进程挂起。

解决

  1. 等待超时(默认 300 秒)后脚本会自动跳过该表
  2. 如需提前终止,按 Ctrl+C,脚本会自动清理残留的 beeline 进程
  3. 可降低 WORKERS 减少并发压力

Q4:如何只统计指定数据库的表?

解决:修改脚本中 get_all_tables() 函数的 SQL,添加数据库过滤条件:

# 将原来的 SQL:
"SELECT database_name, table_name FROM system.tables_v;"

# 改为(以统计 test_db 为例):
"SELECT database_name, table_name FROM system.tables_v WHERE database_name = 'test_db';"

Q5:结果文件编码乱码

原因:脚本输出为 UTF-8,部分终端默认编码可能不匹配。

解决

# 查看/转换编码
iconv -f UTF-8 -t GBK /root/all_table_counts.txt > /root/all_table_counts_gbk.txt

# 或直接在支持 UTF-8 的工具中打开(如 Notepad++、VS Code)

技术原理

步骤 实现方式
获取库表列表 SELECT database_name, table_name FROM system.tables_v,一次查询获取全量,避免逐库 SHOW TABLES 的低效
统计表条数 对每张表执行 SELECT COUNT(*) FROM 库名.表名
并发控制 使用 Queue + threading 实现 10 并发工作线程
超时处理 每个 beeline 进程启动独立线程等待,超时后 kill 整个进程组
进程清理 脚本退出时(正常或异常)自动 pkill 残留 beeline 进程,避免资源泄漏
Python 2.7 兼容 使用 % 格式化、Queue(非 queue)、threading(非 concurrent.futures)等

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。