web-dev-qa-db-ja.com

SparkでKryoシリアル化を使用するのはいつですか?

私は既にconf.set("spark.rdd.compress","true")persist(MEMORY_AND_DISK_SER)を使用してRDDを圧縮しています。 Kryoシリアライゼーションを使用すると、プログラムがさらに効率的になりますか、それともこの場合は役に立ちませんか? Kryoはノード間でより効率的な方法でデータを送信するためのものであることを知っています。しかし、通信されたデータがすでに圧縮されている場合、それも必要ですか?

9
pythonic

あなたが説明した両方のRDD状態(圧縮および永続化)はシリアル化を使用します。 RDDを永続化すると、それをシリアル化してディスクに保存します(この場合、シリアル化された出力も圧縮します)。シリアライゼーションはシャッフル(ノード間でのデータの送信)にも使用されるのは正しいです。データがJVMを離れる必要があるときはいつでも、ローカルディスクまたはネットワークのどちらを経由する場合でも、シリアル化する必要があります。

Kryoは大幅に最適化されたシリアライザであり、標準のJavaシリアライザのほとんどすべてに対してパフォーマンスが優れています。この場合、実際にはすでにKryoを使用している可能性があります。spark構成パラメーター:

「spark.serializer」は「org.Apache.spark.serializer.KryoSerializer」である必要があります。

そうでない場合は、次のように内部的に設定できます。

conf.set( "spark.serializer", "org.Apache.spark.serializer.KryoSerializer" )

あなたの最後の質問(「それさえ必要ですか?」)に関して、それについて一般的な主張をするのは難しいです。 Kryoはデータ通信の遅いステップの1つを最適化しますが、ユースケースによっては、他の人があなたを妨げている可能性があります。しかし、Kryoを試して違いをベンチマークすることの欠点はありません!

8
Tim

別の点を考慮してください:kyroはシリアライゼーションとデシリアライゼーションのデフォルトより速いので、kyroを使用する方が良いです。しかし、パフォーマンスの向上は上記ほど良くない場合があります。選択したsparkコード、どのライブラリを選択するかなど、プログラムの速度に影響を与える他のポイントがあります。

2
yanghaogn

Kryoシリアライゼーションは、より最適化されたシリアライゼーション手法であるため、これを使用して、RDDまたはDataframeクロージャーで使用される任意のクラスをシリアライズできます。 Kryoシリアル化の特定の情報の使用については、以下を参照してください。

  1. RDDまたはデータフレームクロージャ内でサードパーティの非シリアル化クラスをシリアル化するときに使用します
  2. 効率的なシリアル化手法を使用したい
  3. クラスが原因でシリアル化エラーが発生した場合は、そのクラスをKryoシリアライザーに登録できます
1
Sandeep Purohit