2人のワーカーでSpark=ストリーミングアプリケーションを実行しています。アプリケーションには結合操作と結合操作があります。
すべてのバッチは正常に完了していますが、シャッフルスピルメトリックは入力データサイズまたは出力データサイズと一致していません(スピルメモリは20倍以上です)。
下の画像でsparkステージの詳細をご覧ください:
これについて調査した結果、
シャッフル流出は、シャッフルデータに十分なメモリがないときに発生します。
Shuffle spill (memory)
-スピル時のメモリ内のデシリアライズされたデータのサイズ
shuffle spill (disk)
-スピル後のディスク上のデータのシリアル化された形式のサイズ
デシリアライズされたデータは、シリアライズされたデータよりも多くのスペースを占有するため。したがって、シャッフル流出(メモリ)はさらに多くなります。
これに注意してくださいスピルメモリサイズは大きな入力データでは信じられないほど大きいです。
私のクエリは:
このこぼれはパフォーマンスにかなり影響しますか?
メモリとディスクの両方のこぼれを最適化する方法は?
Sparkこの巨大な流出を抑制/制御できるプロパティはありますか?
パフォーマンスチューニングの学習Spark=かなりの調査と学習が必要です。 this video 。Spark = 1.4のインターフェースには、より良い診断と視覚化があり、あなたを助けます。
要約すると、ステージの最後にあるRDDパーティションのサイズがシャッフルバッファーで使用可能なメモリ量を超えた場合に流出します。
あなたはできる:
repartition()
前のステージを作成して、入力のパーティションを小さくします。spark.executor.memory
)spark.shuffle.memoryFraction
)をデフォルトの0.2から増やすことにより、シャッフルバッファーを増やします。 spark.storage.memoryFraction
を返す必要があります。SPARK_WORKER_CORES
)の比率を減らすことにより、スレッドごとのシャッフルバッファーを増やします。専門家のリスニングがあれば、memoryFraction設定がどのように相互作用し、その合理的な範囲についてもっと知りたいです。