求助:编写Bash脚本将Hadoop DistCp日志写入Hive表
实现DistCp日志写入Hive表的Bash脚本方案
直接给你整合好的脚本,再拆解关键步骤,你照着改参数就能用:
完整脚本示例
#!/bin/bash # -------------------------- 配置区 -------------------------- # 替换成你的源路径、目标路径 SRC_PATH="/hdfs/source/dir" DST_PATH="/hdfs/target/dir" # 替换成你的Hive库表名(比如log_db.distcp_job_logs) HIVE_LOG_TABLE="your_db.distcp_job_logs" # 临时日志文件,用来提取Job ID和应用URL TEMP_LOG="/tmp/distcp_temp_$(date +%s).log" # ----------------------------------------------------------- # 记录任务开始时间(格式和Hive的timestamp匹配) START_TIME=$(date +"%Y-%m-%d %H:%M:%S") # 执行DistCp,把所有输出存到临时文件 hadoop distcp "$SRC_PATH" "$DST_PATH" > "$TEMP_LOG" 2>&1 # 判断任务执行状态:0=成功,非0=失败 EXIT_STATUS=$? STATUS=$([ $EXIT_STATUS -eq 0 ] && echo "SUCCESS" || echo "FAILED") # 从临时日志提取Job ID(根据你的DistCp输出格式调整正则) JOB_ID=$(grep -o "Job ID: job_[0-9]*_[0-9]*" "$TEMP_LOG" | awk '{print $3}') # 提取YARN应用URL(如果输出里没有完整URL,就自己拼前缀,比如http://yarn-host:8088/proxy/) APP_URL=$(grep -o "http://.*:8088/proxy/application_[0-9]*_[0-9]*" "$TEMP_LOG") # 处理变量中的单引号(避免Hive插入时语法报错) escape_quotes() { echo "$1" | sed "s/'/\\\'/g" } SRC_ESC=$(escape_quotes "$SRC_PATH") DST_ESC=$(escape_quotes "$DST_PATH") APP_URL_ESC=$(escape_quotes "$APP_URL") JOB_ID_ESC=$(escape_quotes "$JOB_ID") # 执行Hive插入语句 hive -e "INSERT INTO TABLE $HIVE_LOG_TABLE VALUES ( '$SRC_ESC', '$DST_ESC', '$START_TIME', '$STATUS', '$APP_URL_ESC', '$JOB_ID_ESC' )" # 清理临时文件 rm -f "$TEMP_LOG"
关键步骤拆解
1. 变量定义与初始化
- 提前配置好源路径、目标路径和Hive表名,方便后续修改
- 用
date +"%Y-%m-%d %H:%M:%S"生成符合Hive timestamp格式的开始时间
2. 执行DistCp并捕获状态
- 把DistCp的输出重定向到临时文件,方便后续提取Job ID和应用URL
- 通过
$?获取命令退出码,直接映射成SUCCESS/FAILED状态
3. 提取Job ID和应用URL
- 用
grep -o匹配日志中的关键内容,再用awk提取具体值 - 如果你的DistCp输出格式和示例不一样,调整
grep的正则即可(比如有些版本会输出Submitted application application_xxxx,那提取应用ID后自己拼YARN前缀)
4. 处理特殊字符
- 路径或URL里如果有单引号,会导致Hive语句语法错误,用
sed把单引号转义成\'
5. 插入Hive表
- 用
hive -e直接执行插入SQL,把Bash变量用单引号包裹代入即可;如果用Beeline连接Hive,把hive -e换成beeline -u "jdbc:hive2://host:port/db" -n 用户 -p 密码 -e "..."
内容的提问来源于stack exchange,提问作者yurkaishere
相关产品推荐
相关产品推荐

