假設連接B在A.a=B.a
上,並且它們都是大表。 Hive將通過通用連接來處理此連接操作。執行圖(由facebook提供): 蜂巢中常見連接的執行過程
但是我很困惑這個圖,是否只有在reducer?
據我瞭解,地圖輸出密鑰是table_name_tag_prefix+join_key
。但在分區階段,它仍然使用join_key分區記錄。在縮小階段,每個縮減器讀取具有相同連接鍵的<join_key,value>
,縮減器不需要讀取所有映射分割。
假設連接B在A.a=B.a
上,並且它們都是大表。 Hive將通過通用連接來處理此連接操作。執行圖(由facebook提供): 蜂巢中常見連接的執行過程
但是我很困惑這個圖,是否只有在reducer?
據我瞭解,地圖輸出密鑰是table_name_tag_prefix+join_key
。但在分區階段,它仍然使用join_key分區記錄。在縮小階段,每個縮減器讀取具有相同連接鍵的<join_key,value>
,縮減器不需要讀取所有映射分割。
從理論上講,有兩種情況,一種或多種減速機。使用的縮減器的確切數量將取決於查詢的詳細信息。
您可以嘗試在腳本中使用以下內容設置要使用的縮減器的數量。
set mapred.reduce.tasks=50
這是否實際上導致任何性能增加取決於您正在執行的查詢。有關更多詳細信息,另請參閱this answer。
希望有所幫助。
還原器的數量由(默認1GB)定義。
因此,對於映射器的每個輸入數據GB,您將得到1個reducer。
然後,配置單元在連接列上使用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個reducer,但是如果所有的數據都只有上面的ID,那麼8個reducer將不會得到任何輸入,2個reducer將會得到其餘的。