そのため、適切な削減フェーズでの主な考えは、適切なパーティションの分散です。しかし、たとえば、それを制御できない、またはこれを行う方法がわからない (データがわからない)。
レデューサーが大量にあると、レデューサーごとのデータ分散が改善される可能性が高くなりますか? この質問の一般的な方法は何ですか?
データは通常、モジュラス ハッシュ パーティショニングを使用してレデューサー間で均等に分散されます。これは、キーのハッシュがレデューサーの数で除算され、余りが値が送信されるレデューサーのインデックスであることを (事実上) 意味します。たとえば、キーのハッシュが 47269893425623 で、レデューサーが 10 個ある場合、47269893425623 % 10 = 3 となるため、4 番目のレデューサー (インデックスが 0 であることを思い出してください) がそのレコードを取得します。
レコードにホットスポット キーがある場合、つまり値の大部分がまったく同じキーを持っている場合、レデューサーを追加してもおそらく役に立たないでしょう (オーバーヘッドが追加されるだけです。これらのキーはすべて同じレデューサーに送られます)。 )。
そのような状況でない場合は、レデューサーを追加すると役立つ場合があります。マッパーとリデューサーの間にネットワーク コピー ステージがあることを覚えておいてください。レデューサーを分割すればするほど、マッパーとレデューサーの間でより多くのコピーを行う必要があるため、ジョブの一部が遅くなります。
レデューサーの数を選択することは、ある意味では科学というより芸術です。さまざまなことを試して、特定の仕事に最適なものを見つける必要があります.
一般的に、いくつかの主要なオプションがあります。
レデューサーの数を増やしても、それほど効果はありません。数学的な意味では、を除いてすべてのキーが均等に分散されていると仮定しますhotkey
。次に、指定されたレデューサーの配布hotkey
は100MBで、他のすべては100MBです(極端に言えば)。レデューサーが 2 つある場合、約 150MB のレデューサー 1 と 50MB のレデューサー 2 があります。3 つのレデューサーを使用すると、133MB (100MB + 33MB) のレデューサーが 1 つ、33MB のレデューサーが 2 つになります。レデューサーが 100 個ある場合、1 つが 101MB で、残りはすべて 1MB です。ご覧のとおり、レデューサーの数を増やしてもあまり効果はありませんが、少しは効果があります。おそらく、それを本当に薄く広げるには十分ではありません。
ホットスポットは、多くのジョブにとって問題にはなりません。デフォルトのパーティショニング動作は、比較的均一な分散を提供するために完全に合理的です。
スカッシュしようとしているホットスポットまたは非常に歪んだデータ セットがある場合は、カスタム パーティショナーを作成して、データがレデューサーに送られる特別なルールを作成できます。たとえば、ホット スポットである 3 つのキーがあることがわかっている場合、キー 1 をレデューサー 1 に、キー 2 をレデューサー 2 に、キー 3 をレデューサー 3 に送信し、他のすべてを他のレデューサーに送信するパーティショナーを作成できます。