sparkシーケンス化



データのシーケンシング
    シーケンス化は分散アプリケーションにおいて重要な役割を果たす.オブジェクトのシーケンス化プロセスが遅くなるか、バイトストレージが大量に消費されるシーケンス化フォーマットは、計算速度を大幅に低下させます.通常、これはSparkアプリケーションの最適化の最初のことです.Sparkは、操作中のJavaタイプを使用できる便利さとパフォーマンスのバランスを実現することを目的としています.次の2つのシーケンス化ライブラリが用意されています.
  • Java serialization:SparkはデフォルトでJavaのObjectOutputStreamフレームワークを使用してオブジェクトをシーケンス化し、java.io.Serializableを実装した任意のクラスをシーケンス化できます.ユーザーは、継承によってより緊密なシーケンス化パフォーマンス制御を実現することもできます.
  • Kryo serialization:Sparkは、Kryoライブラリ(version 2)を使用して、より高速なオブジェクトシーケンス化を実現することもできます.KryoはJavaよりもシーケンス化が速く、データフォーマットがコンパクトですが、すべてのSerializableタイプはサポートされていません.ユーザーがKryoを使用してパフォーマンスを向上させるには、アプリケーションで使用されるクラスを登録する必要があります.

  • ほとんどの資料はkryoシーケンス化方式がjavaが持参したシーケンス化方式よりも優れていることを示しており、spark 2.*バージョンではkryoシーケンス化がデフォルトで採用されています.
    1.定義を先に示します.    オブジェクトをバイトシーケンスに変換するプロセスをオブジェクトのシーケンス化と呼ぶ.    バイトシーケンスをオブジェクトに復元するプロセスをオブジェクトの逆シーケンス化と呼ぶ.一般にシーケンス化とは、メモリ(jvm)内のオブジェクトの状態をネットワークを介して転送したり、ディスクに保存したりすることであり、逆シーケンス化は逆である.
    2.sparkでのシーケンス化では、オブジェクトがどのような形で伝送されるのがパフォーマンスが良いのでしょうか.spark 2.0+バージョンの公式ドキュメントでは、sparkはデフォルトで2つのシーケンス化ライブラリを提供しています.Java自体のシーケンス化とKryoシーケンス化公式サイトの解釈はjavaシーケンス化は柔軟ですが、速度は遅いです.Kryoシーケンス化は高速でコンパクトですが、サポートされるタイプは少ないです.またsparkは現在、shuffleのときにRDDが単純なタイプに対してKryoシーケンス化を使用することをデフォルトにしている.
        ユーザーは、タスクの初期化時にSparkConfのconf.set(「spark.serializer」,「org.apache.spark.serializer.KryoSerializer」)を設定することで、シーケンス化フレームワークをKryoに切り替えることができます.ここでのシーケンス化構成は、workerノード間のshuffleデータだけでなく、RDDをdiskにシーケンス化する際にも機能する.Kryoはデフォルトのシーケンス化選択の唯一の理由ではありません.ユーザーの登録動作が必要ですが、すべてのネットワーク密集型アプリケーションで使用することをお勧めします.Spark 2.0.0から、単純タイプまたは文字列タイプのShuffle RDDを転送するときにKryoシーケンス化がデフォルトで使用されます.
        Sparkは、Twitter chillライブラリ内のAllScalaRegistrarで上書きされている多くの一般的なScalaクラスにKryoを自動的に登録します.
        ユーザー自身のクラスをkryoに登録する場合は、registerKryoClassesメソッドを使用します.
    val conf = new SparkConf().setMaster(...).setAppName(...)
    conf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer")
    conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2])) 
    val sc = new SparkContext(conf)

        Kryoのドキュメントhttps://github.com/EsotericSoftware/kryoユーザシーケンス化コードの追加など、より多くのステップアップの登録オプションについて説明します.
        ユーザーのオブジェクトが大きい場合は、spark.kryoserializer.buffer構成項目を追加する必要があります.この値は、シーケンス化するオブジェクトを保存するのに十分な最大のオブジェクトに達する必要があります.
        最後に、ユーザークラスを登録しない場合はkryoも動作しますが、各オブジェクトの全クラス名が格納され、ストレージスペースの無駄になります.