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