目录
2.2 Oozie重新运行一个workflow 中的某个子任务
1 引 言
Oozie作为一种开源的任务调度引擎,在大数据生态圈中起着举足轻重的作用。用户可根据自己实际需求定义工作流,设置定时或触发任务,可以说Oozie是整个大数据工作中最后的一道关卡,如果任务一旦中断则给用户带来巨大损失。为了避免损失Oozie提供了任务重试或重启策略,用户可根据Oozie的重启策略对工作流进行监控,一旦发生工作流故障则立马启动重启策略保证任务顺利进行。本文针对Oozie的重启策略进行研究总结,给出了实际中具体应用方法,并针对重启策略编写了具体监控脚本,具有一定的实践指导意义。
2 Oozie重启任务方法
注:Oozie的重启策略只针对Oozie任务的意外中断,而不针对用户具体脚本执行错误进行重启,如果用户中脚本中出现bug,无论怎么重启都不会重新执行。该策略往往针对网络中断或资源不足而造成的,某个任务中断,此种中断是可恢复的。
2.1 重新运行一个Coordinator job
重新运行一个Coordinator job,可以通过如下命令:
[oozie@bigdata3 root]$ oozie job -rerun 0000014-200508144016595-oozie-oozi-C -refresh -action 4
refresh参数 保证rerun的时候重新去检查一下依赖条件的状态,看看是否能满足执行的条件。
执行结果如下:
2.2 Oozie重新运行一个workflow 中的某个子任务
具体命令如下:
oozie job -oozie http://10.0.5.18:11000/oozie -config job.properties -rerun 0000392-190417154109373-oozie-oozi-W -D oozie.wf.rerun.failnodes=false -action shell-appv_jttl_pull_day_sync
oozie.wf.rerun.failnodes 参数含义:
注意点:
该参数必须要指定的参数,如果不指定会报如下错误:
- 执行rerun的时候需要在该脚本目录下执行,否则会报相关文件找不到
- 切换到oozie用户
如果只想重新运行一个workflow 可以通过如下命令
oozie job -rerun 0000048-200508144016595-oozie-oozi-W -config rerun workflow.xml -D oozie.wf.rerun.failnodes=false
重新运行后具体结果如下:
另外在worfkflow程序中,也可以按照如下配置来自动重试:
总体可以解释为:每3分钟重试一次,一共重试5次。
2.3 Oozie按照时间的range重跑历史任务
具体命令如下:
[oozie@bigdata3 test_ooize3]$ oozie job -oozie http://10.0.5.18:11000/oozie -config job.properties -rerun 0000000-200508144016595-oozie-oozi-C -date 2020-05-08T14:10+0800::2020-05-09T16:00+0800
Action ID Nominal Time
------------------------------------------------------------------------------------------------------------------------------------
0000000-200508144016595-oozie-oozi-C@3 2020-05-08 15:05 CST
0000000-200508144016595-oozie-oozi-C@1 2020-05-08 14:55 CST
0000000-200508144016595-oozie-oozi-C@2 2020-05-08 15:00 CST
通过“-date”来指定时间的range,注意时间的格式是“xxxx-xx-xxTxx:xx+0800::xxxx-xx-xx”,“T”不能少,“0800”指定的是市区,中国处于东八区,所以是0800,两个时间之间用“::”符号连接,这里详细说明下时间范围的含义:
假设job是每天13点开始跑,那么:
总之,就是取一个闭区间,执行这个区间内所有本该运行的任务:
[Begin_time, End_time]
2.4 Oozie重启任务监控脚本代码编写
#!/bin/sh
# mysql连接
hostname="localhost"
port="3306"
username="oozie"
password="oozie"
dbname="oozie"
# job的名称
appname=$1
#当前时间
nowtime=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`
# sql 查询语句
select_sql="
select concat(a.job_id,',',a.action_number) from COORD_JOBS j,COORD_ACTIONS a
where j.id = a.job_id
and j.app_name = '${appname}'
and j.status = 'running'
and to_days(a.created_time) = TO_DAYS(now())
and a.status != 'SUCCEEDED';
"
# 连接mysql查询
result=(`mysql -h${hostname} -P${port} -u${username} -p${password} ${dbname} -N -e "${select_sql}"`)
echo ${result}
# 如果查询结果不为空,则执行oozie的rerun脚本,并跳过失败的节点执行
if [ -n "${result}" ] ;then
#echo ${result}
IFS=',' arr=(${result})
echo ${nowtime} ${appname} ${arr[0]} ${arr[1]} >> job_rerun.log
oozie job -rerun ${arr[0]} -refresh -action ${arr[1]} -D oozie.wf.rerun.failnodes=false
fi
3 小 结
本文针对Oozie的重启策略进行总结,所有的操作均得到实践验证
参考文献:
通过shell脚本来rerun一个oozie调度失败的job,从而可以跳过执行失败的节点 - 尤灯塔 - 博客园
欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路