2016-06-22 8 views
0

私は奇妙な動作に直面しています。avroオブジェクトはMapの値としてシリアライズできません - Spark

avroオブジェクトをシリアライズ可能にするavro-1.8.0を使用した後でも、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 

私はSCHEMA $属性がまだ直列化可能ではないと思われるが、私はクロージャ内の一人で、私のAvroObjを使用する場合、すべてがうまく動作します。また、Map [String、AvroObj]も問題なくブロードキャストしました。ここでも、私のavroオブジェクトにはStringとlongのみが含まれています。

次に、私の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

説明するように、不変、あるいはマップ(アイデンティティ)としてマップを設定しようとしましたか?または私は何かを逃したかもしれませんか?

はあなたにたくさんありがとう、 セバスチャン

答えて

1

この問題は、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. 
で解決されました。
関連する問題