【发布时间】:2016-07-02 18:19:30
【问题描述】:
我有一段 Spark 代码在 Spark 1.3 上运行,但在我将其移至 Spark 1.5.2 时失败(集群升级不受我的控制)。失败如下:
Caused by: java.io.NotSerializableException: com.location.model.Profile
Serialization stack:
- object not serializable (class: com.location.model.Profile, value: com.location.model.Profile@596032b0)
- field (class: org.apache.spark.rdd.PairRDDFunctions$$anonfun$aggregateByKey$1, name: zeroValue$3, type: class java.lang.Object)
- object (class org.apache.spark.rdd.PairRDDFunctions$$anonfun$aggregateByKey$1, <function0>)
- field (class: org.apache.spark.rdd.PairRDDFunctions$$anonfun$aggregateByKey$1$$anonfun$1, name: $outer, type: class org.apache.spark.rdd.PairRDDFunctions$$anonfun$aggregateByKey$1)
- object (class org.apache.spark.rdd.PairRDDFunctions$$anonfun$aggregateByKey$1$$anonfun$1, <function0>)
- field (class: org.apache.spark.rdd.PairRDDFunctions$$anonfun$aggregateByKey$1$$anonfun$apply$10, name: createZero$1, type: interface scala.Function0)
- object (class org.apache.spark.rdd.PairRDDFunctions$$anonfun$aggregateByKey$1$$anonfun$apply$10, <function1>)
at org.apache.spark.serializer.SerializationDebugger$.improveException(SerializationDebugger.scala:40)
at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:47)
at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:84)
at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:301)
有趣的是,手头的类 Profile 被声明为 class Profile() extends KryoSerializable 并覆盖了该接口的读/写方法。
我还将此配置设置为 Spark-submit:"--conf" -> "'spark.serializer=org.apache.spark.serializer.KryoSerializer'" 并通过 conf.registerKryoClasses(Array(
classOf[Profile], ... 向 Kryo 注册了 Profile 类
所以一切都按照Spark Tunning guide 中的说明进行,并且之前运行良好。
请注意,异常显示ClosureCleaner 正在使用JavaSerializerInstance,实际上,如果我将extends Serializable 添加到Profile 类中,它就可以工作。但是我不确定它为什么要使用该序列化程序,或者如果我特别要求 Kryo,为什么我应该与 Java 序列化兼容。
编辑:我什至完全删除了参数,因为registerKryoClasses 下的代码无论如何都会设置属性。事实上,我怀疑正在使用 Kryo 序列化(我在 write 中添加了一个 println 并且它出现了,但是之前的某种验证是不正确的)。
【问题讨论】:
标签: scala apache-spark serialization kryo