2016-06-16 4 views
4

私が正しく理解していれば、reduceタスクが(マップタスクの出力から)その入力シャッフルブロックを集めるときに、最初にそれらをメモリに保存します(Q1)。エグゼキュータのシャッフル予約メモリの量(メモリ管理(Q2)の変更前)が使い尽くされると、メモリ内のデータはディスクに流出します。 spark.shuffle.spill.compressがtrueの場合、メモリ内のデータは圧縮された形でディスクに書き込まれます。スパークシャッフルスピルの理解

私の質問:

Q0:私の理解は正しいですか?

Q1:削減タスク内の収集データは、常に圧縮されていませんか?

Q2:シャッフルブロックの収集に使用できるエグゼキュータのメモリの量はどのように見積もることができますか?

Q3:あなたのデータセットがメモリに収まらないときにシャッフルスピルが発生することを私は見てきましたが、シャッフル予約されたエグゼキュータメモリがすべての(非圧縮の)シャッフル入力すべての活動的なタスクのブロック、その後、流出は発生しません、それは正しいですか?

このような場合、流出を避けるために、すべての並列縮小側タスクで終了する(非圧縮の)データがエグゼキュータのシャッフル予約済みメモリ部分より少ないことを確認する必要がありますか?

+0

1.6より前の正確なバージョンのSparkは使用していますか? 1.6.1を使用できない理由は何ですか? – Sim

+0

シャッフル関連メモリの特定のサイズを除いて私の質問のほとんどは、特定のバージョンには一般的で不自然です。私はEMR AMIで利用可能なものであるため、プロダクションでは1.3.1を使用しています。バージョン1.6.1は新バージョンのEMR(リリースラベル)で使用できますが、まだ試作されていますが、まだ製作されていません。 –

+0

1.6.1に切り替えることを強くお勧めします。 1.3.1はスパーク基準によって古代であり、多くの問題を抱えています。 SparkのJIRAを見てください。パフォーマンスの向上は、1.3.1を手作業で調整することで実現できる可能性を超える可能性があります。 – Sim

答えて

4

1.6前後のメモリ管理に違いがあります。いずれの場合も、実行メモリと記憶メモリという概念があります。違いは1.6以前は静的です。つまり、実行と格納のためにどれだけのメモリがあるかを指定する設定パラメータがあります。そして、いずれかが十分でないときに流出があります。凝集やソートなどのパラレル

  • 異なるタスクで実行されている

    • 異なる段階:

      Apacheのスパークが回避策がある問題の一つは、の同時実行です。

    1. 私はあなたの理解が正しいことを言うと思います。

    2. メモリ内の内容は圧縮されていないか、処理できません。実行メモリはブロック単位でディスクに書き込まれ、前述のように圧縮されます。

    3. 1.3.1以降、あなたはそれを構成することができるので、サイズを知ることができます。任意の時点で残されているものとして、実行者プロセスをjstat -gcutil <pid> <period>のようなもので見ていることが分かります。どのくらいの量のメモリが空いているかの手がかりを与えるかもしれません。できるだけ多くのメモリが記憶と実行のために設定されていることを知って、少しのdefault.parallelismがあなたに手掛かりを与えるかもしれません。

    4. これは当てはまりますが、理由は分かりません。いくつかのキーが他のキーよりも多くの値を持つなど、スキューが発生する可能性があります。