【问题标题】:How to invoke an oozie workflow via shell script and block/wait till workflow completion如何通过 shell 脚本调用 oozie 工作流并阻止/等待工作流完成
【发布时间】:2015-09-06 07:48:07
【问题描述】:

我使用 Oozie 创建了一个工作流,该工作流由多个操作节点组成,并且能够通过协调器成功运行这些节点。

我想通过包装外壳脚本调用 Oozie 工作流。

包装脚本应该调用 Oozie 命令,等待 oozie 作业完成(成功或错误)并返回 Oozie 成功状态代码 (0) 或失败的 oozie 操作节点的错误代码(如果oozie 工作流程失败)。

从我目前看到的情况来看,我知道一旦我调用 oozie 命令来运行工作流,命令就会退出,作业 ID 会打印在 linux 控制台上,而 oozie 作业会在后端异步运行.

我希望我的包装脚本一直阻塞,直到 oozie 协调器作业完成并返回成功/错误代码。

您能否告诉我如何/如果我可以使用任何 oozie 功能实现这一目标?

我在 Linux 中使用 Oozie 3.3.2 版和 bash shell。

注意:如果有人对我为什么需要这样的功能感到好奇 - 要求是我的包装器 shell 脚本应该知道 oozie 作业已经运行了多长时间,什么时候完成了 oozie 作业,并相应地返回退出代码,以便调用包装脚本的父进程知道作业是否成功完成,如果出错,向支持团队发出警报/票证。

【问题讨论】:

    标签: shell blocking oozie error-code oozie-coordinator


    【解决方案1】:

    您可以通过使用作业 id 然后开始一个循环并解析 oozie info 的输出来做到这一点。下面是相同的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 
    

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

    【讨论】:

      【解决方案2】:

      要将工作流定义上传到 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://&lt;oozie-server&gt;/oozie -info ${JOB_ID#*:}

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

      【讨论】:

      • 感谢您的回答,如果您在两个 ` 之间写一些东西,中间的文字会像这样突出显示:example,通常代码是这样写的,点击您的答案编辑,您会看到我的宣福并澄清了你的答案。此外,如果您查看其他帖子,您会发现没有人使用问候语,实际上带有问候语的帖子通常会受到社区成员的反对。请通过单击顶部的游览按钮或帮助下拉菜单获取通知徽章,然后单击参观并仔细阅读。
      • 我正在为您写此评论,因为您的答案已发送给我以供社区审核。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多