You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:23:28