MapReduce的表關聯

1.  Reduce端鏈接緩存

  Map端的主要工做:爲來自不一樣表(文件)的key/value對打標籤以區別不一樣來源的記錄。而後用鏈接字段做爲key,其他部分和新加的標誌做爲value,最後進行輸出。reduce端的主要工做:在reduce端以鏈接字段做爲key的分組已經完成,咱們只須要在每個分組當中將那些來源於不一樣文件的記錄(在map階段已經打標誌)分開,最後進行笛卡爾乘積就ok了。網絡

  之因此會存在reduce join這種方式,咱們能夠很明顯的看出緣由:由於總體數據被分割了,每一個map task只處理一部分數據而不可以獲取到全部須要的join字段,所以咱們須要在將join key做爲reduce端的分組將全部join key相同的記錄集中起來進行處理,因此reduce join這種方式就出現了。框架

Reduce端的不足分佈式

這種方式的缺點很明顯就是會形成map和reduce端也就是shuffle階段出現大量的數據傳輸,效率很低spa

 

2.  Map端鏈接blog

使用場景:一張表十分小、一張表很大。內存

  用法:在提交做業的時候先將小表文件放到該做業的DistributedCache中,而後從DistributeCache中取出該小表進行join key / value解釋分割放到內存中(能夠放大Hash Map等等容器中)。而後掃描大表,看大表中的每條記錄的join key /value值是否可以在內存中找到相同join key的記錄,若是有則直接輸出結果。資源

Map端鏈接原理效率

  DistributedCache是分佈式緩存的一種實現,它在整個MapReduce框架中起着至關重要的做用,他能夠支撐咱們寫一些至關複雜高效的分佈式程序。說回到這裏,JobTracker在做業啓動以前會獲取到DistributedCache的資源uri列表,並將對應的文件分發到各個涉及到該做業的任務的TaskTracker上。另外,關於DistributedCache和做業的關係,好比權限、存儲路徑區分、public和private等屬性容器

  另外還有一種比較變態的Map Join方式,就是結合HBase來作Map Join操做。這種方式徹底能夠突破內存的控制,使你毫無忌憚的使用Map Join,並且效率也很是不錯。

3.  SemiJoin半鏈接

  在map端過濾掉一些數據,在網絡中只傳輸參與鏈接的數據不參與鏈接的數據沒必要在網絡中進行傳輸,從而減小了shuffle的網絡傳輸量,使總體效率獲得提升,其餘思想和reduce join是如出一轍的。就是將小表中參與join的key單獨抽出來經過DistributedCach分發到相關節點,而後將其取出放到內存中(能夠放到HashSet中),在map階段掃描鏈接表,將join key不在內存HashSet中的記錄過濾掉,讓那些參與join的記錄經過shuffle傳輸到reduce端進行join操做,其餘的和reduce join都是同樣的。

相關文章
相關標籤/搜索