2016-11-29 12 views
1

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[_, _]である。)

+0

Kryoはどのようにしてこのような急変を2.21から2.22にすることができましたか?傷害に侮辱を加えるために、彼らの変更履歴は、すべてのリリースでシリアル化の互換性を「はい」とリストしています。しかし、変更履歴は2.22から始まります。 –

+0

さて、回避策はそれほど悪くはありません。私はあまりにも劇的だったと思う。 –

答えて

1

が実際に明示的にIDを指定するために使用することができますKryo.register(Class type, int id)方法があります。 idパラメータのコメントが書かれています:

ID:は> = 0より小さくIDは、より効率的にシリアライズされますする必要があります。 ID 0-8はデフォルトでプリミティブタイプに使用され、Stringが使用されますが、これらのIDは再利用することができます。

2.22以降のコメントは間違っています:ID 9がデフォルトでも使用されるようになりました。しかし、実際にはそれは再利用することができます!

kryo.register(classOf[Tuple2[_, _]], 9) 

通常の順次登録は、残りのクラスに対して機能します。明示的なIDは最初のクラスにのみ必要です。

関連する問題