3

A が B に参加しA.a=B.a、両方とも大きなテーブルであるとします。Hive は、共通結合を介してこの結合操作を処理します。実行グラフ(Facebook提供): ここに画像の説明を入力

しかし、私はこのグラフに混乱しています。レデューサーだけですか?

私の理解では、マップ出力キーはtable_name_tag_prefix+join_key. ただし、分割フェーズでは、引き続き join_key を使用してレコードを分割します。reduce フェーズでは、各 reducer<join_key,value>は同じ結合キーを持つものを読み取ります。reducer はすべてのマップ分割を読み取る必要はありません。

4

2 に答える 2

2

レデューサーの量はhive.exec.reducers.bytes.per.reducer(デフォルトは 1GB) で定義されます。
したがって、マッパーへの入力データの GB ごとに、1 つのレデューサーが取得されます。
次に、ハイブはhash()結合列で関数を使用し、ハッシュ関数の出力に対して、最初に設定されたリデューサーの数でモジュロ演算を実行します。

したがって、10 GB のデータ (両方のテーブルを合わせて) をロードする場合、約 10 個のレデューサーが存在するはずです。
いいえ、列ごとに結合するとしましょうID。次の出力を想定します。
hash(101)=101 -> 101%10=1
hash(102)=102 -> 102%10=2
hash(1001)=1001 -> 1001%10=1

したがって、ID 列の値が 101 と 1001 の行はレデューサー #1 に移動し、ID 102 はレデューサー #2 に移動します。それでも10個のレデューサーがありますが、すべてのデータに上記のIDしかない場合、8個のレデューサーは入力を取得せず、2個のレデューサーが残りを取得します。

于 2013-08-07T17:07:03.897 に答える
1

理論的には、レデューサーが 1 つだけの場合と複数の場合の両方の状況があります。使用されるレデューサーの正確な数は、クエリの詳細によって異なります。

スクリプトで以下を使用して、使用するレデューサーの数を設定することができます。

set mapred.reduce.tasks=50

これが実際にパフォーマンスの向上につながるかどうかは、実行しているクエリによって異なります。詳細については、この回答も参照してください。

それが役立つことを願っています。

于 2013-08-07T06:09:33.927 に答える