私が正しく理解していれば、reduceタスクが(マップタスクの出力から)その入力シャッフルブロックを集めるときに、最初にそれらをメモリに保存します(Q1)。エグゼキュータのシャッフル予約メモリの量(メモリ管理(Q2)の変更前)が使い尽くされると、メモリ内のデータはディスクに流出します。 spark.shuffle.spill.compressがtrueの場合、メモリ内のデータは圧縮された形でディスクに書き込まれます。スパークシャッフルスピルの理解
私の質問:
Q0:私の理解は正しいですか?
Q1:削減タスク内の収集データは、常に圧縮されていませんか?
Q2:シャッフルブロックの収集に使用できるエグゼキュータのメモリの量はどのように見積もることができますか?
Q3:あなたのデータセットがメモリに収まらないときにシャッフルスピルが発生することを私は見てきましたが、シャッフル予約されたエグゼキュータメモリがすべての(非圧縮の)シャッフル入力すべての活動的なタスクのブロック、その後、流出は発生しません、それは正しいですか?
このような場合、流出を避けるために、すべての並列縮小側タスクで終了する(非圧縮の)データがエグゼキュータのシャッフル予約済みメモリ部分より少ないことを確認する必要がありますか?
1.6より前の正確なバージョンのSparkは使用していますか? 1.6.1を使用できない理由は何ですか? – Sim
シャッフル関連メモリの特定のサイズを除いて私の質問のほとんどは、特定のバージョンには一般的で不自然です。私はEMR AMIで利用可能なものであるため、プロダクションでは1.3.1を使用しています。バージョン1.6.1は新バージョンのEMR(リリースラベル)で使用できますが、まだ試作されていますが、まだ製作されていません。 –
1.6.1に切り替えることを強くお勧めします。 1.3.1はスパーク基準によって古代であり、多くの問題を抱えています。 SparkのJIRAを見てください。パフォーマンスの向上は、1.3.1を手作業で調整することで実現できる可能性を超える可能性があります。 – Sim