Oozie重启任务策略研究及总结

目录

1 引 言

2 Oozie重启任务方法

2.1 重新运行一个Coordinator job

​2.2 Oozie重新运行一个workflow 中的某个子任务

2.3 Oozie按照时间的range重跑历史任务

2.4 Oozie重启任务监控脚本代码编写

3 小 结


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 参数含义:

true指在失败的节点重新运行
false指不在失败的节点运行
oozie.wf.rerun.skip.nodes 指定跳过哪些节点运行

注意点:

       该参数必须指定的参数,如果不指定会报如下错误:

  • 执行rerun的时候需要在该脚本目录下执行,否则会报相关文件找不到
  • 切换到oozie用户

 如果只想重新运行一个workflow 可以通过如下命令

oozie job -rerun 0000048-200508144016595-oozie-oozi-W -config rerun workflow.xml -D oozie.wf.rerun.failnodes=false

重新运行后具体结果如下:

注意: 使用 rerun 重新运行 workflow job 时,在 coordinator 中配置的参数会失效,因此通常是 rerun 一个 coordinator 程序。

另外在worfkflow程序中,也可以按照如下配置来自动重试:

retry-max: 表示重试次数,如果该配置大于系统的配置最大重试次数,则取系统配置的最大次数
retry-interval: 重试时间间隔, 3 分钟。 

     总体可以解释为:每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点开始跑,那么:

2020-02-20T00:10+0800 :: 2020-02-21T 14:00 +0800 => 会运行 20,21 号的任务,因为 end time 超过了 21 13:00
2020-02-20T00:10+0800 :: 2020-02-21T 10:00 +0800 => 只会运行 20 号的任务,因为 end time 没有超过了 21 13:00

总之,就是取一个闭区间,执行这个区间内所有本该运行的任务:
[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呀",关注我不迷路

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值