【问题标题】:Spark Kryo Serialization failsSpark Kryo 序列化失败
【发布时间】: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" -&gt; "'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


    【解决方案1】:

    您是否尝试从提交中删除 ',恕我直言,应该是

    --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer"

    你有没有机会从 luigi 提交?

    【讨论】:

    • 我在询问是否要删除包含 conf 参数的单引号,而不是完全删除它
    • 同样的效果,你基本上是在说明配置是否设置正确。
    • 是的,确实如此。我能想到的另一点 - 为什么你注册 Array of Profile 而不是 Profile 本身? - 似乎 spark 有一些将 Profile 作为参数的闭包问题(来自 stacktrace)
    • 我没有。 registerKryoClasses 需要注册的类数组。 Profile 只是这些课程中的第一个。你提到的内容看起来像classOf[Array[Profile]]。不过我很感激你的帮助:-)
    • 遗憾的是,没有涉及到闭包,第 107 行实际上是 .aggregateByKey(new Profile(), 3200),我只是提供了一个零值 :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多