我正在hadoop集群中使用oozie来实现Pig作业的自动化。我能够从oozie运行一个示例pig脚本,但我的下一个要求是运行一个pig作业,其中pig脚本从shell脚本接收输入参数。请分享你的想法
jq6vz3qz1#
更新:好吧,把原来的问题弄清楚,如何从shell脚本输出中传递参数。以下是工作示例:工作流.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>
所以,嘘
echo "out=test"
二氧化硫.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\u path=where/you/jars/are并将此参数交给pig操作,
<param>LIB_PATH=${LIB_PATH}</param>
不仅仅是从那里登记jar:
REGISTER '$LIB_PATH/my_jar'
=========================================================================================您要找的是map wf:actiondata(字符串节点)此函数仅适用于在完成时生成输出数据的操作节点。输出数据采用java属性格式,通过这个el函数,它可以作为一个Map。文档这是一个很好的例子:http://www.infoq.com/articles/oozieexample (实际上,您必须按照samson在评论中所写的那样捕获输出)更多细节:“如果存在capture output元素,则它指示oozie捕获shell命令执行的stdout的输出。shell命令输出必须是java属性文件格式,并且不能超过2kb。在工作流定义中,可以通过字符串访问shell操作节点的输出action:output(字符串节点,字符串键)函数(请参阅“4.2.6动作el函数”一节)或者您可以使用一个不太好但简单的工作轮,在pig中执行shell脚本,并将其结果保存在一个变量中,然后使用它。这样地:
%DEFINE MY_VAR `echo "/abc/cba'` A = LOAD '$MY_VAR' ...
但这一点都不好,第一个解决方案是建议的。
1条答案
按热度按时间jq6vz3qz1#
更新:
好吧,把原来的问题弄清楚,如何从shell脚本输出中传递参数。以下是工作示例:
工作流.xml
所以,嘘
二氧化硫.sh
如果用pig操作替换第二个shell操作,并将参数传递给pig脚本,如下所示:
你原来的问题解决了。
关于sharelib问题,您必须确保在属性中配置lib\u path=where/you/jars/are并将此参数交给pig操作,
不仅仅是从那里登记jar:
=========================================================================================您要找的是
map wf:actiondata(字符串节点)
此函数仅适用于在完成时生成输出数据的操作节点。
输出数据采用java属性格式,通过这个el函数,它可以作为一个Map。
文档这是一个很好的例子:http://www.infoq.com/articles/oozieexample (实际上,您必须按照samson在评论中所写的那样捕获输出)
更多细节:“如果存在capture output元素,则它指示oozie捕获shell命令执行的stdout的输出。shell命令输出必须是java属性文件格式,并且不能超过2kb。在工作流定义中,可以通过字符串访问shell操作节点的输出action:output(字符串节点,字符串键)函数(请参阅“4.2.6动作el函数”一节)
或者您可以使用一个不太好但简单的工作轮,在pig中执行shell脚本,并将其结果保存在一个变量中,然后使用它。这样地:
但这一点都不好,第一个解决方案是建议的。