Oozie shell脚本动作



我正在探索Oozie管理Hadoop工作流的功能。我试图建立一个调用一些hive命令的shell操作。我的shell脚本hive.sh如下所示:

#!/bin/bash
hive -f hivescript

hive脚本(已经独立测试过)创建了一些表等等。我的问题是在哪里保持hivescript,然后如何从shell脚本引用它。

我尝试了两种方法,首先使用本地路径,如hive -f /local/path/to/file,并使用像上面这样的相对路径,hive -f hivescript,在这种情况下,我保持我的hivescript在oozie应用程序路径目录(与hive.sh和工作流.xml相同),并将其设置为通过工作流.xml去分布式缓存。

使用这两种方法,我得到错误消息:oozie web控制台上的"Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1]"。此外,我试过在shell脚本中使用hdfs路径,据我所知,这不起作用。

我的工作。属性文件:

nameNode=hdfs://sandbox:8020
jobTracker=hdfs://sandbox:50300   
queueName=default
oozie.libpath=${nameNode}/user/oozie/share/lib
oozie.use.system.libpath=true
oozieProjectRoot=${nameNode}/user/sandbox/poc1
appPath=${oozieProjectRoot}/testwf
oozie.wf.application.path=${appPath}

和workflow.xml:

<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>${appPath}/hive.sh</exec>
    <file>${appPath}/hive.sh</file> 
    <file>${appPath}/hive_pill</file>
</shell>
<ok to="end"/>
<error to="end"/>
</action>
<end name="end"/>

我的目标是使用oozie通过shell脚本调用hive脚本,请给出您的建议

关于Oozie工作流的一个棘手的问题是bash脚本的执行。Hadoop是为大规模并行而创建的,因此其体系结构与您想象的非常不同。

当oozie工作流执行shell操作时,它将从您的作业跟踪器或集群中任何节点上的YARN接收资源。这意味着为文件使用本地位置将不起作用,因为本地存储仅在边缘节点上。如果作业碰巧在你的边缘节点上生成,那么它就会工作,但其他时候它就会失败,而且这个分布是随机的。

为了解决这个问题,我发现最好将我需要的文件(包括sh脚本)放在hdfs的lib空间或与我的工作流相同的位置。

这是一个很好的方法来接近你想要达到的目标。

<shell xmlns="uri:oozie:shell-action:0.1">
    <exec>hive.sh</exec> 
    <file>/user/lib/hive.sh#hive.sh</file>
    <file>ETL_file1.hql#hivescript</file>
</shell>

您将注意到的一件事是,exec只是hive.sh,因为我们假设该文件将被移动到完成shell操作的基本目录

为了确保最后一个注意事项是正确的,您必须包含文件的hdfs路径,这将强制oozie将该文件与操作一起分发。在您的情况下,hive脚本启动器应该只编码一次,并简单地提供不同的文件。因为我们有一对多的关系,hive.sh应该保存在一个库中,而不是与每个工作流一起分发。

最后你看到这行:

<file>ETL_file1.hql#hivescript</file>

这一行做了两件事。在#之前,我们有文件的位置。它只是文件名,因为我们应该在我们的工作流中分发不同的hive文件

user/directory/workflow.xml
user/directory/ETL_file1.hql

和运行sh的节点将自动将此分发给它。最后,#后面的部分是我们在sh脚本中分配给它的变量名。这使您能够一遍又一遍地重用相同的脚本,并简单地为其提供不同的文件。

HDFS目录注释,

如果文件与工作流嵌套在同一个目录中,那么你只需要指定子路径:

user/directory/workflow.xml
user/directory/hive/ETL_file1.hql

将收益率:

<file>hive/ETL_file1.hql#hivescript</file>

但是如果路径在工作流目录之外,你将需要完整的路径:

user/directory/workflow.xml
user/lib/hive.sh

将收益率:

<file>/user/lib/hive.sh#hive.sh</file>

From

http://oozie.apache.org/docs/3.3.0/DG_ShellActionExtension.html Shell_Action_Schema_Version_0.2

如果你把你的shell脚本和hive脚本都放在工作流的某个文件夹中,那么你可以执行它们。

参见示例

中的命令
<exec>${EXEC}</exec>
        <argument>A</argument>
        <argument>B</argument>
        <file>${EXEC}#${EXEC}</file> <!--Copy the executable to compute node's current     working directory -->

你可以在文件

里写任何你想写的命令

你也可以直接使用use hive action

http://oozie.apache.org/docs/3.3.0/DG_HiveActionExtension.html

相关内容

  • 没有找到相关文章

最新更新