web-dev-qa-db-ja.com

Apacheでシャッフル流出を最適化する方法Spark application

2人のワーカーでSpark=ストリーミングアプリケーションを実行しています。アプリケーションには結合操作と結合操作があります。

すべてのバッチは正常に完了していますが、シャッフルスピルメトリックは入力データサイズまたは出力データサイズと一致していません(スピルメモリは20倍以上です)。

下の画像でsparkステージの詳細をご覧ください: enter image description here

これについて調査した結果、

シャッフル流出は、シャッフルデータに十分なメモリがないときに発生します。

Shuffle spill (memory)-スピル時のメモリ内のデシリアライズされたデータのサイズ

shuffle spill (disk)-スピル後のディスク上のデータのシリアル化された形式のサイズ

デシリアライズされたデータは、シリアライズされたデータよりも多くのスペースを占有するため。したがって、シャッフル流出(メモリ)はさらに多くなります。

これに注意してくださいスピルメモリサイズは大きな入力データでは信じられないほど大きいです

私のクエリは:

このこぼれはパフォーマンスにかなり影響しますか?

メモリとディスクの両方のこぼれを最適化する方法は?

Sparkこの巨大な流出を抑制/制御できるプロパティはありますか?

36
Vijay Innamuri

パフォーマンスチューニングの学習Spark=かなりの調査と学習が必要です。 this video 。Spark = 1.4のインターフェースには、より良い診断と視覚化があり、あなたを助けます。

要約すると、ステージの最後にあるRDDパーティションのサイズがシャッフルバッファーで使用可能なメモリ量を超えた場合に流出します。

あなたはできる:

  1. 手動でrepartition()前のステージを作成して、入力のパーティションを小さくします。
  2. Executorプロセスのメモリを増やすことでシャッフルバッファーを増やします(spark.executor.memory
  3. 割り当てられたエグゼキューターメモリの割合(spark.shuffle.memoryFraction)をデフォルトの0.2から増やすことにより、シャッフルバッファーを増やします。 spark.storage.memoryFractionを返す必要があります。
  4. エグゼキューターメモリに対するワーカースレッド(SPARK_WORKER_CORES)の比率を減らすことにより、スレッドごとのシャッフルバッファーを増やします。

専門家のリスニングがあれば、memoryFraction設定がどのように相互作用し、その合理的な範囲についてもっと知りたいです。

48
Alister Lee