繁体   English   中英

如何通过shell脚本调用oozie工作流并阻止/等待工作流完成

[英]How to invoke an oozie workflow via shell script and block/wait till workflow completion

我使用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作业完成时,并相应地返回退出代码,以便调用包装器脚本的父进程知道作业是否成功完成,如果出错,则为支持团队提出警报/票证。

您可以通过使用作业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 

这是执行此操作的基本方法,您可以根据用例进行修改。

要将工作流程定义上载到HDFS,请使用以下命令:

hdfs dfs -copyFromLocal -f workflow.xml /user/hdfs/workflows/workflow.xml

要启动Oozie作业,您需要以下两个命令。请注意,在一行上写下每个命令。

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

当返回result = 0时,你需要解析来自下面命令的result = 0否则它就是失败。 每次试验后,只需在睡眠时间内循环X次。

oozie job -oozie http://<oozie-server>/oozie -info ${JOB_ID#*:}

echo $? //shows whether command executed successfully or not

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM