场景:
执行以下任务流的时候就出现了直接失败的情况
在第一次执行并且数据完善的情况下测试的,状态是成功的
但是第二次是在第一次基础上测试的,基础数据有所缺失
日志为:
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1]
Oozie Launcher failed, finishing Hadoop job gracefully
Oozie Launcher, uploading action data to HDFS sequence file: hdfs://master:8020/user/yarn/oozie-oozi/0000001-210222093847775-oozie-oozi-W/shell-0b5f--shell/action-data.seq
Successfully reset security manager from org.apache.oozie.action.hadoop.LauncherSecurityManager@314b8f2d to null
Oozie Launcher ends
分析:
1、所有脚本都是这样,还是极个别脚本引起的异常失败整个工作流
2、是否和数据有关(大概率),为什么
然后之后做了一系列的测试工作,先是把两种不同数据源的脚本分开测试,得到的就是日志脚本的问题,就是没有数据的情况下会执行错误 KILLED
为什么呢?
因为shell脚本直接报的KILLED,导致程序直接异常退出
怎么规避呢
在这种情况下出现两种猜想和解决方法
- oozie有没有可以直接配置的方法直接跳过任务流某个节点脚本的任务状态FAILED(直接异常停止了脚本),这样能够保证在所有环节里面都能够正常执行而不会因为某些无法避免的错误而停止整个流程
- 脚本控制,通过查询hdfs上面是否有相关数据文件的方法进行脚本内命令执行控制
通过查阅资料和相关论坛,都没有找到第一种方法的配置,所以只有第二种方法进行
具体实现方法,在shell脚本中加入相关判断
具体如下:
# 限制 不然会出现异常退出导致任务流失败
hadoop fs -test -e /origin_data/marketing_system/log/topic_start/$do_date
if [ $? -eq 0 ] ;then
hadoop fs -test -e /origin_data/marketing_system/log/topic_start/$do_date/*.lzo
if [ $? -eq 0 ]; then
num=1
fi
else
num=2
fi
if [ ${num} -eq 1 ];then
hive -e "$sql"
hdfs dfs -rm -r /origin_data/marketing_system/log/topic_start/$do_date/
fi