从 oozie 提交猪作业
Posted
技术标签:
【中文标题】从 oozie 提交猪作业【英文标题】:Submit pig job from oozie 【发布时间】:2016-01-22 09:56:09 【问题描述】:我正在使用 hadoop 集群中的 oozie 自动化 Pig 作业。
我能够从 oozie 运行示例 pig 脚本,但我的下一个要求是运行 pig 作业,其中 pig 脚本从 shell 脚本接收它的输入参数。 请分享你的想法
【问题讨论】:
使用 shell 动作,在那里运行你的脚本,使用 capture-output 标签并将它输入到你的 pig 动作中。<capture_output>
简介:***.com/questions/32478911/…
【参考方案1】:
更新:
好吧,把原来的问题弄清楚,你怎么能从一个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>
SO.SH
echo "out=test"
SO2.SH
echo "I'm so2.sh and I get the following param:"
echo $1
如果您将第二个 shell 操作替换为您的 pig 操作并将参数传递给 pig 脚本,如下所示:
...
<param>MY_PARAM=$wf:actionData('shell1')['out']</param>
...
比你原来的问题解决了。
关于您的 sharelib 问题,您必须确保在属性中配置了 LIB_PATH=where/you/jars/are 并将此参数交给猪行动,
<param>LIB_PATH=$LIB_PATH</param>
不仅仅是从那里注册罐子:
REGISTER '$LIB_PATH/my_jar'
================================================ ============================ 您正在寻找的是
映射 wf:actionData(字符串节点)
此功能仅适用于产生输出的动作节点 完成数据。
输出数据采用 Java 属性格式并通过此 EL 函数它可以作为 Map 使用。
Documentation 这是一个很好的例子:http://www.infoq.com/articles/oozieexample (实际上你必须像 Samson 在 cmets 中写的那样捕获输出)
Some more details: “如果存在 capture-output 元素,则表明 Oozie 捕获 shell 命令执行的 STDOUT 的输出。Shell 命令输出必须是 Java 属性文件格式,并且不得超过 2KB。在工作流定义中, Shell action 节点的输出可通过 String action:output(String node, String key) 函数访问(请参阅“4.2.6 Action EL Functions”部分)。”
或者你可以使用一个不太好的但简单的工作循环并在猪本身中执行你的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 动作的捕获输出的细节来扩展它 我将 pig 调用命令放在 shell 文件中的原因是因为 pig 需要太多数量的参数作为输入,就像前面评论中提到的那样。 (示例 --> input=table_name。)如果上述方法不可取,那么我将在这里删除 shell 动作,而宁愿直接进入 oozie 中的 pig 动作。但请帮助我了解如何使用自定义罐子 如果您的 oozie 共享库配置正确(检查您的 oozie 属性文件),那么应该可以从 pig 访问这些 jar。您只需要注册它们。由于它们位于共享库文件夹中,因此您无需指定路径。 嗨 kecso,感谢您明确说明如何将 shell 输出拉入另一个节点。上面的例子非常有用。你能帮我用shell脚本运行一个pigscript吗(我不需要shell脚本的任何输出)。只是我正在使用shell脚本调用pigscript((在其中使用此命令:pig -usehcatalog -f sample.pig -p input1 = table_1 -p input2 = table2)。这个问题oozie作业抛出错误说“请初始化HCAT_HOME" 我可以使用 pig 操作直接调用相同的 pig 脚本。使用 shell 操作时我在哪里出错了。以上是关于从 oozie 提交猪作业的主要内容,如果未能解决你的问题,请参考以下文章
oozie java api提交作业,kerberos身份验证错误