天天看點

【大資料】Hive Join 的原理與機制

作者:大資料老司機

一、概述

Hive是一個基于Hadoop的資料倉庫解決方案,它提供了類似于SQL的查詢語言,稱為HiveQL,用于處理結構化資料。在Hive中,JOIN操作用于将兩個或多個表中的資料連接配接在一起,以便進行聯合查詢和分析。

Hive 中 的 Join 可分為 Common Join(Reduce階段完成join)和 Map Join(Map 階段完成 join)。

Hive中的JOIN操作是通過MapReduce或Tez任務來執行的,具體的執行過程如下:

  1. 資料分片:Hive将參與JOIN操作的表按照指定的JOIN條件進行分片。每個分片是表的一個子集,用于并行處理。
  2. Map階段:在Map階段,Hive會為每個分片建立一個Map任務,并從輸入資料中提取JOIN條件所需要的鍵值對。對于每個鍵值對,Hive會将鍵發送到對應的Reducer節點,并将值存儲在中間緩存中。
  3. Shuffle階段:在Shuffle階段,Hive将具有相同鍵的鍵值對發送到相同的Reducer節點。這個過程稱為資料洗牌,它確定具有相同鍵的資料被發送到同一個Reducer節點進行處理。
  4. Reduce階段:在Reduce階段,Hive會為每個Reducer節點建立一個Reduce任務。每個Reduce任務接收來自不同Mapper節點的具有相同鍵的鍵值對,并執行JOIN操作。在JOIN操作中,Hive會根據JOIN條件将具有相同鍵的記錄組合在一起,生成JOIN結果。
【注意】Hive中的JOIN操作是通過兩個或多個表的列進行連接配接的。JOIN條件指定了哪些列用于比對。Hive支援多種類型的JOIN,包括INNER JOIN(内連接配接)、LEFT JOIN(左連接配接)、RIGHT JOIN(右連接配接)和FULL JOIN(全連接配接),可以根據需要選擇适當的JOIN類型。

此外,Hive還提供了一些優化技術來提高JOIN操作的性能,例如對表進行分區和對中間結果進行壓縮。這些技術可以減少資料移動和存儲開銷,加快JOIN操作的執行速度。

【總結】Hive中的JOIN操作通過MapReduce或Tez任務進行執行,包括資料分片、Map階段、Shuffle階段和Reduce階段。它使用JOIN條件将具有相同鍵的記錄組合在一起,生成JOIN結果。通過選擇适當的JOIN類型和使用優化技術,可以提高JOIN操作的性能。

二、環境準備

如果已經有了環境了,可以忽略,如果想快速部署環境可以參考我這篇文章:通過 docker-compose 快速部署 Hive 詳細教程

# 登入容器
docker exec -it hive-hiveserver2 bash
# 連接配接hive
beeline -u jdbc:hive2://hive-hiveserver2:10000  -n hadoop
           

三、Hive JOIN 類型

Hive是一個基于Hadoop的資料倉庫工具,用于處理大規模資料集。在Hive中,JOIN是一種常用的操作,用于将兩個或多個表中的資料按照指定的條件進行關聯。

【大資料】Hive Join 的原理與機制

Hive支援多種JOIN類型,包括:

  • 内連接配接(inner join 或者簡寫成 join):隻傳回兩個表中比對的行。内連接配接基于一個或多個條件(通常是相等條件),比對兩個表中的行,并将比對的行傳回為結果。隻有滿足條件的行才會被包含在結果中。

示例:

SELECT *
FROM table1
JOIN table2
ON table1.id = table2.id;
           
  • 左外連接配接(left outer join 或者簡寫成 left join):傳回左表中的所有行以及與右表比對的行。如果右表中沒有比對的行,則對應的結果列将包含NULL值。

示例:

SELECT *
FROM table1
LEFT JOIN table2
ON table1.id = table2.id;
           
  • 右外連接配接(right outer join 或者簡寫成 right join):傳回右表中的所有行以及與左表比對的行。如果左表中沒有比對的行,則對應的結果列将包含NULL值。

示例:

SELECT *
FROM table1
RIGHT JOIN table2
ON table1.id = table2.id;
           
  • 全外連接配接(full outer join 或者簡寫成 full join):傳回兩個表中的所有行,如果某一行在另一個表中沒有比對,則對應的結果列将包含NULL值。
SELECT *
FROM table1
FULL OUTER JOIN table2
ON table1.id = table2.id;
           

這些JOIN類型可以根據具體的業務需求選擇适當的類型。在Hive中,可以使用JOIN關鍵字來執行JOIN操作,并指定要連接配接的表以及連接配接條件。例如,使用"INNER JOIN"、"LEFT OUTER JOIN"、"RIGHT OUTER JOIN"、"FULL OUTER JOIN"等來指定JOIN類型。

根據具體的需求和資料情況,你可以選擇不同的JOIN類型來滿足查詢需求。

四、Map,Shuffle,Reduce三階段

MapReduce的全套過程分為三個大階段,分别是Map、Shuffle和Reduce。結合多篇資料,我最終确定劃分11個小步驟來描述這個過程,在後續的内容中我也會結合一部分源碼來進行剖析。

【大資料】Hive Join 的原理與機制

1)Map 階段

在Map階段,原始資料被分割成多個大小相同的資料塊,每個資料塊被配置設定給一個Map任務處理。Map任務将輸入資料轉化為一系列鍵值對,其中鍵是進行處理的對象,值是相關聯的資料。Map階段的輸出結果被儲存在本地磁盤上,等待Shuffle階段的處理。

2)Shuffle階段

在Shuffle階段,Map任務的輸出結果根據鍵被配置設定到不同的Reduce任務進行處理。這個過程稱為Shuffle過程。具體來說,每個Map任務會将其輸出結果按照鍵的哈希值分發到多個節點,每個節點對應一個Reduce任務。在Shuffle過程中,資料通過網絡傳輸,需要考慮網絡帶寬和網絡延遲等因素,以確定資料能夠及時地到達目标節點。

【大資料】Hive Join 的原理與機制

3)Reduce階段

在Reduce階段,每個Reduce任務将接收到的鍵值對根據鍵進行聚合或者排序等操作,然後生成最終的輸出結果。同樣,在Reduce階段的輸出結果會被儲存在本地磁盤上,最終彙總成最終的輸出結果。

【總結】可以看出,MapReduce架構中的三個階段都是分布式的,可以在多台計算機上并行運作。MapReduce架構能夠有效地處理大規模資料,并實作高效的分布式計算。由于MapReduce架構的通用性和可伸縮性,是以已經被廣泛應用于各種資料處理和機器學習任務。

五、Common Join(Reduce階段)

在Hive中,常見連接配接(Common Join)在Reduce階段進行。當執行常見連接配接時,Hive會首先對參與連接配接的表進行Map階段的處理,将資料按照連接配接條件進行分組和排序,并将它們發送到不同的Reduce任務中。

  • 在Reduce階段,每個Reduce任務會接收來自不同表的分組資料,并執行連接配接操作。具體而言,Reduce任務會對具有相同連接配接鍵的記錄進行配對,進而實作連接配接操作。這通常涉及将具有相同連接配接鍵的記錄組合在一起,以生成最終的連接配接結果。
  • 在Reduce階段,Hive使用MapReduce架構來執行常見連接配接操作。它通過将相同連接配接鍵的資料分發到相同的Reduce任務中,實作資料的比對和連接配接。這種分布式計算的方式可以有效地處理大規模資料集,并實作高效的連接配接操作。

需要注意的是,由于常見連接配接操作在Reduce階段進行,是以在執行大規模連接配接操作時,可能會産生大量的中間資料和計算開銷。是以,優化連接配接操作的性能是一個重要的考慮因素,可以通過調整Hive的配置參數、選擇适當的連接配接算法等方式來改善連接配接操作的性能。

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

SELECT a.id,a.dept,b.age
FROM a join b
ON (a.id = b.id);
           
【大資料】Hive Join 的原理與機制

六、Map Join(Map 階段)

Map Join 通常用于一個很小的表和一個大表進行 join 的場景,具體小表有多小,由參數hive.mapjoin.smalltable.filesize 來決定,預設值為 25M。滿足條件的話 Hive 在執行時候會自動轉化為 MapJoin,或使用 hint 提示 /*+ mapjoin(table) */ 執行 MapJoin。

【大資料】Hive Join 的原理與機制

如上圖中的流程:

  • 首先 Task A 在用戶端本地執行,負責掃描小表 b 的資料,将其轉換成一個HashTable 的資料結構,并寫入本地的檔案中,之後将該檔案加載到 DistributeCache 中。
  • 接下來的 Task B 任務是一個沒有 Reduce 的 MapReduce,啟動 MapTasks 掃描大表 a,在 Map 階段,根據 a 的每一條記錄去和 DistributeCache 中 b 表對應的 HashTable 關聯,并直接輸出結果,因為沒有 Reduce,是以有多少個 Map Task,就有多少個結果檔案。
【注意】Map JOIN 不适合 FULL/RIGHT OUTER JOIN。

關于 Hive Join 的原理與機制介紹就先到這裡了,有任何疑問歡迎給我留言或關注我公衆号【大資料與雲原生技術分享】加群交流或私信咨詢問題等待~