問題分析
本題主要是考察學員對mapreduce的熟悉程度
核心答案講解
(1)reduce side join
reduce side join是一種最簡單的join方式,其主要思想如下:
在map階段,map函式同時讀取兩個檔案file1和file2,為了區分兩種**的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是針對以下場景進行的優化:兩個待連線表中,有乙個表非常大,而另乙個表非常小,以至於小表可以直接存放到記憶體中。這樣,我們可以將小表複製多 份,讓每個map task記憶體中存在乙份(比如存放到hash table中),然後只掃瞄大表:對於大表中的每一條記錄key/value,在hash table中查詢是否有相同的key的記錄,如果有,則連線後輸出即可。
(3)semijoin
semijoin,也叫半連線,是從分布式資料庫中借鑑過來的方法。它的產生動機是:對於reduce side join,跨機器的資料傳輸量非常大,這成了join操作的乙個瓶頸,如果能夠在map端過濾掉不會參加join操作的資料,則可以大大節省網路io。
實現方法很簡單:選取乙個小表,假設是file1,將其參與join的key抽取出來,儲存到檔案file3中,file3檔案一般很小,可以放到 記憶體中。在map階段,使用distributedcache將file3複製到各個tasktracker上,然後將file2中不在file3中的 key對應的記錄過濾掉,剩下的reduce階段的工作與reduce side join相同。
問題擴充套件
map的join是將乙個資料集的資料放入map集合中,將集合在setup放入到快取中,所以涉及distributedcache,因為涉及在記憶體,所以放入快取的資料集樣本要小,否則不適用,所以這個業務場景比較少。
reduce的join將需要join的資料集都作為map的輸入,在map的邏輯中對資料進行標記,reduce中對資料進行合併,需要自定義資料型別
Hadoop實現join的幾種方法
reduce side join是一種最簡單的join方式,其主要思想如下 在map階段,map函式同時讀取兩個檔案file1和file2,為了區分兩種 的key value資料對,對每條資料打乙個標籤 tag 比如 tag 0表示來自檔案file1,tag 2表示來自檔案file2。即 map階段...
Hadoop 中的兩表join
作為資料分析中經常進行的join 操作,傳統dbms 資料庫已經將各種演算法優化到了極致,而對於hadoop 使用的mapreduce 所進行的join 操作,去年開始也是有各種不同的算 文出現,討論各種演算法的適用場景和取捨條件,本文討論hive 中出現的幾種join 優化,然後討論其他演算法實現...
Hadoop 中的兩表join
作為資料分析中經常進行的join 操作,傳統dbms 資料庫已經將各種演算法優化到了極致,而對於hadoop 使用的mapreduce 所進行的join 操作,去年開始也是有各種不同的算 文出現,討論各種演算法的適用場景和取捨條件,本文討論hive 中出現的幾種join 優化,然後討論其他演算法實現...