2017-04-26 68 views
2

我写了一个使用sbt构建的Spark应用程序。它在本地很好地工作,但是在集群上部署后,它抱怨我写的类在fat jar中很清楚(使用jar tvf进行检查)。以下是我的项目结构。 XXX对象是火花抱怨NoClassDefFoundError:在部署在火花独立群集上后无法初始化XXX类

src 
`-- main 
    `-- scala 
     |-- packageName 
     | `-- XXX object 
     `-- mainMethodEntryObject 

我提交了一个命令:

$SPARK_HOME/bin/spark-submit \ 
    --class mainMethodEntryObject \ 
    --master REST_URL\ 
    --deploy-mode cluster \ 
    hdfs:///FAT_JAR_PRODUCED_BY_SBT_ASSEMBLY 

特定错误消息:

java.lang.NoClassDefFoundError: Could not initialize class XXX 
+0

你可以添加用于启动作业的命令吗?当你运行'jar tvf'它返回什么响应? –

+0

@techsquids当然,请参阅上面的 –

+0

'jar tvf'它是否列出jar根目录下的包名? –

回答

0

这很难不代码地说,但它看起来像一个XXX对象序列化的问题。我不能说我完全理解为什么,但重点是该对象不会被运送给执行者。

对我而言,解决方案是将您的对象转换为一个类,该类延伸Serializable,并在需要时将其实例化。所以基本上,如果我没看错你有

object test { 
    def foo = ... 
} 
这将作为你的主要 test.foo

,但你需要在最低

class Test extends Serializable { 
    def foo = ... 
} 

,然后在你的主要有val test = new Test开头就是这样。

相关问题