我使用Oozie创建了一个工作流程,该工作流程由多个动作节点组成,并且已成功通过协调器运行。
我想通过包装器shell脚本调用Oozie工作流。
包装器脚本应调用Oozie命令,等待oozie作业完成(成功或错误)并返回Oozie成功状态代码(0)或失败的oozie操作节点的错误代码(如果任何节点oozie工作流失败了。)
据我所知,到目前为止,我知道只要我调用oozie命令来运行工作流程,命令就会退出,并在linux控制台上打印作业ID,而oozie作业会在后端异步运行
我希望我的包装器脚本阻塞,直到oozie协调器作业完成并返回成功/错误代码。
请告诉我如何使用任何oozie功能实现这一目标?
我在Linux中使用Oozie版本3.3.2和bash shell。
注意:如果有人对我为什么需要这样的功能感到好奇 - 要求是我的包装shell脚本应该知道oozie作业已经运行了多长时间,当oozie作业完成时,并相应地返回退出代码,以便调用包装器脚本的父进程知道作业是否成功完成,如果出错,则为支持团队提出警报/票证。
答案 0 :(得分:3)
您可以通过使用作业ID然后启动循环并解析oozie信息的输出来实现。下面是相同的shell代码。
开始oozie工作
oozie_job_id=$(oozie job -oozie http://<oozie-server>/oozie -config job.properties -run );
echo $oozie_job_id;
sleep 30;
从输出中解析作业ID。这里job_id格式是“job:jobid”
job_id=$(echo $oozie_job_id | sed -n 's/job: \(.*\)/\1/p');
echo $job_id;
定期检查作业状态,如果是否正在运行
while [ true ]
do
job_status=$(oozie job --oozie http://<oozie-server>/oozie -info $job_id | sed -n 's/Status\(.*\): \(.*\)/\2/p');
if [ "$job_status" != "RUNNING" ];
then
echo "Job is completed with status $job_status";
break;
fi
#this sleep depends on you job, please change the value accordingly
echo "sleeping for 5 minutes";
sleep 5m
done
这是执行此操作的基本方法,您可以根据用例进行修改。
答案 1 :(得分:2)
To upload workflow definition to HDFS use the following command :
hdfs dfs -copyFromLocal -f workflow.xml /user/hdfs/workflows/workflow.xml
To fire up Oozie job you need these two commands at the below Please Notice that to write each on a single line.
JOB_ID=$(oozie job -oozie http://<oozie-server>/oozie -config job.properties
-submit)
oozie job -oozie http://<oozie-server>/oozie -start ${JOB_ID#*:}
-config job.properties
You need to parse result coming from below command when the returning result = 0
otherwise it's a failure. Simply loop with sleep X amount of time after each trial.
oozie job -oozie http://<oozie-server>/oozie -info ${JOB_ID#*:}
echo $? //shows whether command executed successfully or not