直列化可能でないタスク:java.io.NotSerializableException:
をjava.lang.reflect.Field
私はメモリ内をjava.lang.reflect.Fieldアレイを維持用いたクロージャのいずれかにクラスを持っていたことに気づきました。 java.lang.reflect.Fieldはjava.io.Serializableを実装していないため、Sparkによってシリアル化されないため、エラーになります。このエラーを解決するにはどうすればよいですか?フィールドを使用することはできません。
- 各エグゼキュータで新しいインスタンスを作成し、シリアル化されないようにします。私はhttps://www.nicolaferraro.me/2016/02/22/using-non-serializable-objects-in-apache-spark/を使用しましたが、これは1つのオブジェクトタイプでは動作するようですが、2つでは動作しないようです。
- Fieldを使用しているクラスにKryoシリアライザを使用します。これは動作しますか? Kryoはjava.io.Serializableを実装していないクラスでも動作しますか?
- ブロードキャスト変数を使用する - これについてはわかりません。ブロードキャスト変数は直列化可能でなければならないのですか?
オブジェクトが本当に何らかの理由でシリアル化できないときに、このNotSerializableExceptionを解決する他の方法は何ですか?
あなたのコードを提供することができますか? –
フィールドを最初にシリアル化する理由は何ですか?受信側で再構成できます。 – EJP
@EJPこれは私が問題を解決するために行ったことですが、コードをリファクタリングして、デザインを変更してクラスからFieldを削除する必要がありました。私は本当に何かがシリアライズできないときに問題を解決する他の方法があるかどうかを知りたかったので、コードからも取り除くことはできませんでした。 –