用户画像项目DataToES环节中,需要在kettle启动之前动态监控${sday}的90d数据是否已经生成,不用公司xcenter的方案如下:
每隔5min动态监控HDFS路径下${sday}新分区文件夹是否生成:
方案一:
${_HADOOP_BIN} fs -text /HDFS路径/${sday}/*00000*|head -10|wc -l
监控HDFS路径下文件,查看前10行,wc -l输出行数为10
如果${sday}路径没有生成,则会返回0
依据返回值是10还是0,以此判断${sday}路径是否已经生成。
方案二:(若返回值为0代表目录存,若返回值为1代表目录不存在)
${_HADOOP_BIN} fs -test -d /HDFS路径/${sday} echo $?
hdfs的-test -d命令为判断是否为directory, return 0 if <path> is a directory
贴一个动态监控的脚本check_90d_data.sh如下,每隔5min监控一次,共监控6h:
#!/bin/bash
sday=$1
total_check_cnt=72
sleep_time=300s
export _HADOOP_BIN=/usr/lib/software/hadoop/bin/hadoop
let "sleep_time=${sleep_time} * ${total_check_cnt}"
echo "最多检查 ${total_check_cnt}次,共计${sleep_time} 秒"
check_cnt=1
while(( ${check_cnt} <= ${total_check_cnt} ))
do
echo "进行第${check_cnt} 次检查"
result=$(${_HADOOP_BIN} fs -text /HDFS路径/${sday}/*00000*|head -10|wc -l)
if [[ "${result}" == "10" ]];then
echo "90d数据的 ${sday} 分区数据已生成!!!"
break
else
if [[ ${check_cnt} -lt ${total_check_cnt} ]] ;then
echo "90d数据 ${sday} 分区数据还未生成,等待5分钟后再次检查"
sleep ${sleep_time}
let "check_cnt++"
else
echo "检查4小时后,90d数据 ${sday} 分区数据仍然未生成,Game Over!!!"
exit 1
fi
fi
done
然后写一个脚本check_90d_start.sh,调度上面的监控脚本就行,还可以把监控脚本的日志输出到指定log日志中
#!/bin/bash
bin=$(cd '/XXXXX/bin'; pwd)
cd ${bin}
sday=$1
./check_90d_data.sh ${sday} > /opt/log/wangxuan/smart/${sday}/check_90d_data_${sday}.log 2>&1
echo '${sday} 的90d数据入库成功!!!'
exit 0
这样,在kettle流程中,如果90d数据没有入库,就会每隔5min一直监控72次,直到90d数据入库成功,脚本执行完毕,进入下一步流程。