【问题标题】:Oozie job won't run if using PySpark in SparkAction如果在 SparkAction 中使用 PySpark,Oozie 作业将不会运行
【发布时间】:2015-07-16 09:48:38
【问题描述】:

我在 Oozie 中遇到过几个 SparkAction 作业的示例,其中大部分都使用 Java。我稍作编辑并在 Cloudera CDH Quickstart 5.4.0(使用 Spark 版本 1.4.0)中运行示例。

工作流.xml

<workflow-app xmlns='uri:oozie:workflow:0.5' name='SparkFileCopy'>
    <start to='spark-node' />

    <action name='spark-node'>
        <spark xmlns="uri:oozie:spark-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/spark"/>
            </prepare>
            <master>${master}</master>
        <mode>${mode}</mode>    
            <name>Spark-FileCopy</name>
            <class>org.apache.oozie.example.SparkFileCopy</class>
            <jar>${nameNode}/user/${wf:user()}/${examplesRoot}/apps/spark/lib/oozie-examples.jar</jar>
            <arg>${nameNode}/user/${wf:user()}/${examplesRoot}/input-data/text/data.txt</arg>
            <arg>${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/spark</arg>
        </spark>
        <ok to="end" />
        <error to="fail" />
    </action>

    <kill name="fail">
        <message>Workflow failed, error
            message[${wf:errorMessage(wf:lastErrorNode())}]
        </message>
    </kill>
    <end name='end' />
</workflow-app>

job.properties

nameNode=hdfs://quickstart.cloudera:8020
jobTracker=quickstart.cloudera:8032
master=local[2]
mode=client
examplesRoot=examples
oozie.use.system.libpath=true
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/spark

Oozie 工作流示例(Java 中)能够完成并完成其任务。

不过,我已经使用 Python / PySpark 编写了 spark-submit 作业。我尝试删除 &lt;class&gt; 和 jar

<jar>my_pyspark_job.py</jar>

但是当我尝试运行 Oozie-Spark 作业时,日志中出现错误:

Launcher ERROR, reason: Main class [org.apache.oozie.action.hadoop.SparkMain], exit code [2]

我想知道如果我使用 Python / PySpark,我应该在 &lt;class&gt;&lt;jar&gt; 标签中放置什么?

【问题讨论】:

    标签: java apache-spark oozie pyspark cloudera-quickstart-vm


    【解决方案1】:

    我也为 oozie 中的火花动作而苦苦挣扎。我正确设置了 sharelib,并尝试使用 &lt;spark-opts&gt; &lt;/spark-opts&gt; 标签中的 --jars 选项传递适当的 jar,但无济于事。

    我总是遇到一些错误或其他错误。我能做的最多就是通过 spark-action 在本地模式下运行所有​​ java/python spark 作业。

    但是,我使用 shell 操作以所有执行模式在 oozie 中运行所有 spark 作业。 shell 操作的主要问题是 shell 作业被部署为“纱线”用户。如果您碰巧从 yarn 以外的用户帐户部署 oozie spark 作业,最终会出现 Permission Denied 错误(因为用户将无法访问复制到 /user/yarn/.SparkStaging 的 spark 程序集 jar目录)。解决此问题的方法是将 HADOOP_USER_NAME 环境变量设置为您部署 oozie 工作流所使用的用户帐户名称。

    以下是说明此配置的工作流程。我从 ambari-qa 用户部署我的 oozie 工作流。

    <workflow-app xmlns="uri:oozie:workflow:0.4" name="sparkjob">
        <start to="spark-shell-node"/>
        <action name="spark-shell-node">
            <shell xmlns="uri:oozie:shell-action:0.2">
                <job-tracker>${jobTracker}</job-tracker>
                <name-node>${nameNode}</name-node>
                <configuration>
                    <property>
                        <name>oozie.launcher.mapred.job.queue.name</name>
                        <value>launcher2</value>
                    </property>
                    <property>
                        <name>mapred.job.queue.name</name>
                        <value>default</value>
                    </property>
                    <property>
                        <name>oozie.hive.defaults</name>
                        <value>/user/ambari-qa/sparkActionPython/hive-site.xml</value>
                    </property>
                </configuration>
                <exec>/usr/hdp/current/spark-client/bin/spark-submit</exec>
                <argument>--master</argument>
                <argument>yarn-cluster</argument>
                <argument>wordcount.py</argument>
                <env-var>HADOOP_USER_NAME=ambari-qa</env-var>
                <file>/user/ambari-qa/sparkActionPython/wordcount.py#wordcount.py</file>
                <capture-output/>
            </shell>
            <ok to="end"/>
            <error to="spark-fail"/>
        </action>
        <kill name="spark-fail">
            <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
        </kill>
        <end name="end"/>
    </workflow-app>
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您应该尝试配置 Oozie Spark 操作以将所需文件带到本地。您可以使用 file 标记:

      <spark xmlns="uri:oozie:spark-action:0.1">
              <job-tracker>${resourceManager}</job-tracker>
              <name-node>${nameNode}</name-node>
              <master>local[2]</master>
              <mode>client</mode>
              <name>${name}</name>
              <jar>my_pyspark_job.py</jar>
              <file>{path to your file on hdfs}/my_pyspark_job.py#my_pyspark_job.py</file>
          </spark>
      

      说明: Oozie 动作在 YARN 容器内运行,该容器由 YARN 在具有可用资源的节点上分配。在运行操作(实际上是“驱动程序”代码)之前,它将所有需要的文件(例如 jars)本地复制到节点到为 YARN 容器分配的文件夹中以放置其资源。因此,通过向 oozie 操作添加标签,您可以“告诉”您的 oozie 操作将 my_pyspark_job.py 本地带到执行节点。

      在我的情况下,我想运行一个 bash 脚本 (run-hive-partitioner.bash),它将运行一个 python 代码 (hive-generic-partitioner.py),所以我需要节点上本地可访问的所有文件:

      <action name="repair_hive_partitions">
        <shell xmlns="uri:oozie:shell-action:0.1">
          <job-tracker>${jobTracker}</job-tracker>
          <name-node>${nameNode}</name-node>
          <exec>${appPath}/run-hive-partitioner.bash</exec>
               <argument>${db}</argument>
               <argument>${tables}</argument>
               <argument>${base_working_dir}</argument>
          <file>${appPath}/run-hive-partitioner.bash#run-hive-partitioner.bash</file>
          <file>${appPath}/hive-generic-partitioner.py#hive-generic-partitioner.py</file>
           <file>${appPath}/util.py#util.py</file>     
        </shell>
        <ok to="end"/>
        <error to="kill"/>
      </action>
      

      其中 ${appPath} 是 hdfs://ci-base.com:8020/app/oozie/util/wf-repair_hive_partitions

      这就是我在工作中得到的:

      Files in current dir:/hadoop/yarn/local/usercache/hdfs/appcache/application_1440506439954_3906/container_1440506439954_3906_01_000002/
      
      ======================
      File: hive-generic-partitioner.py
      File: util.py
      File: run-hive-partitioner.bash
      ...
      File: job.xml
      File: json-simple-1.1.jar
      File: oozie-sharelib-oozie-4.1.0.2.2.4.2-2.jar
      File: launch_container.sh
      File: oozie-hadoop-utils-2.6.0.2.2.4.2-2.oozie-4.1.0.2.2.4.2-2.jar
      

      正如你所看到的,oozie(或者实际上是我认为是 yarn)将所有需要的文件本地发送到 temp 文件夹,现在它可以运行它了。

      【讨论】:

      • 您好,文件标签不工作火花动作。请告诉我如何在 spark 操作中将文件带到本地
      • 文件标签仅适用于 Oozie 4.3.0,您应该使用 uri:oozie:spark-action:0.2 - 检查文档oozie.apache.org/docs/4.3.0/…
      【解决方案3】:

      我能够“修复”这个问题,尽管它会导致另一个问题。尽管如此,我仍然会发布它。

      在 Oozie 容器日志的 stderr 中,显示:

      Error: Only local python files are supported
      

      我找到了解决方案here

      这是我最初的 workflow.xml:

          <spark xmlns="uri:oozie:spark-action:0.1">
              <job-tracker>${resourceManager}</job-tracker>
              <name-node>${nameNode}</name-node>
              <master>local[2]</master>
              <mode>client</mode>
              <name>${name}</name>
              <jar>my_pyspark_job.py</jar>
          </spark>
      

      我最初所做的是将我希望作为 spark-submit 作业运行的 Python 脚本复制到 HDFS。原来它需要本地文件系统中的 .py 脚本,所以我所做的就是引用我的脚本的绝对本地文件系统。

      <jar>/<absolute-local-path>/my_pyspark_job.py</jar>
      

      【讨论】:

        【解决方案4】:

        我们遇到了同样的错误。如果您尝试将 spark-assembly jar 从“/path/to/spark-install/lib/spark-assembly*.jar”(取决于分发)放到您的应用程序 jar 旁边的 oozie.wf.application.path/lib 目录中,它应该可以工作。

        【讨论】:

          猜你喜欢
          • 2016-04-24
          • 1970-01-01
          • 1970-01-01
          • 2015-12-05
          • 2013-12-04
          • 1970-01-01
          • 1970-01-01
          • 2017-07-17
          • 1970-01-01
          相关资源
          最近更新 更多