如果在SparkAction中使用PySpark,Oozie作业将无法运行

我在Oozie中遇到过几个SparkAction作业的例子,其中大多数都是用Java编写的。 我编辑了一下并在Cloudera CDH Quickstart 5.4.0(使用Spark版本1.4.0)中运行该示例。

workflow.xml

    ${jobTracker} ${nameNode}    ${master} ${mode} Spark-FileCopy org.apache.oozie.example.SparkFileCopy ${nameNode}/user/${wf:user()}/${examplesRoot}/apps/spark/lib/oozie-examples.jar ${nameNode}/user/${wf:user()}/${examplesRoot}/input-data/text/data.txt ${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/spark      Workflow failed, error message[${wf:errorMessage(wf:lastErrorNode())}]     

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作业。 我尝试删除和jar

 my_pyspark_job.py 

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

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

我想知道如果我使用Python / PySpark,我应该在标签中放置什么?

我在oozie的火花动作中也经常挣扎。 我正确设置了sharelib并试图使用 标签中的–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工作流程。

     ${jobTracker} ${nameNode}   oozie.launcher.mapred.job.queue.name launcher2   mapred.job.queue.name default   oozie.hive.defaults /user/ambari-qa/sparkActionPython/hive-site.xml   /usr/hdp/current/spark-client/bin/spark-submit --master yarn-cluster wordcount.py HADOOP_USER_NAME=ambari-qa /user/ambari-qa/sparkActionPython/wordcount.py#wordcount.py       Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]    

希望这可以帮助!

您应该尝试配置Oozie Spark操作以在本地引入所需的文件。 您可以使用文件标记来创建它:

  ${resourceManager} ${nameNode} local[2] client ${name} my_pyspark_job.py {path to your file on hdfs}/my_pyspark_job.py#my_pyspark_job.py  

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

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

   ${jobTracker} ${nameNode} ${appPath}/run-hive-partitioner.bash ${db} ${tables} ${base_working_dir} ${appPath}/run-hive-partitioner.bash#run-hive-partitioner.bash ${appPath}/hive-generic-partitioner.py#hive-generic-partitioner.py ${appPath}/util.py#util.py     

其中$ {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(或者我认为实际的纱线)将所有需要的文件本地传送到temp文件夹,现在它可以运行它。

虽然它导致了另一个问题,但我能够“解决”这个问题。 尽管如此,我仍然会发布它。

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

 Error: Only local python files are supported 

我在这里找到了解决方案

这是我的初始workflow.xml:

   ${resourceManager} ${nameNode} local[2] client ${name} my_pyspark_job.py  

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

 //my_pyspark_job.py 

我们得到了同样的错误。 如果你尝试将spark-assembly jar从’/path/to/spark-install/lib/spark-assembly*.jar’(取决于发行版)放到你的应用程序旁边的oozie.wf.application.path/lib dir它应该工作。