SparkのKryoシーケンス化登録

1749 ワード

SparkのKryoシーケンス化登録Sparkシーケンス化は、RDDシーケンス化によってメモリ消費量を低減することができる.ネットワークパフォーマンスの最適化には極めて重要です1、javaシーケンス化:
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も動作しますが、各オブジェクトインスタンスのシーケンス化結果には完全なクラス名が含まれており、不要なスペースが浪費されます.