私は既にconf.set("spark.rdd.compress","true")
とpersist(MEMORY_AND_DISK_SER)
を使用してRDDを圧縮しています。 Kryoシリアライゼーションを使用すると、プログラムがさらに効率的になりますか、それともこの場合は役に立ちませんか? Kryoはノード間でより効率的な方法でデータを送信するためのものであることを知っています。しかし、通信されたデータがすでに圧縮されている場合、それも必要ですか?
あなたが説明した両方の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を試して違いをベンチマークすることの欠点はありません!
別の点を考慮してください:kyroはシリアライゼーションとデシリアライゼーションのデフォルトより速いので、kyroを使用する方が良いです。しかし、パフォーマンスの向上は上記ほど良くない場合があります。選択したsparkコード、どのライブラリを選択するかなど、プログラムの速度に影響を与える他のポイントがあります。
Kryoシリアライゼーションは、より最適化されたシリアライゼーション手法であるため、これを使用して、RDDまたはDataframeクロージャーで使用される任意のクラスをシリアライズできます。 Kryoシリアル化の特定の情報の使用については、以下を参照してください。