2016-01-22 101 views
0

我正在使用hadoop集群中的oozie自动化猪作业。从oozie提交猪作业

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

+0

使用shell动作,在那里运行你的脚本,使用捕获 - 输出标签并将其馈入你的pig动作 – LiMuBei

+0

'here:http://stackoverflow.com/questions/32478911/calling-shell-script-in-oozie-how-to-use-decision-node-on-base-of-different-ret/32486550#32486550 –

回答

2

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' ... 

但是这并不好,第一个解决方案是建议的

+0

嗨 感谢您的解决方案,现在我有其他要求,我在猪脚本中使用了一些自定义库。我已将所有依赖库放在/ user/oozie/share/lib /中。 我有一个简单的猪脚本和相应的shell脚本来调用猪有这个内容 - > pig -useHCatalogue -f test.pig -p input = table_name; 现在我试图从oozie shell动作调用这个shell脚本。但工作退出这个错误:主类[org.apache.oozie.action.hadoop.ShellMain],退出代码[1] –

+0

我真的不认为这是一个好主意,让我更新我的答案,并将其与一些关于如何使用shell动作的捕获输出的更多细节 – kecso

+0

我将猪invoke命令放在shell文件中的原因是因为pig像前面的注释中提到的那样需要太多的参数。 (例如 - > input = table_name。)如果上面的方法不可取,那么我会在这里删除shell动作,而宁愿直接去oozie里面的猪动作。但是如何使用自定义罐子帮助我 –