更新時(shí)間:2021-01-12 來源:黑馬程序員 瀏覽量:
問題分析
本題主要是考察學(xué)員對(duì)mapreduce的熟悉程度
核心答案講解
(1)reduce side join
reduce side join是一種最簡(jiǎn)單的join方式,其主要思想如下:
在map階段,map函數(shù)同時(shí)讀取兩個(gè)文件File1和File2,為了區(qū)分兩種來源的key/value數(shù)據(jù)對(duì),對(duì)每條數(shù)據(jù)打一個(gè)標(biāo)簽 (tag),比如:tag=0表示來自文件File1,tag=2表示來自文件File2。即:map階段的主要任務(wù)是對(duì)不同文件中的數(shù)據(jù)打標(biāo)簽。
在reduce階段,reduce函數(shù)獲取key相同的來自File1和File2文件的value list, 然后對(duì)于同一個(gè)key,對(duì)File1和File2中的數(shù)據(jù)進(jìn)行join(笛卡爾乘積)。即:reduce階段進(jìn)行實(shí)際的連接操作。
(2)map side join
之所以存在reduce side join,是因?yàn)樵趍ap階段不能獲取所有需要的join字段,即:同一個(gè)key對(duì)應(yīng)的字段可能位于不同map中。Reduce side join是非常低效的,因?yàn)閟huffle階段要進(jìn)行大量的數(shù)據(jù)傳輸。
Map side join是針對(duì)以下場(chǎng)景進(jìn)行的優(yōu)化:兩個(gè)待連接表中,有一個(gè)表非常大,而另一個(gè)表非常小,以至于小表可以直接存放到內(nèi)存中。這樣,我們可以將小表復(fù)制多 份,讓每個(gè)map task內(nèi)存中存在一份(比如存放到hash table中),然后只掃描大表:對(duì)于大表中的每一條記錄key/value,在hash table中查找是否有相同的key的記錄,如果有,則連接后輸出即可。
(3)SemiJoin
SemiJoin,也叫半連接,是從分布式數(shù)據(jù)庫(kù)中借鑒過來的方法。它的產(chǎn)生動(dòng)機(jī)是:對(duì)于reduce side join,跨機(jī)器的數(shù)據(jù)傳輸量非常大,這成了join操作的一個(gè)瓶頸,如果能夠在map端過濾掉不會(huì)參加join操作的數(shù)據(jù),則可以大大節(jié)省網(wǎng)絡(luò)IO。
實(shí)現(xiàn)方法很簡(jiǎn)單:選取一個(gè)小表,假設(shè)是File1,將其參與join的key抽取出來,保存到文件File3中,F(xiàn)ile3文件一般很小,可以放到 內(nèi)存中。在map階段,使用DistributedCache將File3復(fù)制到各個(gè)TaskTracker上,然后將File2中不在File3中的 key對(duì)應(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ù)場(chǎng)景比較少。
reduce的join將需要join的數(shù)據(jù)集都作為map的輸入,在map的邏輯中對(duì)數(shù)據(jù)進(jìn)行標(biāo)記,reduce中對(duì)數(shù)據(jù)進(jìn)行合并,需要自定義數(shù)據(jù)類型
猜你喜歡:
Hadoop與Spark的區(qū)別有哪些?【大數(shù)據(jù)培訓(xùn)】
云計(jì)算大數(shù)據(jù)培訓(xùn)之大數(shù)據(jù)Hadoop生態(tài)圈:Pig(1)