我正在尝试在EMR群集上使用Oozie运行一个简单的Java Spark作业。作业仅从输入路径获取文件,对其执行一些基本操作,然后将结果放置在不同的输出路径中。

当我尝试如下所示使用spark-submit从命令行运行它时,它工作正常:

spark-submit --class com.someClassName --master yarn --deploy-mode cluster /home/hadoop/some-local-path/my-jar-file.jar yarn s3n://input-path s3n://output-path


然后,我在Oozie工作流程中设置了相同的内容。但是,从那里运行时,作业总是失败。标准输出日志包含以下行:

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SparkMain], main() threw exception, Attempt to add (hdfs://[emr-cluster]:8020/user/oozie/workflows/[WF-Name]/lib/[my-jar-file].jar) multiple times to the distributed cache.
java.lang.IllegalArgumentException: Attempt to add (hdfs://[emr-cluster]:8020/user/oozie/workflows/[WF-Name]/lib/[my-jar-file].jar) multiple times to the distributed cache.


我在StackOverflow上找到了一个KB note和另一个question,它处理了类似的错误。但是对于他们来说,由于内部JAR文件而不是用户传递来运行的文件,该作业失败了。但是,我尝试了其解决步骤,以删除share-lib中spark和oozie之间常见的jar文件,并最终从“ / user / oozie / share / lib / lib _ * / spark”中删除了一些文件。不幸的是,那也不能解决问题。

关于如何调试此问题的任何想法?

最佳答案

因此,我们终于找到了问题-至少在我们的情况下。

使用Hue创建工作流时,添加Spark Action时,默认情况下会提示输入“文件”和“ Jar / py名称”。我们在这些字段中分别提供了要运行的JAR文件的路径和该JAR文件的名称,它创建了基本操作,如下所示:
java - java.lang.IllegalArgumentException:尝试多次向分布式缓存添加[[custom-jar-with-spark-code] .jar)-LMLPHP

它创建的最终XML如下:

<action name="spark-210e">
    <spark xmlns="uri:oozie:spark-action:0.2">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <master>yarn</master>
        <mode>cluster</mode>
        <name>CleanseData</name>
          <class>com.data.CleanseData</class>
        <jar>JCleanseData.jar</jar>
          <spark-opts>--driver-memory 2G --executor-memory 2G --num-executors 10 --files hive-site.xml</spark-opts>
          <arg>yarn</arg>
          <arg>[someArg1]</arg>
          <arg>[someArg2]</arg>
        <file>lib/JCleanseData.jar#JCleanseData.jar</file>
    </spark>
    <ok to="[nextAction]"/>
    <error to="Kill"/>
</action>


在我们的案例中,默认的file标记导致了此问题。

因此,我们将其删除并按如下所示将定义编辑为有效。还要注意对<jar>标记的更改。

<action name="spark-210e">
    <spark xmlns="uri:oozie:spark-action:0.2">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <master>yarn</master>
        <mode>cluster</mode>
        <name>CleanseData</name>
          <class>com.data.CleanseData</class>
        <jar>hdfs://path/to/JCleanseData.jar</jar>
          <spark-opts>--driver-memory 2G --executor-memory 2G --num-executors 10 --files hive-site.xml</spark-opts>
          <arg>yarn</arg>
          <arg>[someArg1]</arg>
          <arg>[someArg1]</arg>
    </spark>
    <ok to="[nextAction]"/>
    <error to="Kill"/>
</action>


PS:Hive动作也有类似的问题。我们应该通过Hive动作传递的hive-site.xml文件(创建了<job-xml>标记)也引起了问题。因此,我们将其删除并按预期工作。

07-24 22:25