コンバイナーは、マッパーの後、リデューサーの前に実行され、特定のノードのマッパー インスタンスによって発行されたすべてのデータを入力として受け取ります。次に、Reducer に出力を発行します。
また、reduce 関数が可換かつ結合的である場合は、Combiner として使用できます。
私の質問は、この状況で「交換可能かつ結合的」というフレーズはどういう意味ですか?
番号のリスト123 456があると仮定します。
ここでの連想とは、操作を取得して任意のサブグループに適用し、それらの結果に適用して同じ答えを得ることができることを意味します。
(1) + (2 + 3) + (4 + 5 + 6)
==
(1 + 2) + (3 + 4) + (5) + (6)
==
...
ここでの括弧は、コンバイナーの実行と考えてください。
可換とは、順序が重要ではないことを意味します。したがって、次のようになります。
1 + 2 + 3 + 4 + 5 + 6
==
2 + 4 + 6 + 1 + 2 + 3
==
...
たとえば、前に見たように、additionはこのプロパティに適合します。maxsの最大値がmaxであるため、「Maximum」は上記のこのプロパティにも適合します。max(a、b)== max(b、a)。
中央値は機能しない例です。中央値の中央値は真の中央値ではありません。
コンバイナのもう1つの重要なプロパティを忘れないでください。キー/値の入力タイプと、キー/値の出力タイプは同じである必要があります。たとえば、string:intを取り込んでstring:floatを返すことはできません。
多くの場合、レデューサーは数値の代わりにある種の文字列を出力することがあります。これにより、レデューサーをコンバイナーとして接続することができなくなる可能性があります。
可換性のために、レデューサーをf()と呼ばれる関数(数学用語で)で表すことができるとしましょう。次に、f(a、b)= f(b、a)の場合、レデューサーは可換です。例:
結合性の場合、プロパティはf(f(a、b)、c)= f(a、f(b、c))です。例えば:
したがって、Map / Reduceのコンテキストでは、レデューサーはこれら2つのプロパティを尊重する必要があります。たとえば、レデューサーがsum()またはmax()だけを実行している場合、両方のプロパティを尊重しますが、mean()やmedian()のようなものは尊重しないため、コンバイナーとして使用することはできません。
私は個人的に、コンバイナーを、ネットワークトラフィックを削減するための最適化として、マップフェーズの後にメモリ内で実行されるミニレデューサーと見なしています。このようにマップ/リデュースを表示すると、可換性/結合性は実際に意味があります。