我正在使用hadoop集群中的oozie自动化猪作业。从oozie提交猪作业
我能够从oozie运行示例猪脚本,但是我的下一个要求是运行猪作业,其中猪脚本从shell脚本接收输入参数。 请分享你的想法
我正在使用hadoop集群中的oozie自动化猪作业。从oozie提交猪作业
我能够从oozie运行示例猪脚本,但是我的下一个要求是运行猪作业,其中猪脚本从shell脚本接收输入参数。 请分享你的想法
UPDATE:
OK使原来的问题清楚,你怎么可以将参数形成一个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
如果你更换你的猪行动第二壳行动并将这个参数传递给猪脚本,如下所示:
...
<param>MY_PARAM=${wf:actionData('shell1')['out']}</param>
...
比你原来的问题解决了。
关于你sharelib问题,你必须确保在性能配置了LIB_PATH = 地方/你/瓶/是,交出这个参数去猪行动,
<param>LIB_PATH=${LIB_PATH}</param>
不仅仅是注册从那里的罐子:
REGISTER '$LIB_PATH/my_jar'
=============================== === ======================================== 你在找什么是
地图WF:actionData(字符串节点)
此功能仅适用于产生在完成输出 数据动作的节点。
输出数据是Java属性格式,通过这个EL 函数它可以作为Map使用。
Documentation 这里是一个很好的例子:http://www.infoq.com/articles/oozieexample (实际上你要捕获输出为参孙在评论中写道)
Some more details: “如果捕获输出元素存在,它表明了Oozie捕获shell命令执行的STDOUT输出Shell命令的输出必须是Java属性文件格式,且不能超过2KB从工作流定义中,Shell动作节点的输出可通过String操作访问:输出(字符串节点,字符串键)功能(参考'4.2.6动作EL功能蒸发散)。“
或者你可以使用一个不那么漂亮,但简单的工作,一个全面,在猪的执行你的shell脚本本身并保存它是一个变量的结果,并使用这样的:
%DEFINE MY_VAR `echo "/abc/cba'`
A = LOAD '$MY_VAR' ...
但是这并不好,第一个解决方案是建议的
嗨 感谢您的解决方案,现在我有其他要求,我在猪脚本中使用了一些自定义库。我已将所有依赖库放在/ user/oozie/share/lib /中。 我有一个简单的猪脚本和相应的shell脚本来调用猪有这个内容 - > pig -useHCatalogue -f test.pig -p input = table_name; 现在我试图从oozie shell动作调用这个shell脚本。但工作退出这个错误:主类[org.apache.oozie.action.hadoop.ShellMain],退出代码[1] –
我真的不认为这是一个好主意,让我更新我的答案,并将其与一些关于如何使用shell动作的捕获输出的更多细节 – kecso
我将猪invoke命令放在shell文件中的原因是因为pig像前面的注释中提到的那样需要太多的参数。 (例如 - > input = table_name。)如果上面的方法不可取,那么我会在这里删除shell动作,而宁愿直接去oozie里面的猪动作。但是如何使用自定义罐子帮助我 –
使用shell动作,在那里运行你的脚本,使用捕获 - 输出标签并将其馈入你的pig动作 – LiMuBei