[英]How to fetch value from Hive in shell script via an oozie workflow?
[英]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.