hadoop_mr_錶鏈接

鏈接(Join)是關係運算,能夠用於合併關係(relation)。對於數據庫中的錶鏈接操做,可能已經廣爲人知了。在 MapReduce 中,鏈接能夠用於合併兩個或多個數據集。例如,用戶基本信息和用戶活動詳情信息。用戶基本信息來自於 OLTP 數據庫。用戶活動詳情信息來自於日誌文件。數據庫

    MapReduce 的鏈接操做能夠用於如下場景:緩存

  • 用戶的人口統計信息的聚合操做(例如:青少年和中年人的習慣差別)。架構

  • 當用戶超過必定時間沒有使用網站後,發郵件提醒他們。(這個必定時間的閾值是用戶本身預約義的)app

  • 分析用戶的瀏覽習慣。讓系統能夠基於這個分析提示用戶有哪些網站特性尚未使用到。進而造成一個反饋循環。優化

  • 全部這些場景都要求將多個數據集鏈接起來。   網站

  •  

  最經常使用的兩個鏈接類型是內鏈接(inner join)和外鏈接(outer join)。以下圖所示,內鏈接比較兩個關係中全部的元組,判斷是否知足鏈接條件,而後生成一個知足鏈接條件的結果集。與內鏈接相反的是,外鏈接並不須要兩個關係的元組都知足鏈接條件。在鏈接條件不知足的時候,外鏈接能夠將其中一方的數據保留在結果集中。日誌

爲了實現內鏈接和外鏈接,MapReduce 中有三種鏈接策略,以下所示。這三種鏈接策略有的在 map階段,有的在 reduce 階段。它們都針對 MapReduce 的排序-合併的架構進行了優化。blog

  •     重分區鏈接(Repartition join)— reduce 端鏈接。使用場景:鏈接兩        個或多個大型數據集。 排序

  •     複製鏈接(Replication join)— map 端鏈接。使用場景:待鏈接的數        據集中有一個數據集足夠ip

  •     半鏈接(Semi-join)— 另外一個 map 端鏈接。使用場景:待鏈接的數據        集中有一個數據集很是    

2,選擇最佳鏈接策略

    要選擇鏈接數據的最優方法,咱們這裏使用數據驅動的決策樹來選擇最佳鏈接策略。

這個決策樹能夠總結如下三點:

  1. 若是其中有一個數據集小到足夠放入到一個 mapper 的內存,則 map only 複製鏈接最有效。

  2. 若是兩個數據集都很大,其中一個數據集可經過預過濾(與其它數據集數據不匹配的)元素而大大減小體積,則 semi-join(半鏈接)最合適。

  3. 若是不能對數據進行預處理,而且數據體積太大而不能被緩存—這意味着咱們不得不在 reducer端執行 join 鏈接—須要使用重分區鏈接(repartition join)

  4. 無論應用哪一種策略,咱們在 join 中應該執行的最基本的活動是使用過濾和投影。 

3,過濾和投影

    使用過濾和投影減小處理的數據量,使用下推優化技術來改善數據管道。過濾和投影工做原理以下圖所示:

     應該儘量地靠近數據源執行過濾和投影;在 MapReduce 中,最好是在 mapper 中執行這個工做。例以下面的代碼執行過濾:

投影和謂詞下推動一步將過濾推動到存儲格式。這甚至更高效,特別是使用基於下推能夠 skip 過記錄或 blocks 的存儲格式時。

  下表列出了各類存儲格式以及是否支持下推: 

相關文章
相關標籤/搜索