shell补数据
#!/bin/bash
#########修改SQL_SCRIPT_PATH和TASK_NAME,运行示例:./geea3.0.sh 2024-11-04 2024-11-05
# 检查参数数量
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <START_DATE> <END_DATE>"
exit 1
fi
# 获取外部参数
START_DATE="$1"
END_DATE="$2"
# 配置日志文件和企业微信机器人相关信息
LOG_FILE="impala_shell.log"
WEBHOOK_URL='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=8afd05fe-f161-47fa-965b-d81d88c90928' # 请替换为你的企业微信机器人Webhook Key
TASK_NAME="dim_bi_tsp_da修复" # 替换为你的任务名称
RETRY_TIMES=5 # 总共可重试的次数
# 定义日期格式及累加变量
DATE_FORMAT="%Y%m%d"
DATE_FORMAT_="%Y-%m-%d"
IMPALA_SERVER_IP="10.160.36.154"
SQL_SCRIPT_PATH="/home/admin/bdp/dw/dim/dim_bi_tsp_da.sql"
# 将日期转换为秒数
start_epoch=$(date -d "$START_DATE" +%s)
end_epoch=$(date -d "$END_DATE" +%s)
interval=$((86400)) # 每天的秒数
# 循环执行命令
while [ $start_epoch -lt $end_epoch ]; do
# 计算当前日期和昨天的日期
current_date=$(date -d "@$start_epoch" +"$DATE_FORMAT_")
yesterday_date=$(date -d "@$((start_epoch - interval))" +"$DATE_FORMAT_")
# 格式化日期
today=$(date -d "$current_date" +"$DATE_FORMAT")
today_=$(date -d "$current_date" +"$DATE_FORMAT_")
yesterday=$(date -d "$yesterday_date" +"$DATE_FORMAT")
yesterday_=$(date -d "$yesterday_date" +"$DATE_FORMAT_")
# 构建命令
command="impala-shell -i $IMPALA_SERVER_IP --var=dt=\"$today\" -f $SQL_SCRIPT_PATH"
# 尝试执行命令,最多重试RETRY_TIMES次
retries=0
success=false
while [ $retries -lt $RETRY_TIMES ]; do
if eval "$command" 2>>"$LOG_FILE"; then # 重定向stderr到LOG_FILE
success=true
break # 如果成功,则跳出内层循环
else
retries=$((retries + 1))
# 构建失败消息
message="{
\"msgtype\": \"text\",
\"text\": {
\"content\": \"阿里云环境! 任务失败,请相关人员注意。\\n任务名称:${TASK_NAME} \\n任务日期:${current_date} \\n正在重试第:${retries}次 \\n总共可重试:${RETRY_TIMES}次\"
}
}"
# 发送失败消息
curl -s -X POST "$WEBHOOK_URL" -H 'Content-Type: application/json' -d "$message"
echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR - Failed to execute command, retrying $retries/$RETRY_TIMES" >> "$LOG_FILE"
fi
done
# 如果成功,则执行Hive查询获取计数
if $success; then
# 获取计数
dim_bi_tsp_da_count=$(hive -e "set hive.cli.print.header=false;set hive.execution.engine=mr;SELECT COUNT(*) FROM dim.dim_bi_tsp_da WHERE dt='${today}'")
# 构建成功消息
message="{
\"msgtype\": \"text\",
\"text\": {
\"content\": \"阿里云环境! 任务成功,请相关人员知晓。\\n任务名称:${TASK_NAME} \\n任务日期:${current_date} \\ndim_bi_tsp_da_count:${dim_bi_tsp_da_count} \\ndim_bi_tsp_da_count:${dim_bi_tsp_da_count}\"
}
}"
# 发送成功消息
curl -s -X POST "$WEBHOOK_URL" -H 'Content-Type: application/json' -d "$message"
echo "$(date '+%Y-%m-%d %H:%M:%S') - INFO - Successfully executed command with counts: dim_bi_tsp_da_count=${dim_bi_tsp_da_count}, dim_bi_tsp_da_count=${dim_bi_tsp_da_count}" >> "$LOG_FILE"
else
# 如果循环结束仍然没有成功,并且已经重试了RETRY_TIMES次,则记录最终失败消息(这里不会再发送失败消息,因为已经在每次重试时发送了)
if [ $retries -eq $RETRY_TIMES ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - CRITICAL - Failed to execute command after $RETRY_TIMES attempts" >> "$LOG_FILE"
fi
fi
# 移动到下一天
start_epoch=$((start_epoch + interval))
done