今天分享一下大數據開發(fā)的熱點問題
問題分析
本題主要是考察學員對mapreduce的熟悉程度
核心答案講解
(1)reduce side join
reduce side join是一種最簡單的join方式膨桥,其主要思想如下:
在map階段虽填,map函數同時讀取兩個文件File1和File2搔谴,為了區(qū)分兩種來源的key/value數據對,對每條數據打一個標簽 (tag)墨坚,比如:tag=0表示來自文件File1,tag=2表示來自文件File2于宙。即:map階段的主要任務是對不同文件中的數據打標簽扛稽。
在reduce階段吁峻,reduce函數獲取key相同的來自File1和File2文件的value list, 然后對于同一個key在张,對File1和File2中的數據進行join(笛卡爾乘積)用含。即:reduce階段進行實際的連接操作。
(2)map side join
之所以存在reduce side join帮匾,是因為在map階段不能獲取所有需要的join字段啄骇,即:同一個key對應的字段可能位于不同map中。Reduce side join是非常低效的瘟斜,因為shuffle階段要進行大量的數據傳輸缸夹。
Map side join是針對以下場景進行的優(yōu)化:兩個待連接表中,有一個表非常大哼转,而另一個表非常小明未,以至于小表可以直接存放到內存中。這樣壹蔓,我們可以將小表復制多 份,讓每個map task內存中存在一份(比如存放到hash table中)猫态,然后只掃描大表:對于大表中的每一條記錄key/value佣蓉,在hash table中查找是否有相同的key的記錄披摄,如果有,則連接后輸出即可勇凭。
(3)SemiJoin
SemiJoin疚膊,也叫半連接,是從分布式數據庫中借鑒過來的方法虾标。它的產生動機是:對于reduce side join寓盗,跨機器的數據傳輸量非常大,這成了join操作的一個瓶頸璧函,如果能夠在map端過濾掉不會參加join操作的數據傀蚌,則可以大大節(jié)省網絡IO。
實現方法很簡單:選取一個小表蘸吓,假設是File1善炫,將其參與join的key抽取出來,保存到文件File3中库继,File3文件一般很小箩艺,可以放到 內存中。在map階段宪萄,使用DistributedCache將File3復制到各個TaskTracker上艺谆,然后將File2中不在File3中的 key對應的記錄過濾掉,剩下的reduce階段的工作與reduce side join相同拜英。
問題擴展
map的join是將一個數據集的數據放入Map集合中擂涛,將集合在setup放入到緩存中,所以涉及DistributedCache聊记,因為涉及在內存撒妈,所以放入緩存的數據集樣本要小,否則不適用排监,所以這個業(yè)務場景比較少狰右。
reduce的join將需要join的數據集都作為map的輸入,在map的邏輯中對數據進行標記舆床,reduce中對數據進行合并棋蚌,需要自定義數據類型。分享一些相關的Hadoop教程