Oozie Spark 动作失败

Posted

技术标签:

【中文标题】Oozie Spark 动作失败【英文标题】:Oozie Spark Action failing 【发布时间】:2018-05-17 09:29:32 【问题描述】:

我有一个简单的 spark 应用程序,它正在读取 csv 数据,然后写入 avro。这个应用程序在作为 spark-submit 命令行提交时工作正常,但在尝试从 oozie spark action 执行时失败并出现以下错误。 错误信息:


Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SparkMain], main() threw exception, net.jpountz.lz4.LZ4BlockInputStream.<init>(Ljava/io/InputStream;Z)V
java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream.<init>(Ljava/io/InputStream;Z)V
    at org.apache.spark.io.LZ4CompressionCodec.compressedInputStream(CompressionCodec.scala:122)
    at org.apache.spark.sql.execution.SparkPlan.org$apache$spark$sql$execution$SparkPlan$$decodeUnsafeRows(SparkPlan.scala:274)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeTake$1.apply(SparkPlan.scala:366)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeTake$1.apply(SparkPlan.scala:366)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)

Oozie 详细信息:

job.properties 
nameNode=NAMEMODE:8020
jobTracker=JT:8032
queueName=default
oozie.use.system.libpath=true
oozie.wf.application.path=$nameNode/user/oozie/spark/

工作流.xml

<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
    <start to="sparkAction" />
    <action name="sparkAction">
        <spark xmlns="uri:oozie:spark-action:0.1">
            <job-tracker>$jobTracker</job-tracker>
            <name-node>$nameNode</name-node>
            <configuration>
            <property>
                        <name>oozie.launcher.mapreduce.map.memory.mb</name>
                        <value>1024</value>
                        </property>
                                <property>
                                    <name>oozie.launcher.mapreduce.map.java.opts</name>
                                    <value>-Xmx777m</value>
                                </property>
                                <property>
                                  <name>oozie.launcher.yarn.app.mapreduce.am.resource.mb</name>
                                         <value>2048</value>
</property>
<property>
    <name>oozie.launcher.mapreduce.map.java.opts</name>
    <value>-Xmx1111m</value>
</property>
            </configuration>
            <master>yarn</master>
            <mode>client</mode>
            <name>tssETL</name>
            <class>com.sc.eni.main.tssStart</class>
            <jar>$nameNode/user/oozie/spark/tss-assembly-1.0.jar</jar>
            <spark-opts>--driver-memory 512m --executor-memory 512m --num-executors 1 </spark-opts>
            </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>

在作业跟踪器中,MAP Reduce 作业与调用 Spark Action 一样成功,但在那里失败了,但总体上 Oozie 失败了。

使用过的版本

EMR Cluster: emr-5.13.0
Spark : 2.3
Scala 2.11

我还检查了 hdfs 中的 oozie 共享库:/user/oozie/share/lib/lib_20180517102659/spark,它包含 lz4-1.3.0.jar,其中包含错误提到的 net.jpountz.lz4.LZ4BlockInputStream 类。

任何帮助将不胜感激,因为我为此苦苦挣扎了很长时间。

非常感谢

【问题讨论】:

【参考方案1】:

Oozie 给了

java.lang.NoSuchMethodError

当一个库通过多种方式可用时,就会产生冲突。既然你已经指定了

oozie.use.system.libpath=true

所以它可以使用所有的 Oozie spark 共享库,并且 build build.sbt 中提到的所有 jars 也都可用。

要解决此问题,请检查您在 build.sbt 中提到的哪些依赖项也存在于 oozie spark 共享库文件夹中,然后在这些依赖项中添加“% provided”,这会将它们从程序集 jar 中删除,因此不会有罐子冲突。

【讨论】:

以上是关于Oozie Spark 动作失败的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark Phoenix 集成在 oozie 工作流程中失败

在 Oozie-Spark 动作中添加多个罐子

使用火花动作在 Oozie 中的 python Spark 作业

Oozie Spark (2.x) 动作总是卡在接受状态

oozie sqoop 动作具有 --map-column-java

Oozieambari安装oozie失败