2016-06-22 32 views
0

我正面臨一個奇怪的行爲。avro對象不可序列化爲一個Map的值 - Spark

即使在使用avro-1.8.0(這使avro對象可序列化)之後,Spark也無法序列化Map [String,AvroObj]中的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 

我懷疑架構$屬性依然沒有序列化的,但是當我用我的AvroObj獨自一瓶蓋內,一切正常。另外,我也沒有問題地廣播我的地圖[String,AvroObj]。同樣,我的avro對象只包含String和long。

然後,爲了切換,我必須重建一個新的對象,從我的avro可序列化,然後我的新Map [String,MySerializableObject]沒有問題...但我失去了從avsc它增加了很多代碼。

請注意,我使用KryoRegistrator,spark-1.5.0,avro-1.8.0和scala 2.10。

我想這裏描述https://issues.scala-lang.org/browse/SI-7005

有沒有辦法通過傳遞這個問題不必重新定義一個新的對象,設置地圖爲不可變的,甚至是地圖(身份)?或者我可能錯過了什麼?

謝謝了很多, 塞巴斯蒂安

回答

1

這個問題涉及到的Avro架構編譯任何版本小於1.8。 Avro生成Java類而不實現Serializable接口,因此當它試圖序列化它們時,此類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. 
相關問題