从oozie提交猪工作

时间:2016-01-22 09:56:09

标签: hive apache-pig oozie oozie-coordinator

我正在使用hadoop集群中的oozie自动化Pig作业。

我能够从oozie运行一个示例猪脚本,但我的下一个要求是运行一个pig作业,其中pig脚本从shell脚本接收它的输入参数。 请分享您的想法

1 个答案:

答案 0 :(得分:3)

<强>更新

确定原始问题清楚,如何从shell脚本输出传递参数。这是工作示例:

WORKFLOW.XML

<workflow-app xmlns='uri:oozie:workflow:0.3' name='shell-wf'>
    <start to='shell1' />
    <action name='shell1'>
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                  <name>mapred.job.queue.name</name>
                  <value>${queueName}</value>
                </property>
            </configuration>
            <exec>so.sh</exec>
            <argument>A</argument>
            <argument>B</argument>
            <file>so.sh</file> 
            <capture-output/>
        </shell>
        <ok to="shell2" />
        <error to="fail" />
    </action>


    <action name='shell2'>
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                  <name>mapred.job.queue.name</name>
                  <value>${queueName}</value>
                </property>
            </configuration>
            <exec>so2.sh</exec>
            <argument>${wf:actionData('shell1')['out']}</argument>
            <file>so2.sh</file> 
        </shell>
        <ok to="end" />
        <error to="fail" />
    </action>

    <kill name="fail">
        <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name='end' />
</workflow-app>

SO.SH

echo "out=test"

SO2.SH

echo "I'm so2.sh and I get the following param:"
echo $1

如果用pig动作替换第二个shell动作,并将参数传递给pig脚本,如下所示:

...
<param>MY_PARAM=${wf:actionData('shell1')['out']}</param>
...

比你原来的问题解决了。

关于您的sharelib问题,您必须确保在您配置LIB_PATH = 的地方/你/ jars /是的属性中,并将此参数移交给猪行动,

<param>LIB_PATH=${LIB_PATH}</param>

而不是从那里注册罐子:

REGISTER '$LIB_PATH/my_jar'

=============================================== =========================== 你正在寻找的是

  

映射wf:actionData(字符串节点)

     

此功能仅适用于产生输出的动作节点   完成后的数据。

     

输出数据采用Java Properties格式并通过此EL   功能它可以作为地图使用。

Documentation 这是一个很好的例子:http://www.infoq.com/articles/oozieexample (实际上你必须像Samson在评论中所写的那样捕获输出)

Some more details: &#34;如果存在capture-output元素,则表示Oozie捕获shell命令执行的STDOUT的输出。 Shell命令输出必须采用Java Properties文件格式,且不得超过2KB。在工作流定义中,可以通过String action:output(String node,String key)函数访问Shell操作节点的输出(请参阅&#39; 4.2.6操作EL函数&#39;)。 34;

或者你可以使用一个不太好但很简单的工作循环并在pig本身中执行你的shell脚本并将其保存在变量中,并使用它。像这样:

%DEFINE MY_VAR `echo "/abc/cba'`
A = LOAD '$MY_VAR' ...

但这根本不是很好,第一个解决方案是建议的。