教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Hadoop實(shí)現(xiàn)join的有幾種方法?【大數(shù)據(jù)面試題】

更新時(shí)間:2021年01月12日15時(shí)00分 來源:傳智教育 瀏覽次數(shù):

問題分析

本題主要是考察學(xué)員對mapreduce的熟悉程度

核心答案講解

(1)reduce side join

reduce side join是一種最簡單的join方式,其主要思想如下:
在map階段,map函數(shù)同時(shí)讀取兩個(gè)文件File1和File2,為了區(qū)分兩種來源的key/value數(shù)據(jù)對,對每條數(shù)據(jù)打一個(gè)標(biāo)簽 (tag),比如:tag=0表示來自文件File1,tag=2表示來自文件File2。即:map階段的主要任務(wù)是對不同文件中的數(shù)據(jù)打標(biāo)簽。
在reduce階段,reduce函數(shù)獲取key相同的來自File1和File2文件的value list, 然后對于同一個(gè)key,對File1和File2中的數(shù)據(jù)進(jìn)行join(笛卡爾乘積)。即:reduce階段進(jìn)行實(shí)際的連接操作。

(2)map side join

之所以存在reduce side join,是因?yàn)樵趍ap階段不能獲取所有需要的join字段,即:同一個(gè)key對應(yīng)的字段可能位于不同map中。Reduce side join是非常低效的,因?yàn)閟huffle階段要進(jìn)行大量的數(shù)據(jù)傳輸。
Map side join是針對以下場景進(jìn)行的優(yōu)化:兩個(gè)待連接表中,有一個(gè)表非常大,而另一個(gè)表非常小,以至于小表可以直接存放到內(nèi)存中。這樣,我們可以將小表復(fù)制多 份,讓每個(gè)map task內(nèi)存中存在一份(比如存放到hash table中),然后只掃描大表:對于大表中的每一條記錄key/value,在hash table中查找是否有相同的key的記錄,如果有,則連接后輸出即可。

(3)SemiJoin

SemiJoin,也叫半連接,是從分布式數(shù)據(jù)庫中借鑒過來的方法。它的產(chǎn)生動機(jī)是:對于reduce side join,跨機(jī)器的數(shù)據(jù)傳輸量非常大,這成了join操作的一個(gè)瓶頸,如果能夠在map端過濾掉不會參加join操作的數(shù)據(jù),則可以大大節(jié)省網(wǎng)絡(luò)IO。
實(shí)現(xiàn)方法很簡單:選取一個(gè)小表,假設(shè)是File1,將其參與join的key抽取出來,保存到文件File3中,F(xiàn)ile3文件一般很小,可以放到 內(nèi)存中。在map階段,使用DistributedCache將File3復(fù)制到各個(gè)TaskTracker上,然后將File2中不在File3中的 key對應(yīng)的記錄過濾掉,剩下的reduce階段的工作與reduce side join相同。

問題擴(kuò)展

map的join是將一個(gè)數(shù)據(jù)集的數(shù)據(jù)放入Map集合中,將集合在setup放入到緩存中,所以涉及DistributedCache,因?yàn)樯婕霸趦?nèi)存,所以放入緩存的數(shù)據(jù)集樣本要小,否則不適用,所以這個(gè)業(yè)務(wù)場景比較少。
reduce的join將需要join的數(shù)據(jù)集都作為map的輸入,在map的邏輯中對數(shù)據(jù)進(jìn)行標(biāo)記,reduce中對數(shù)據(jù)進(jìn)行合并,需要自定義數(shù)據(jù)類型


猜你喜歡:

hadoop虛擬機(jī)如何安裝和配置JDK?

大數(shù)據(jù)培訓(xùn):hadoop中常見問題以及解決方案

面試題之hadoop相關(guān)

傳智教育大數(shù)據(jù)培訓(xùn)課程

0 分享到:
和我們在線交談!