Spark 1.6.2からSpark 2.0.2にアプリケーションをアップグレードしています。この問題は厳密にはスパーク関連ではありません。スパーク1.6.2にはKryo 2.21が含まれています。 Spark 2.0.2にはKryo 3.0.3が含まれています。Spark 2.0にアップグレードする際のKryo登録の問題
このアプリケーションは、HDS上にKryoでシリアル化されたいくつかのデータを保存します。スペースを節約するために、Kryo登録が強制されます。クラスがKryoに登録されると、シーケンシャルIDが取得され、このIDはフルクラス名ではなくワイヤ形式でクラスを表すために使用されます。新しいクラスを登録するときは、常に最後に置くので、未使用のIDが取得されます。また、クラスを登録から削除することもありません。 (クラスが削除された場合は、その場所にプレースホルダを登録してIDを予約します)。この方法でIDは安定し、アプリケーションの1つのバージョンは以前のバージョンによって書き込まれたデータを読み取ることができます。
Kryoは同じ登録メカニズムを使用して、そのコンストラクタにプリミティブクラスを登録しています。 Kryo 2.21では9つのプリミティブクラスが登録されているため、最初にユーザ登録されたクラスはID 9を取得しますが、Kryo 2.22以降では10個のプリミティブクラスが登録されます。 (void
was added.)これは、ユーザ登録クラスがID 10から始まることを意味します。
Spark 2.0.2にアップグレードした後でも古いデータを読み込むにはどうしたらいいですか?
(私たちの最初のユーザ登録クラスが非推奨クラスだった場合、それは素晴らしいことだ。しかし、それはないです。それはscala.Tuple2[_, _]
である。)
Kryoはどのようにしてこのような急変を2.21から2.22にすることができましたか?傷害に侮辱を加えるために、彼らの変更履歴は、すべてのリリースでシリアル化の互換性を「はい」とリストしています。しかし、変更履歴は2.22から始まります。 –
さて、回避策はそれほど悪くはありません。私はあまりにも劇的だったと思う。 –