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