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

use*_*120 5 shell error-code blocking oozie oozie-coordinator

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

Gar*_*rry 5

您可以通过使用作业 ID 然后启动循环并解析 oozie 信息的输出来做到这一点。下面是相同的shell代码。

开始 oozie 工作

oozie_job_id=$(oozie job -oozie http://<oozie-server>/oozie -config job.properties -run );
echo $oozie_job_id;
sleep 30;
Run Code Online (Sandbox Code Playgroud)

从输出中解析作业 ID。这里的job_id格式是“job:jobid”

job_id=$(echo $oozie_job_id | sed -n 's/job: \(.*\)/\1/p');
echo $job_id;
Run Code Online (Sandbox Code Playgroud)

定期检查作业状态,是否正在运行

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 
Run Code Online (Sandbox Code Playgroud)

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


小智 3

要将工作流定义上传到 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否则将失败。每次试验后只需循环睡眠 X 时间。

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

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

  • 感谢您的回答,如果您在两个`之间写一些内容,中间的文本将突出显示,例如:`example`,通常代码是这样编写的,单击答案上的编辑,您将看到我如何验证和澄清您的答案。另外,如果您查看其他帖子,您会发现没有人使用问候语,实际上带有问候语的帖子通常会受到社区成员的不满。请通过单击顶部的游览按钮或下拉的帮助按钮来获取知情徽章,然后单击在游览中并仔细阅读。 (3认同)