Hive中Join的 MR 底層原理

籠統的說,Hive中的Join可分爲Common Join(Reduce階段完成join)和Map Join(Map階段完成join)。本文簡單介紹一下兩種join的原理和機制。

一、 Hive Common Join

如果不指定MapJoin或者不符合MapJoin的條件,那麼Hive解析器會將Join操作轉換成Common Join,即:在Reduce階段完成join.
整個過程包含Map、Shuffle、Reduce階段。

  • Map階段

讀取源表的數據,Map輸出時候以 Join on 條件中的列爲key,如果Join有多個關聯鍵,則以這些關聯鍵的組合作爲key;
Map輸出的 value 爲 join 之後所關心的(select或者where中需要用到的)列;同時在value中還會包含表的 Tag 信息,用於標明此value對應哪個表;
按照key進行排序

  • Shuffle階段

根據key的值進行hash,並將key/value按照hash值推送至不同的reduce中,這樣確保兩個表中相同的key位於同一個reduce中

  • Reduce階段
    根據key的值完成join操作,期間通過Tag來識別不同表中的數據。

以下面的HQL爲例,圖解其過程:

SELECT
a.id,a.dept,b.age
FROM a join b
ON (a.id = b.id);

Hive Common Join

看了這個圖,應該知道如何使用MapReduce進行join操作了吧。

二、 Hive Map Join

MapJoin通常用於一個很小的表和一個大表進行 Join 的場景,具體小表有多小,由參數hive.mapjoin.smalltable.filesize來決定,該參數表示小表的總大小,默認值爲25000000字節,即25M。
0.7版本之後,默認自動會轉換Map Join,由參數 hive.auto.convert.join 來控制,默認爲true.
仍然以前面的HQL來說吧,假設a表爲一張大表,b爲小表,並且hive.auto.convert.join=true,那麼Hive在執行時候會自動轉化爲MapJoin。

Hive MapJoin

  • 如圖中的流程,首先是Task A,它是一個Local Task(在客戶端本地執行的Task),負責掃描小表b的數據,將其轉換成一個HashTable的數據結構,並寫入本地的文件中,之後將該文件加載到DistributeCache中,該HashTable的數據結構可以抽象爲:
key value
1 26
2 34

0625-2.jpg

圖中紅框圈出了執行Local Task的信息。

  • 接下來是Task B,該任務是一個沒有Reduce的MR,啓動MapTasks掃描大表a,在Map階段,根據 a 的每一條記錄去和DistributeCache中 b 表對應的 HashTable 關聯,並直接輸出結果。
  • 由於 MapJoin 沒有Reduce,所以由 Map直接輸出結果文件,有多少個Map Task,就有多少個結果文件。

轉載:lxw的大數據田地 » [一起學Hive]之十-Hive中Join的原理和機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章