8Sparkを使用したパフォーマンス最適化手法

あるデータセットが非常に小さく、別のデータセットが非常に大きい状況があり、これら二つの間で結合操作を実 その場合は、broadcast joinを使用して、小さなデータセットがbroadcast変数に収まるようにする必要があります。 Broadcast変数を使用する構文はdf1です。(放送(df2))に参加。 ここでは、非常に小さい2番目のdataframeがあり、このデータフレームをbroadcast変数として保持しています。

コード:

放送(配列(1, 2, 3))

放送局…値

res0:Array=Array(1, 2, 3)

ヴァル-アックム=sc.longAccumulator(“My Accumulator”)

sc.parallelize(配列(1, 2, 3, 4)).foreach(x=>accum.(x))

アックム。value

res2:Long=10

Cache and Persist

  • Sparkはpersist()やcache()のような独自のキャッシュメカニズムを提供します。
  • cache()とpersist()は、データセットをメモリに格納します。
  • プログラムで複数回使用する必要がある小さなデータセットがある場合、そのデータセットをキャッシュします。
  • Cache()–常にメモリ内
  • Persist()–メモリとディスク

Sparkは、PersistやCachingのような独自のキャッシュメカニズムを提供します。 PersistとCacheメカニズムは、小さなデータセットがあり、そのデータセットがプログラムで複数回使用されている必要があるときはいつでも、データセットをメ RDDを適用する場合。Cache()は常にデータをメモリに格納し、RDDを適用する場合は常にデータを格納します。Persist()その後、データの一部をメモリに格納することができ、一部はディスクに格納することができます。

5. ByKey操作

  • シャッフルは、多くのメモリを消費する重い操作です。
  • Sparkでのコーディング中は、ユーザーは常にシャッフル操作を回避しようとする必要があります。
  • 高シャッフルはOutOfMemoryエラーを引き起こす可能性があります。
  • groupByKeyの代わりにreduceByKeyを使用します。
  • データを正しく分割します。

Sparkの変換中に知っているように、多くのByKey操作があります。 ByKey操作は、シャッフルの多くを生成します。 シャッフルは、多くのメモリを消費するため、重い操作です。 Sparkでのコーディング中は、シャッフル操作によってパフォーマンスが低下するため、ユーザーは常にシャッフル操作を回避する必要があります。 高いシャッフルがある場合、ユーザーはメモリからエラーを取得することができます。 この場合、そのエラーを回避するために、ユーザーは並列処理のレベルを上げる必要があります。 GroupByKeyはパフォーマンスを妨げる多くのシャッフルを作成し、reduceByKeyはデータをあまりシャッフルしないため、GroupByKeyの代わりに、ユーザーはreduceByKeyを使用する必要があります。 したがって、reduceByKeyはgroupByKeyと比較して高速です。 ByKey操作が使用されるたびに、ユーザーはデータを正しく分割する必要があります。

6. ファイル形式の選択

  • Sparkは、CSV、JSON、XML、PARQUET、ORC、AVROなど、多くの形式をサポートしています。
  • Sparkジョブは、高いパフォーマンスと最高の分析を提供するsnappy圧縮でparquetファイルを選択することで最適化できます。
  • Parquetファイルは、メタデータとそのフッターを運ぶSparkにネイティブです。Sparkには、CSV、JSON、XML、PARQUET、ORC、AVROなどの多くのファイル形式が付属しています。 Sparkジョブは、snappy圧縮を使用してparquetファイルを選択することで最適化できます。 寄木細工のファイルは、私たちが知っているように、そのフッターと一緒にメタデータを運ぶSparkにネイティブです寄木細工のファイルは、バイナリ形式にデータファイルと一緒に同じディレクトリ上のメタデータファイル。コード:

    コード:

    コード:

    コード:

    コード:

    書く。寄木細工(”人。”)

    val parquetFileDF=spark.読む。寄木細工(”人。”)

    val usersDF=spark.読む。形式(”アブロ”)。load(“examples/src/main/resources/users.アブロ”)

    選択(”名前”、”favorite_color”)。書く。形式(”アブロ”)。save(“namesAndFavColors.avro”)

    ガベージ-コレクションのチューニング

    • JVMガベージ-コレクションは、未使用のオブジェクトのコレクションが多い場合に問題になる可能性があります。GCチューニングの最初のステップは、sparkジョブの送信中に–verboseを選択して統計情報を収集することです。
    • 理想的な状況では、GCオーバーヘッド<ヒープメモリの10%を維持しようとします。

    私たちが知っているように、SparkジョブはJVMプラットフォーム上で実行されているので、JVMガベージコレクションは未使用のオブジェクトの大規模なコ 一般的に、理想的な状況では、ガベージコレクションメモリをヒープメモリの10%未満に保つ必要があります。

    8. 並列処理のレベル

    • 並列処理は、sparkジョブをチューニングする際に非常に重要な役割を果たします。
    • すべてのパーティション~タスクは、処理のための単一のコアを必要とします。
    • 並列性を維持するには二つの方法があります。
      • 再分割:シャッフルの多いパーティションの数が等しい
      • 合体:一般的にシャッフルの少ないパーテ

    どの分散環境でも、並列処理はSparkジョブを調整する際に非常に重要な役割を果たします。 Sparkジョブが送信されるたびに、ステージを含むデスクが作成され、タスクはパーティションに依存するため、すべてのパーティションまたはタスクには処理のためにシステムの単一のコアが必要です。 並列性を維持するには、再分割と合体の2つの方法があります。 あなたが再分割方法を適用するたびに、それはあなたに等しい数のパーティションを与えますが、それはあなたがすべてのデータを鞭打ちたいときに再分割のために行くことはお勧めできませんので、それは多くをシャッフルします。 Coalesceは、一般的にパーティションの数を減らし、データのシャッフルを少なくします。

    スパーク最適化のためのこれらの要因は、適切に使用されていれば、できます–



+