Hive 从oozie提交猪作业

Hive 从oozie提交猪作业,hive,apache-pig,oozie,oozie-coordinator,Hive,Apache Pig,Oozie,Oozie Coordinator,我正在hadoop集群中使用oozie实现猪作业的自动化 我能够从oozie运行一个示例pig脚本,但我的下一个要求是运行一个pig作业,其中pig脚本从shell脚本接收它的输入参数。 请分享您的想法更新: 好的,请澄清原始问题,如何从shell脚本输出传递参数。以下是工作示例: WORKFLOW.XML <workflow-app xmlns='uri:oozie:workflow:0.3' name='shell-wf'> <start to='shell1' /

我正在hadoop集群中使用oozie实现猪作业的自动化

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

更新:

好的,请澄清原始问题,如何从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>
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>
...
========================================================================== 你要找的是

映射wf:actionData(字符串节点)

此函数仅适用于生成输出的操作节点 竣工数据

输出数据采用Java属性格式,并通过此EL 功能它以地图的形式提供

下面是一个很好的例子: (实际上,您必须按照Samson在评论中所写的那样捕获输出)

: “如果存在capture output元素,则表示Oozie要捕获shell命令执行的STDOUT的输出。shell命令输出必须是Java属性文件格式,并且不能超过2KB。在工作流定义中,可以通过字符串action:output访问shell操作节点的输出。”(字符串节点,字符串键)功能(请参阅“4.2.6动作EL功能”一节)。”

或者,您可以使用一个不太好但简单的工作循环,在清管器中执行shell脚本,并将其结果保存在变量中,然后使用该变量。如下所示:

%DEFINE MY_VAR `echo "/abc/cba'`
A = LOAD '$MY_VAR' ...

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

更新:

好的,请澄清最初的问题,如何从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>
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>
...
========================================================================== 你要找的是

映射wf:actionData(字符串节点)

此函数仅适用于生成输出的操作节点 竣工数据

输出数据采用Java属性格式,并通过此EL 功能它以地图的形式提供

下面是一个很好的例子: (实际上,您必须按照Samson在评论中所写的那样捕获输出)

: “如果存在capture output元素,则表示Oozie要捕获shell命令执行的STDOUT的输出。shell命令输出必须是Java属性文件格式,并且不能超过2KB。在工作流定义中,可以通过字符串action:output访问shell操作节点的输出。”(字符串节点,字符串键)功能(请参阅“4.2.6动作EL功能”一节)。”

或者,您可以使用一个不太好但简单的工作循环,在清管器中执行shell脚本,并将其结果保存在变量中,然后使用该变量。如下所示:

%DEFINE MY_VAR `echo "/abc/cba'`
A = LOAD '$MY_VAR' ...

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

使用shell操作,在那里运行脚本,使用捕获输出标记并将其输入到pig操作中。此处:使用shell操作,在那里运行脚本,使用捕获输出标记并将其输入到pig操作中。
的简短介绍re:您好,感谢您提供的解决方案,现在我有一些其他要求,我在pig脚本中使用一些自定义库。我将所有依赖库都放在/user/oozie/share/lib/中。我有一个简单的pig脚本,调用pig的对应shell脚本有以下内容-->pig-useHCatalogue-f test.pig-p input=table_name;现在我尝试从oozie shell action调用此shell脚本。但是作业退出时出现以下错误:Main类[org.apache.oozie.action.hadoop.ShellMain],退出代码[1]我真的不认为这是一个好主意,让我更新我的答案,并用更多关于如何使用shell操作的捕获输出的细节来扩展它。我之所以将pig invoke命令放在shell文件中,是因为pig将太多的参数作为输入,就像前面的评论中提到的那样。(示例-->输入=表_名称。)如果不建议使用上述方法,则我将在此处删除shell操作,而希望直接转到oozie内部的pig操作。但是,请帮助我了解如何在正确配置oozie共享库的情况下使用自定义JARSI(检查oozie属性文件)JAR应该可以从pig访问。您只需要注册它们。因为它们被放置在共享库文件夹中,所以您不需要指定路径。嗨,kecso,感谢您明确说明如何将外壳输出拉入另一个节点。上面的示例非常有用。您能帮我使用外壳脚本运行pigscript吗(我不需要shell脚本的任何输出)。只是我正在使用shell脚本调用一个pigscript((在其中使用这个命令:pig-usehcatalog-f sample.pig-p input1=table_1-p input2=table 2)。这个问题oozie作业抛出了一个错误,说“请初始化HCAT_HOME”我可以使用pig操作直接调用同一个pig脚本。当使用shell操作时,我哪里出了问题。您好,感谢您提供的解决方案。现在我有一些其他要求,我在pig脚本中使用一些自定义库。我已经将所有依赖库放在/user/oozie/share/lib/中。我有一个简单的pig脚本和调用pig的对应shell脚本具有以下内容-->pig-useHCatalogue-f test.pig-p input=table_name;现在我正试图从oozie shell action调用此shell脚本。但是作业退出时出现以下错误:Main类[org.apache.oozie.action.hadoop.ShellMain],退出代码[1]我真的不认为这是个好主意,让我更新我的答案,并用更多细节来扩展它