NoClassDefFoundError:在 Spark 独立集群上部署后无法初始化 XXX 类

Dr.*_*Pro 5 deployment scala apache-spark spark-streaming spark-submit

我写了一个用 sbt 构建的火花流应用程序。它在本地工作得很好,但是在部署到集群上之后,它抱怨我在胖 jar 中清楚地写了一个类(使用 jar tvf 检查)。以下是我的项目结构。XXX对象是spark抱怨的对象

src
`-- main
    `-- scala
        |-- packageName
        |   `-- XXX object
        `-- mainMethodEntryObject
Run Code Online (Sandbox Code Playgroud)

我的提交命令:

$SPARK_HOME/bin/spark-submit \
  --class mainMethodEntryObject \
  --master REST_URL\
  --deploy-mode cluster \
  hdfs:///FAT_JAR_PRODUCED_BY_SBT_ASSEMBLY
Run Code Online (Sandbox Code Playgroud)

具体错误信息:

java.lang.NoClassDefFoundError: Could not initialize class XXX
Run Code Online (Sandbox Code Playgroud)

Wil*_*ton 3

没有代码很难说,但看起来像是 XXX 对象的序列化问题。我不能说我完全理解为什么,但重点是该对象没有运送到执行者。

对我有用的解决方案是将您的对象转换为扩展的类Serializable,并在您需要的地方实例化它。所以基本上,如果我没记错的话,你有

object test {
   def foo = ...
}
Run Code Online (Sandbox Code Playgroud)

这将在你的 main 中使用test.foo,但你至少需要

class Test extends Serializable {
   def foo = ...
}
Run Code Online (Sandbox Code Playgroud)

然后在你的主要部分val test = new Test开始,就是这样。