ここでHadoopを使用するのは初めてです。hadoop mapreduceを使用しているときに、キーで並べ替えることができる必要がある理由は明らかではありませんか?マップフェーズの後、各一意キーに対応するデータをいくつかのレデューサーに配布する必要があります。これは、正しく並べ替える必要なしに実行できますか?
2 に答える
並べ替えはキーをグループ化するための巧妙なトリックであるため、そこにあります。もちろん、ジョブまたはアルゴリズムでキーの順序が必要ない場合は、ハッシュトリックを使用してグループ化する方が速くなります。
Hadoop自体には、何年も前からそのためにJIRAが提出されています(ソース)。Hadoopの上にレイヤー化された他のいくつかのディストリビューションには、すでにこれらの機能があります。たとえば、Hanborq(ソート回避と呼ばれます)。(ソース)
あなたの実際の質問(なぜ)に対して、MapReduceは本質的にGoogle(ソース)からの論文であり、次のように述べています:
特定のパーティション内で、中間のキーと値のペアがキーの昇順で処理されることを保証します。この順序付けの保証により、パーティションごとに並べ替えられた出力ファイルを簡単に生成できます。これは、出力ファイル形式がキーによる効率的なランダムアクセスルックアップをサポートする必要がある場合、または出力のユーザーがデータを並べ替えるのに便利だと感じる場合に便利です。
したがって、ソートをサポートする方が便利な決定でしたが、本質的にソートでキーをグループ化することだけを許可するわけではありませんでした。
「キーによる並べ替え」は、hadoop DISTRIBUTESがさまざまなマシンにさまざまなキーを送信することで処理するという事実を考慮すると、最もよく理解できます。アイデアの基本的な(簡略化された)バージョンは次のとおりです。
The reducer which a (k,v) pair is sent to = k.hashCode()%num_of_machines.
したがって、キーのハッシュコードが10で、マシンが2台ある場合、たとえば、キーはマシン#0に送信されます。
したがって、キーは(最初に)計算を分散する簡単な方法を提供します。
キーは、計算の分散を簡素化することに加えて、異種のデータファイルからのレコードを単一のクラスターに結合する方法を提供します。これは、たとえば、word_countのようなことを行う方法です。
実際、キーが必要ないことがわかった場合は、おそらくHadoopも必要ありません。
古典的な例(単語数):
Hadoopの「単語数」の例では、値(テキストのセグメントでその単語が#回表示された回数)を持つキー(1つのキー= 1つの単語)を発行します。これにより、SINGLE削減機能がSINGLE単語を受信できるようになり、表示されたすべての時間を加算して、正確な単語数を作成できます。
したがって、キーの集約により、「マップ」フェーズを複数のマシンに個別に分散させることができます。同じレデューサーにキーを集約しないと、単語数の例では、単一のレデューサーがすべてのファイルからすべての単語数を受け取るという保証がないため、特定の単語に対して複数の単語数を取得する可能性があります。
もう一つの例:
さて...IDとして社会保障番号があり、個人データの集計を出力したいとします。2つの巨大なファイルがあるとしましょう。
ssn-> name
ssn->shoe_size
この場合、個人の名前と靴のサイズの両方が同じリデュース機能に送信されるように、キーグループ化の機能を活用できます。
reducer(2)は、ここで2つのレコードを受け取ります。
ssn-> name、shoe_size
ここでの考え方は、map / reduceジョブを作成する場合、reduceフェーズで意味のある方法で結合できるように出力される「タプル」をエンコードする必要があるということです。分散コンピューティング環境では、ある時点で、異なるノードで計算されたレコードを組み合わせる必要があります。キーは、これを行うための便利でスケーラブルな方法論を提供します。
つまり、SAMEキーがSAMEレデューサー機能に送られることが保証されているという事実は、この特定の社会保障番号の各レデューサーがその番号に関連付けられたすべてのデータを受信し、ssnを含むデータレコードを結合して出力できることを確認します。名前、靴のサイズ。
結論
キーで配布しないと、そのような方法でデータを結合するには、ある種の中間データストレージ/キャッシングを含む非常に複雑なロジックが必要になります。Hadoopは、使い慣れたパーダイムであるキーと値を使用して、並列計算からのデータ結果を「結合」する一般的なニーズを単純に一般化および抽象化します。