【问题标题】:Oozie shell script actionOozie shell 脚本动作
【发布时间】:2014-03-13 21:25:53
【问题描述】:

我正在探索 Oozie 管理 Hadoop 工作流的功能。我正在尝试设置一个调用一些配置单元命令的 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 和 workflow.xml)并将其设置为通过 workflow.xml 进入分布式缓存。

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

我的 job.properties 文件:

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 作业的 mapreduce 日志?它提供了更多细节吗?
  • 另外,请详细说明Additionally I've tried using hdfs paths in shell scripts and this does not work as far as I know

标签: bash hadoop hive oozie


【解决方案1】:

关于 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>

这条线做了两件事。在 # 之前我们有文件的位置。这只是文件名,因为我们应该将不同的配置单元文件与我们的工作流一起分发

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>

希望对大家有所帮助。

【讨论】:

    【解决方案2】:

    来自

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多