概述
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
原因:可能表已损坏、权限不足、或超时。
解决:
- 手动验证该表是否可查:
SELECT COUNT(*) FROM 库名.表名; - 如超时,增大
BEEELINE_TIMEOUT值(如600) - 如权限问题,确认
USER/PASS配置的账号是否有该库的读权限
Q3:脚本运行中卡住不动
原因:某张表特别大导致 COUNT 耗时很长,或 beeline 进程挂起。
解决:
- 等待超时(默认 300 秒)后脚本会自动跳过该表
- 如需提前终止,按
Ctrl+C,脚本会自动清理残留的 beeline 进程 - 可降低
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)等 |