2015-06-25 26 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")