サブセクション「トレードオフの例」のこの記事xrds:articleでは、すべての単一レコードが入力ファイルの他のすべてのレコードと結合される方法 (最初のもの) について説明しています。入力ファイル全体を1つのマッパーだけに渡さずに、mapreduceでどのようにそれが可能になるのだろうか。
1 に答える
MapReduce の結合には、主に 3 つのタイプがあります (他にもいくつかあります)。
サイド ジョインの削減- 両方のデータ セットについて、「外部キー」をマッパーの出力キーとして出力します。MultipleInputsのようなものを使用して、2 つのデータセットを一度にロードします。レデューサーでは、両方のデータセットからのデータが外部キーによってまとめられます。これにより、そこで結合ロジック (おそらくデカルト積など) を実行できます。これは汎用であり、ほぼすべての状況で機能します。
レプリケートされた結合- より小さいデータ セットをDistributedCacheにプッシュします。それぞれの案件で、そこから小さなデータ セットをメモリに読み込みます。レコードがマッパーを通過するときに、メモリ内データ セットに対してデータを結合します。これはあなたの質問で提案するものです。小さいデータ セットをメモリに格納できる場合にのみ使用してください。
複合結合- これはセットアップが必要なため、少しニッチです。2 つのデータ セットが外部キーによって並べ替えられ、分割されている場合は、 CompositeInputFormatを使用して複合結合を実行できます。基本的に、非常に効率的なマージのような操作を行います。
私の本MapReduce Design Patternsの恥知らずなプラグイン: 結合に関する章全体があります (第 5 章)。
ここで本のコード例をチェックしてください: https://github.com/adamjshook/mapreducepatterns/tree/master/MRDP/src/main/java/mrdp/ch5