我面对一种奇怪的行为。
Spark无法在Map [String,AvroObj]中序列化avro对象,即使我使用了avro-1.8.0,这使得avro对象可以序列化。
Exception in thread "main" org.apache.spark.SparkException: Task not serializable
Caused by: java.io.NotSerializableException: my.avro.Object
Serialization stack:
- object not serializable (class: my.avro.Object, value: {"A": "B", ...})
- writeObject data (class: scala.collection.mutable.HashMap)
- object (class scala.collection.mutable.HashMap
我怀疑SCHEMA $属性仍然不可序列化,但是当我在封闭内单独使用我的AvroObj时,一切运行良好。另外,我也没有问题地广播我的Map [String,AvroObj]。同样,我的avro对象只包含String和long。
然后,为了切换,我必须重建一个新的Object,从我的avro可扩展序列化,然后我的新Map [String,MySerializableObject]没有问题...但我失去了avsc和classe生成的可用性它增加了很多代码。
请注意,我使用的是KryoRegistrator,spark-1.5.0,avro-1.8.0和scala 2.10。
我尝试将地图设置为不可变的,甚至是地图(标识),如此处所述https://issues.scala-lang.org/browse/SI-7005
有没有办法通过这个问题而不必重新定义一个新对象?或者我可能错过了什么?
非常感谢, 的Sebastien
答案 0 :(得分:1)
此问题与Avro架构编译器的任何版本低于1.8有关。 Avro在不实现Serializable
接口的情况下生成Java类,因此当这些Java对象尝试序列化它们时,它会在Spark中导致NotSerializableException
。
该问题已在Avro 1.8.0(2016年1月22日)中得到解决
AVRO-1502. Java: Generated classes now implement Serializable.
Generated classes need to be regenerated to use this release.