我是Yarn的新手,但对Spark独立大师有一些经验,我最近使用Ambari安装了Yarn + Spark群集。
我有一个编译为jar的spark程序(program.jar)依赖于另一个jar来工作(infra.jar)。
我在Ambari中设置了以下配置:
spark.executor.extraClassPath=/root/infra.jar
spark.driver.extraClassPath=/root/infra.jar
我验证了所有节点上都存在该文件,并验证配置是否已推送到所有节点上的$ SPARK_HOME / conf / spark-defaults.conf。
实际上我还将它复制到所有节点上的$ SPARK_HOME / jars。
我使用以下方式运行作业:
$SPARK_HOME/bin/spark-submit --master yarn --class com.MyMainClass /root/program.jar
我有以下env变量:
export HADOOP_CONF_DIR=/usr/hdp/2.6.3.0-235/hadoop/conf
export HADOOP_HOME=/usr/hdp/2.6.3.0-235/hadoop
我收到错误:
Caused by: java.lang.ClassNotFoundException: com.MyPartition
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.spark.serializer.JavaDeserializationStream$$anon$1.resolveClass(JavaSerializer.scala:67)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75)
at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
MyPartition
类位于infra.jar
但由于某种原因未找到。
此代码看起来像是在Executor中调用,也有一些代码运行 - 这是驱动程序代码。
P.S。我尝试通过--jars
标志或addJars
手动添加jar但它仍然失败并且ClassNotFoundException(尽管出于某些奇怪的原因,来自infra.jar的不同类)