我正在使用hadoop集群中的oozie自动化Pig作业。
我能够从oozie运行一个示例猪脚本,但我的下一个要求是运行一个pig作业,其中pig脚本从shell脚本接收它的输入参数。 请分享您的想法
答案 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' ...
但这根本不是很好,第一个解决方案是建议的。