Hadoop實現join的三種方法是什么呢?我們先來說說Hadoop,它是一個由Apache基金會所開發的分布式系統基礎架構。在用戶并不了解分布式底層細節的情況下也可以開發分布式程序。它充分利用集群的威力進行高速運算及存儲。Hadoop它其實實現了一個分布式文件系統,它的框架最核心的設計就是:MapReduce,HDFS。HDFS是為海量的數據提供了存儲空間,而MapReduce就是為海量數據提供了運算。要知道只有當線程結束時,join方法才可以繼續執行相關語句。我們來現在來說說Hadoop實現join的三種方法。
第一種:reduce side join
Reducesidejoin是最簡單的連接方式,其主要思想如下:
在映射階段,映射函數同時讀取兩個文件文件1和文件2,為了區分來自兩個源的鍵/值數據對,每個數據都被標記。例如,標記=0表示來自文件文件1,標記=2表示來自文件文件2,即地圖階段的主要任務是標注不同文件中的數據。
在reduce階段,reduce函數從具有相同鍵的File1和File2文件中獲取valuelist,然后將File1和File2中的數據連接到相同的鍵。也就是說,實際的連接操作在減少階段執行。
第二種:map side join
reducesidejoin之所以存在,是因為在映射階段無法獲得所有必要的連接字段,也就是說,相同關鍵詞對應的字段可能在不同的映射中。Reducesidejoin效率不高,因為在洗牌階段有大量的數據傳輸。
Mapsidejoin優化了以下幾個場景:要連接的兩個表中有一個很大,另一個很小,小表可以直接存儲在內存中。這樣,我們就可以在每個maptask內存中制作一個副本(例如存儲在hashtable中),然后只掃描大表:對于大表中的每個記錄鍵/值,找出hashtable中是否有相同的鍵記錄,如果有,連接后輸出。
第三種:SemiJoin
SemiJoin,也稱為半連接,是從分布式數據庫中借用的一種方法。其動機是:對于reducesidejoin,跨機器的數據傳輸量非常大,已經成為join操作的瓶頸。如果能在地圖端過濾掉不參與加入操作的數據,可以大大節省網絡IO。
實現方法很簡單:選擇一個小表,假設是File1.提取它的鍵進行聯接,保存在File3中,文件3通常很小,可以放在內存中。在映射階段,使用分布式緩存將文件3復制到每個任務跟蹤器,然后過濾掉文件2中不在文件3中的鍵對應的記錄。reduce階段的其余工作與reducesidejoin相同。
Mapjoin是把一個數據集的數據放入mapset,在setup中把該集放入緩存,所以涉及到DistributedCache,因為涉及到內存,所以放入緩存的數據集樣本要小,否則不適用,所以這個業務場景比較少。在reduce的連接中,所有需要連接的數據集都作為map的輸入,數據在map的邏輯中標記,數據在reduce中合并,需要用戶自定義數據類型。
以上我們介紹了Hadoop實現join的三種方法,希望能夠對大家有一定的幫助,如果您想繼續了解相關內容,請您繼續關注中培偉業。