2017-04-26 67 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開頭就是這樣。

相關問題