web-dev-qa-db-ja.com

JavaでMRコードを記述しているときに、Map-SideJoinまたはReduce-Sideをいつ使用するかを決定するにはどうすればよいですか?

JavaでMRコードを記述しているときに、Map-SideJoinまたはReduce-Sideをいつ使用するかを決定するにはどうすればよいですか?

6
jkalyanc

マップ側の結合は、データがマップに到達する前に結合を実行します。マップ関数は、マップ側でデータを結合する前に、強力な前提条件を想定しています。どちらの方法にも長所と短所があります。マップ側結合は、縮小側と比較して効率的ですが、厳密な形式が必要です。

前提条件:

  • データは、特定の方法で分割およびソートする必要があります。
  • 各入力データは、同じ数のパーティションに分割する必要があります。
  • 同じキーでソートする必要があります。
  • 特定のキーのすべてのレコードは、同じパーティションに存在する必要があります。

RepartitionedjoinまたはRepartitionedsort merge joinとも呼ばれるReduceサイド結合であり、主に使用される結合タイプです。ソートとシャッフルのフェーズを経る必要があり、ネットワークのオーバーヘッドが発生します。サイド結合の削減では、データソース、タグ、グループキーなどのいくつかの用語を使用します。

  • データソースは、おそらくRDBMSから取得されたデータソースファイルを参照しています
  • タグは、すべてのレコードにソース名でタグを付けるために使用されます。これにより、マップ/リデュースフェーズにある場合でも、任意の時点でソースを識別できます。なぜそれが必要なのかは後で説明します。
  • グループキーは、2つのデータソース間の結合キーとして使用される参照列です。

このデータをreduce側で結合することはわかっているので、reduceフェーズでの結合に使用できるように準備する必要があります。実行する必要のある手順を見てみましょう。

詳細については、次のリンクを確認してください: http://hadoopinterviews.com/map-side-join-reduce-side-join/

2
chandu kavar

テーブルの1つをメモリに収めることができる場合は、マップサイド結合を使用します。これにより、データの並べ替えとシャッフルのオーバーヘッドが削減されます。

入力データセットを構造化する必要がないため、Reduce-Side結合はMap-Side結合よりも単純です。ただし、両方のデータセットがMapReduceシャッフルフェーズを通過する必要があるため、効率は低下します。同じキーを持つレコードは、レデューサーにまとめられます。

1
Venkata Karthik