标题很长:通过shell脚本来rerun一个oozie调度失败的job,从而可以跳过执行失败的节点
不过目前从oozie调度测试的例子来看,oozie本身的retry好像并没有参数可以控制跳过失败的节点。必须手工重新rerun的时候指定 -D oozie.wf.rerun.failnodes=false
参数。
这个问题发生的原因是不同的节点安装的软件包有些差异导致一些jar包冲突,这样就使得该job在某些节点执行成功,某些节点执行失败。
这样我就写了一段shell脚本,来从oozie的jog表里面抓取失败的某个任务,然后去执行oozie rerun的命令,然后在crontab中每天定时调度这个脚本3次。
shell脚本如下:
#!/bin/sh # mysql连接 hostname="localhost" port="3306" username="oozie" password="oozie" dbname="oozie" # job的名称 appname="coord_xxxx_job" #当前时间 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