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 作业何时完成,并相应地返回退出代码,以便调用包装器脚本的父进程知道作业是否成功完成,如果出错,则为支持团队发出警报/票。
您可以通过使用作业 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
| 归档时间: |
|
| 查看次数: |
3345 次 |
| 最近记录: |