我有一段星火代码,在星火1.3的工作,但是当我将它移动到星火1.5.2(集群升级了我的控制)失败。故障如下:星火KRYO序列化失败
Caused by: java.io.NotSerializableException: com.location.model.Profile
Serialization stack:
- object not serializable (class: com.location.model.Profile, value: [email protected])
- 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
和覆盖该接口的读/写方法。
我还设置这个配置的火花提交:"--conf" -> "'spark.serializer=org.apache.spark.serializer.KryoSerializer'"
和因此,所有根据在Spark Tunning guide指令做conf.registerKryoClasses(Array( classOf[Profile], ...
注册Profile
类KRYO,和它之前很好的工作。 注意,除了显示JavaSerializerInstance
正在使用的ClosureCleaner
,而事实上如果我添加extends Serializable
到Profile
类它的工作原理。但我不确定它为什么使用该序列化器,也不知道为什么我应该与Java序列化兼容,如果我特别要求Kryo。
编辑:我甚至完全除去参数,因为registerKryoClasses
下代码设置在任何情况下的特性。事实上,我怀疑正在使用KRYO序列化(我加了一个println内write
和它的出现,但某种先前确认的是不正确的)。
是的,我有。我编辑了这个问题来反映这一点。 –
我在问关于包装你的conf参数的removig单引号,而不是完全删除它 –
同样的效果,你基本上说明是否正确设置了配置。 –