2017-01-06 2 views
0

スパークプロセスでシャッフルが発生したときに、メモリ使用量が多すぎます。シャッフルが発生したときにSparkが使用して余りにも多くのメモリを取得するのはなぜですか?

図は、700MBのデータを使用し、3つのrdd.mapを使用した場合のメモリメトリックです。 は

enter image description here

と次の図は、メモリメトリックである(I監視ツールとして神経節を使用し、私のクラスタのちょうど3つのノードを示し、X軸は時間系列は、y軸はメモリ使用量を手段)すべて、あなたが見ることができるように

enter image description here

:私は、同じデータを使用し、3 rdd.groupBy、3 rdd.flatMap(groupBy1-> flatMap1-> groupBy2-> flatMap2-> groupBy3-> flatMap3順)を使用します3ノードのメモリの数は、私が700だけ使用してもかなり増えます(数GB) MBデータ。実際に私は8つのワーカーノードを持っており、8人のワーカーのすべてのメモリがかなり増えています。

rdd.mapにはシャッフルがないので、主な原因はシャッフルですが、rdd.groupByにはシャッフルがあると思います。この状況で

、私は3点以下の疑問:

  1. なぜ、あまりにも多くのメモリ使用量がありますか? (私のワーカーノードすべてで700MBを使用すると15GB以上が使用されます)
  2. Sparkアプリケーションが終了する前に古いシャッフルの使用メモリが削除されていないのはなぜですか?
  3. メモリの使用量を減らす方法や、古いシャッフルで生成されたメモリを削除する方法はありますか?

P. - 私の環境:

  1. クラウドプラットフォーム:MSアズール(8つのワーカーノード)
  2. 仕様。 8コアCPU、16ギガバイトRAM
  3. 言語:1つのワーカーのJavaの
  4. スパークバージョン:1.6.2
  5. Javaバージョン:1.7(開発)、1.8(実行)
  6. ラン火花スタンドアロンで(ありません

答えて

0

Sparkでは、オペレーティングシステムは、データがバッファキャッシュに残っているか、DISKに書き込まれるべきかどうかを判断します。各マップタスクは、減速機の数だけシャッフルスピルファイルを作成します。 SPARKはシャッフルスピルファイルをマージして1つの大きなファイルに分割しません。これはApache Hadoopの場合です。 例:6000(R)減速機と2000(M)のマップタスクがある場合は、(M * R)6000 * 2000 = 1200万のシャッフルファイルがあります。これは、スパークでは、各マップタスクが減速機の数だけシャッフルスピルファイルを作成するためです。これによりパフォーマンスが低下しました。

上記の説明を続けると、このことについて非常によく説明されているthisポストを参照してください。

Optimizing Shuffle Performance in Spark用紙を参照することもできます。

〜ケダー

+0

(Writer)@KedarDixitあなたの素晴らしい情報をありがとう。 Spark.shuffle.consolidateファイルは、私が必要とするSparkプロパティの1つで、Spark 1.6からはもはや適用されません。他の代替プロパティはありますか?私はそれについてGoogleで検索するが、私はそれを見つけることができません。 – kangbok

関連する問題