2015-06-25 44 views
19

在Apache的星火1.4.0打電話時是什麼原因導致這種序列化錯誤:Spark並行? (找不到創作者屬性,名稱爲 'ID')

sc.parallelize(strList, 4) 

時拋出此異常:

com.fasterxml.jackson.databind.JsonMappingException: 
Could not find creator property with name 'id' (in class org.apache.spark.rdd.RDDOperationScope) 

addBeanProps時拋出在傑克遜:com.fasterxml.jackson.databind.deser.BeanDeserializerFactory#addBeanProps

的RDD是一個序列[字符串]和#partitions似乎並不重要(嘗試1,2,4)。

沒有序列化堆棧跟蹤,正常情況下工作者關閉無法序列化。

什麼是追蹤這種情況的另一種方法?

+2

你可以添加一個strList的子集嗎? –

+0

@ LokeshA.R。好的問題 - 沒有,同樣的錯誤,只要調用並行化,甚至硬編碼就像'sc.parallelize(Seq(「one」,「two」,「three」)一樣簡單,1)' –

回答

41

@Interfector是正確的。我也遇到了這個問題,這裏是我的sbt文件和修復它的'dependencyOverrides'部分的一個片段。

libraryDependencies ++= Seq(
    "com.amazonaws" % "amazon-kinesis-client" % "1.4.0", 
    "org.apache.spark" %% "spark-core" % "1.4.0", 
    "org.apache.spark" %% "spark-streaming" % "1.4.0", 
    "org.apache.spark" %% "spark-streaming-kinesis-asl" % "1.4.0", 
    "com.amazonaws" % "aws-java-sdk" % "1.10.2" 
) 

dependencyOverrides ++= Set(
    "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4" 
) 
+1

很棒的建議。通過揭示適當的NotSerializableException,但使用數據綁定版本「2.4.0」,並且只有在構建目錄中刪除多個緩存副本之後,dependencyOverride纔有所幫助。 –

+0

這樣您就可以對傑克遜版本進行硬編碼,我相信如果您只是從AWS SDK中明確排除jackson,那麼效果會更好。這樣,當你升級你將不必考慮傑克遜。最糟糕的情況是,如果不再有問題,您只需刪除排除。 – Interfector

+0

看來這個問題在spark 1.6.0中沒有解決,它會解析'com.fasterxml.jackson.module#jackson-module-scala_2.11; 2.4.4' – code4j

10

我懷疑這是由類路徑爲您提供不同版本的jackson比一個星火引起的期待(即2.4.4,如果我沒有弄錯)。您需要調整您的類路徑,以便Spark首先引用正確的jackson

+0

非常好的建議。你能詳細說明一下嗎?如果從ivy下載spark 1.4.0,那麼uber-jar是否包含適當版本​​的jackson-databind? –

+1

Spark可能包含正確的傑克遜版本,但根據類路徑中的優先級,它可能不是ClassLoader拾取的第一個版本。你可以做的一個方法是使用spark提交併將你的超級jar放在類路徑的末尾。這樣Spark的傑克遜將首先被加載。問題在於這是理論上的問題,它可能會導致AWS SDK出現問題,因爲它也會使用舊版本,這可能會造成問題,特別是在沒有二進制兼容性的情況下。 – Interfector

+0

Interfector出色的建議。使用Spark 1.6時遇到同樣的問題。 jackson-databind 2.4.4 mvn依賴完全解決了這個問題。 – Dilan

1

我不得不用搖籃建項目同樣的問題,我排除了傳遞依賴從已創建問題項目:

dependencies 
{ 
    compile('dependency.causing:problem:version') 
    { 
     exclude module: 'jackson-databind' 
    } 

.... 

} 

完美地爲我工作。

0

這對我有用<dependency> excludeAll ExclusionRule(organization = "com.fasterxml.jackson.core")