Hadoop批量处理记录数统计:Hive任务审计数据存入MySQL
实现Hive任务插入记录数的审计方案
我来分享一套亲测可行的实现流程,涵盖SQL修改、Shell脚本处理、MySQL审计表创建以及Cron调度的细节:
1. 调整Hive SQL脚本(main.sql)
首先要让Hive在执行插入后输出准确的记录数,推荐用CTE先准备数据,既完成插入又统计数量,避免重复计算:
-- main.sql WITH data_to_insert AS ( -- 这里写你的源数据查询逻辑,比如按日期分区筛选增量数据 SELECT col1, col2, col3 FROM source_table WHERE dt = date_sub(current_date(), 1) -- 假设处理前一天的数据 ) -- 插入目标表 INSERT INTO TABLE target_table PARTITION (dt) SELECT col1, col2, col3, date_sub(current_date(), 1) AS dt FROM data_to_insert; -- 输出插入的记录数,方便Shell捕获 SELECT COUNT(*) AS inserted_count FROM data_to_insert;
2. 编写Shell调度脚本(main.ksh)
这个脚本负责执行Hive任务、捕获记录数、并将审计信息插入MySQL:
#!/bin/ksh # 加载环境变量(关键!避免Cron环境找不到Hive/MySQL命令) source /etc/profile source ~/.kshrc # 配置参数 HIVE_SCRIPT="/opt/hive/scripts/main.sql" MYSQL_CONFIG="$HOME/.my.cnf" # 用配置文件存MySQL凭证更安全 AUDIT_TABLE="hive_job_audit" EXECUTION_DATE=$(date +'%Y-%m-%d') JOB_NAME="daily_data_sync" LOG_FILE="/var/log/hive_audit.log" # 执行Hive任务并保存输出 hive -f "$HIVE_SCRIPT" > /tmp/hive_output.tmp 2>&1 HIVE_EXIT_CODE=$? # 处理任务结果 if [ $HIVE_EXIT_CODE -eq 0 ]; then JOB_STATUS="SUCCESS" # 从Hive输出中提取记录数(匹配INSERT后的COUNT结果) INSERTED_COUNT=$(awk '/inserted_count/ {getline; print $0}' /tmp/hive_output.tmp) # 防止COUNT结果为空的情况 INSERTED_COUNT=${INSERTED_COUNT:-0} else JOB_STATUS="FAILED" INSERTED_COUNT=0 fi # 插入MySQL审计表(用.my.cnf避免明文密码) mysql --defaults-extra-file="$MYSQL_CONFIG" << EOF INSERT INTO $AUDIT_TABLE (job_name, execution_date, inserted_count, job_status) VALUES ('$JOB_NAME', '$EXECUTION_DATE', $INSERTED_COUNT, '$JOB_STATUS'); EOF # 记录日志 echo "$(date +'%Y-%m-%d %H:%M:%S') - Job [$JOB_NAME] $JOB_STATUS. Inserted $INSERTED_COUNT records." >> "$LOG_FILE" # 清理临时文件 rm -f /tmp/hive_output.tmp
3. 创建MySQL审计表
提前在MySQL中创建用于存储审计数据的表:
CREATE TABLE hive_job_audit ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键', job_name VARCHAR(100) NOT NULL COMMENT '任务名称', execution_date DATE NOT NULL COMMENT '执行日期', inserted_count INT NOT NULL DEFAULT 0 COMMENT '插入记录数', job_status VARCHAR(20) NOT NULL COMMENT '任务状态(SUCCESS/FAILED)', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '审计记录创建时间', -- 唯一索引防止重复插入 UNIQUE KEY idx_job_date (job_name, execution_date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT 'Hive任务审计表';
4. 配置MySQL安全访问(可选但推荐)
为了避免在Shell脚本中明文写密码,在执行脚本的用户家目录创建.my.cnf文件,并设置严格权限:
# ~/.my.cnf [client] host=your_mysql_host user=audit_user password=your_secure_password database=audit_database
设置权限:
chmod 600 ~/.my.cnf
5. Cron调度配置
编辑Crontab,设置每日执行任务(比如凌晨2点):
crontab -e
添加以下内容(注意替换脚本路径和日志路径):
# 每日凌晨2点执行Hive同步任务 0 2 * * * /opt/hive/scripts/main.ksh >> /var/log/hive_cron.log 2>&1
关键注意事项
- 环境变量:Cron的默认环境变量很有限,一定要在脚本开头加载系统和用户的环境配置,否则会找不到Hive、MySQL等命令。
- 异常处理:通过Hive的退出码判断任务是否成功,比单纯解析输出更可靠。
- 数据准确性:用CTE统计插入数据的数量,确保和实际插入的记录数完全一致,避免二次查询导致数据不一致。
内容的提问来源于stack exchange,提问作者Dileep Dominic
相关产品推荐
相关产品推荐

