SparkのKryoシーケンス化登録
1749 ワード
SparkのKryoシーケンス化登録Sparkシーケンス化は、RDDシーケンス化によってメモリ消費量を低減することができる.ネットワークパフォーマンスの最適化には極めて重要です1、javaシーケンス化:
Javaシーケンス化は柔軟ですが、パフォーマンスが遅く、シーケンス化後のバイト数も多いです.
2、Kryoシーケンス化:
しかし、Kryoはjavaを実現したすべてのことをサポートしていません.io.Serializableインタフェースのタイプです.プログラムでregisterをシーケンス化する必要があるタイプで、最適なパフォーマンスを得る必要があります.
SparkConf初期化時に呼び出す
使用時にシーケンス化が必要なタイプを登録する必要があります.ネットワークに敏感なアプリケーションシーンでKryoを使用することをお勧めします.
例:
クラスタが走っている間に/*.set(「spark.kryo.registrationRequired」,「true」)*/コメントを削除します.そうしないと、次のエラーが表示されます.
最後に、シーケンス化が必要なカスタムタイプを登録しないとKryoも動作しますが、各オブジェクトインスタンスのシーケンス化結果には完全なクラス名が含まれており、不要なスペースが浪費されます.
spark.serializer=org.apache.spark.serializer.JavaSerialization
Sparkのデフォルトでは、Javaが持つObjectOutputStreamフレームワークを使用してオブジェクトをシーケンス化し、javaを実現します.io.Serializableインタフェースのオブジェクトは、シーケンス化できます.Javaシーケンス化は柔軟ですが、パフォーマンスが遅く、シーケンス化後のバイト数も多いです.
2、Kryoシーケンス化:
spark.serializer=org.apache.spark.serializer.KryoSerialization
KryoSerializationは速度が速く、結果はよりコンパクト(通常は10倍向上)になります.しかし、Kryoはjavaを実現したすべてのことをサポートしていません.io.Serializableインタフェースのタイプです.プログラムでregisterをシーケンス化する必要があるタイプで、最適なパフォーマンスを得る必要があります.
SparkConf初期化時に呼び出す
conf.set(“spark.serializer”, “org.apache.spark.serializer.KryoSerializer”)
Kryoを使用します.この設定は、各workerノード間のミキシングデータのシーケンス化フォーマットを制御するだけでなく、RDDがディスクに格納されるシーケンス化フォーマットも制御する.使用時にシーケンス化が必要なタイプを登録する必要があります.ネットワークに敏感なアプリケーションシーンでKryoを使用することをお勧めします.
例:
val sparkConf = new SparkConf()
/*.setMaster("local")*/
.setAppName("Test")
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
/*.set("spark.kryo.registrationRequired", "true")*/
.registerKryoClasses(Array(
classOf[Array[String]],
classOf[util.HashMap[String, String]],
classOf[util.ArrayList[String]],
classOf[MyTest]
))
クラスタが走っている間に/*.set(「spark.kryo.registrationRequired」,「true」)*/コメントを削除します.そうしないと、次のエラーが表示されます.
Class is not registered: scala.reflect.ClassTag$$anon$1 Class is not registered: scala.reflect.ManifestFactory$$anon$9
最後に、シーケンス化が必要なカスタムタイプを登録しないとKryoも動作しますが、各オブジェクトインスタンスのシーケンス化結果には完全なクラス名が含まれており、不要なスペースが浪費されます.