web-dev-qa-db-ja.com

ディスクにこぼして書き込みをシャッフルするspark

spill to diskshuffle writeについて混乱しています。デフォルトのソートシャッフルマネージャーを使用して、パーティションレコードを集計および結合するためにappendOnlyMapを使用しますよね?次に、実行メモリがいっぱいになると、マップのソートを開始し、それをディスクにスピルし、次のスピル(発生した場合)のためにマップをクリーンアップします。私の質問は次のとおりです。

  • ディスクへのスピル書き込みとシャッフル書き込みの違いは何ですか?それらは基本的にローカルファイルシステムでファイルを作成し、記録することから成ります。

  • 許可が異なるため、Spillレコードはマップを通過するためソートされますが、マップから通過しないため、書き込みレコードはシャッフルされません。

  • こぼしたファイルの合計サイズは、シャッフル書き込みのサイズと同じでなければならないという考えがあります。おそらく何か欠けています。そのフェーズを理解するのを助けてください。

ありがとう。

ジョルジョ

10
Giorgio

spill to diskshuffle writeは2つの異なるものです

spill to disk-ホストからのデータ移動RAM to Host Disk-十分でない場合に使用RAM onあなたのマシン、そしてそれはそのRAMの一部をディスクに置きます

http://spark.Apache.org/faq.html

Sparkを使用するには、データがメモリに収まる必要がありますか?

いいえ。Sparkのオペレーターは、メモリに収まらない場合、データをディスクにこぼし、あらゆるサイズのデータ​​で適切に実行できるようにします。同様に、メモリに収まらないキャッシュされたデータセットは、RDDのストレージレベルによって決定されるように、ディスクに書き出されるか、必要に応じてその場で再計算されます。

shuffle write-Executor(s)から別のExecutor(s)へのデータ移動-データがexecutor間で移動する必要がある場合に使用されます(例:JOIN、groupByなどが原因)

より多くのデータはここにあります:

この問題の解決に役立つエッジケースの例:

  • 10人の執行者がいます
  • 100GB RAMの各エグゼキューター
  • データサイズは1280MBで、10個のパーティションに分割されています
  • 各エグゼキューターは128MBのデータを保持します。

データが1つのキーを実行すると仮定すると、groupByKeyを実行すると、すべてのデータが1つのパーティションに移動します。 Shuffle sizeは9 * 128MB(9つのエグゼキューターは最後のエグゼキューターにデータを転送します)であり、エグゼキューターは100GBのRAMおよび1GBのデータのみを持っているため、spill to diskはありません。

AppendOnlyMap について:

AppendOnlyMapコードで記述されているように(上記を参照)-この関数は、追加のみの使用例に最適化された単純なオープンハッシュテーブルの低レベルの実装で、キーは削除されませんが、各キーの値は変更される場合があります。

2つの異なるモジュールが同じ低レベル関数を使用するという事実は、それらの関数が高レベルで関連していることを意味しません。

18
Yaron