2017-05-14 6 views
-2

-スパーク - タスク直列化可能ではない:java.io.NotSerializableException:私は私の火花ジョブのいずれかのエラーの下になっていたをjava.lang.reflect.Field

直列化可能でないタスク:java.io.NotSerializableException:

をjava.lang.reflect.Field

私はメモリ内をjava.lang.reflect.Fieldアレイを維持用いたクロージャのいずれかにクラスを持っていたことに気づきました。 java.lang.reflect.Fieldはjava.io.Serializableを実装していないため、Sparkによってシリアル化されないため、エラーになります。このエラーを解決するにはどうすればよいですか?フィールドを使用することはできません。

  1. 各エグゼキュータで新しいインスタンスを作成し、シリアル化されないようにします。私はhttps://www.nicolaferraro.me/2016/02/22/using-non-serializable-objects-in-apache-spark/を使用しましたが、これは1つのオブジェクトタイプでは動作するようですが、2つでは動作しないようです。
  2. Fieldを使用しているクラスにKryoシリアライザを使用します。これは動作しますか? Kryoはjava.io.Serializableを実装していないクラスでも動作しますか?
  3. ブロードキャスト変数を使用する - これについてはわかりません。ブロードキャスト変数は直列化可能でなければならないのですか?

オブジェクトが本当に何らかの理由でシリアル化できないときに、このNotSerializableExceptionを解決する他の方法は何ですか?

+0

あなたのコードを提供することができますか? –

+0

フィールドを最初にシリアル化する理由は何ですか?受信側で再構成できます。 – EJP

+0

@EJPこれは私が問題を解決するために行ったことですが、コードをリファクタリングして、デザインを変更してクラスからFieldを削除する必要がありました。私は本当に何かがシリアライズできないときに問題を解決する他の方法があるかどうかを知りたかったので、コードからも取り除くことはできませんでした。 –

答えて

0

フィールドを使用できませんか?

コードを理解せずに、これらのFieldインスタンスを使用していないと、私たちはそれに答えることはできません。 (明らかに!)

しかし、それはおそらく間違った質問です。おそらく質問する必要があるのは、Fieldオブジェクトのシリアル化を避けることができるかどうかということです。その答えはYesです。

  • フィールドには、transientとマークすることができます。つまり、彼らは連載されません。 Fieldの参照がちょうどキャッシュされた情報の場合は、それらを参照して、必要に応じて再度キャッシュしてください。

  • Fieldフィールドが属するクラスにカスタムのシリアル化メソッドを追加します。これらは、フィールド名/シグネチャ/文字列データのいずれかをシリアル化し、データがデシリアライズされたときにクラスAPIを介して再度それらを解決しようとする可能性があります。実際には、デシリアライズするコンテキスト内で、相当のFieldオブジェクトを見つけようとします。


私は疑うことKryoまたはブロードキャスト変数(彼らは何でも)。 Fieldは、基本的にはシリアル化できません。これは、転送可能ではないJVMの状態(クラスID)に依存するためです。

アプリケーションでこれらのオブジェクトがどのように使用されているかによって、シリアライゼーションが完全に回避される方法があります。


私はクラスが本当にシリアライズするカントときNotSerializableExceptionを解決するための入力を探していました。

どのような方法でオブジェクトをシリアライズすることができない場合は、どうすればよいかを尋ねています。例えばカスタムシリアル化メソッドが動作しない、Kryoが動作しない、そして何も動作しない(カスタムシリアル化もKryoも動作しない場合、どちらも動作しないことは確かです)。

オブジェクトのシリアル化オプションがない場合は、できることは1つだけです。それをシリアル化しないでください。

これが真の場合のいくつかのクラスがあります。例えばスレッドと多くのSwingクラスとAWTクラスは基本的に非直列化可能です。

+0

クラスが本当にシリアライズできないときに、NotSerializableExceptionを解決するためのインプットを探していたのですが、java.lang.reflect.Fieldを私のプログラムから削除して、コードを貼り付けなかった理由私はFieldを使用するのをやめたのと同じことをやって、Stringの代わりにfieldNameを使い始めました。その後、object.getClass()。getDeclaredField(<>)を使用してFieldが再構築されました。実際の操作が実行されるときに、キャッシングしていました.Fieldは、キャッシュされ、複数回使用できる静的なデータです。 –

関連する問題