整個shuffle的流程圖


整個shuffle的流程圖

 
Paste_Image.png

Map Shuffle的作用以及相應的設置

  1. partition

    • 過程:輸入的<key,value>對經過map()處理后輸出新的<key,value>對,它首先會被存儲到環形緩沖區中(字節數組實現)。該環形緩沖區的大小默認為100MB。並且會對每個<key,value>對hash一個partition值,相同partition值為同一個分區。
    • 作用:由於map()處理后的數據量可能會非常大,所以如果由一個reduce()處理效率不高,為了解決這個問題可以用分布式的思想,一個reduce()解決不了,就用多個reduce節點。一般來說有幾類分區就對應有幾個reduce節點,把相同分區交給一個reduce節點處理。
    • 設置
      • 環形緩沖區大小:mapred-site.xml中設置mapreduce.task.io.sort.mb的值
      • 環形緩沖區溢寫的閾值:mapred-site.xml中設置mapreduce.map.sort.spill.percent的值
      • partition:job.setPartitionerClass(cls)


         
        Paste_Image.png
  2. sort

    • 過程:把環形緩沖區中的數據根據partition值和key值兩個關鍵字升序排序。同一partition內的按照key排序。
    • 作用:一般來講mapreduce框架用來做各種排序操作,先在map端排序,減少reduce端排序的負擔。
    • 設置:job.setSortComparatorClass(cls)
       
      Paste_Image.png
  • combiner
    • 過程:將sort后的數據進行combiner操作
    • 作用:可以理解為map端的預reduce操作,在數據量非常大的時候,這樣的優化可以節省很多網絡帶寬和本地磁盤IO流的讀寫。
    • 設置:job.setCombinerClass(cls)
       
      Paste_Image.png
  1. compress

    • 過程:壓縮combiner輸出后的數據
    • 作用:減少本地磁盤的讀寫和減少reduce拷貝map端數據時的網絡帶寬
    • 設置
      1. Configuration對象用來解析XML文件,可以用set方法來設置屬性值。


         
        Paste_Image.png
      2. 尋找要設置的相關屬性


         
        compress.png
      3. 內置的三種壓縮算法


         
        compresssuanfa.png
      4. 配置key,value


         
        peizhi.png
  2. spill

    • 過程:將排序后的內存數據spill到本地磁盤中
    • 作用:因為數據量非常大,全部存放在內存中不太現實,所以最后還是會存到本地磁盤中
  3. merge

    • 過程:因為可能會有幾次spill,本身存放數據的out文件和存放數據偏移量索引index文件都會產生多個,把多個這樣的文件合並。
    • 作用:方便reduce的一次性拷貝。
    • 設置:
       
      mapsort.png

Reduce Shuffle的作用以及相應的設置

  1. merge

    • 過程:reduce拷貝map()最終輸出的磁盤數據,一個reduce應該拷貝每個map節點的相同partition的數據。
    • 作用:因為有多個map節點,拷貝后的數據文件不止一份,先進性合並操作,為后面的排序做准備。
  2. sort

    • 過程、作用:這里和map端的一樣。
  3. group

    • 過程:將排序好的<key,value>對進行分組,分組規則默認的是將相同key的value放在一起。
       
      fenzu.png
    • 作用:為了reduce()更好的計算相同key值出現的次數。
    • 設置:job.setGroupingComparatorClass(cls);
       
      比較2.png

shuffle階段中Comparator的理解和作用

  1. 被用來作為排序比較和分組比較的依據
  2. 排序比較和分組比較都是通過實現下圖中的接口方法


     
    sort.png

     
    比較2.png
    • 其中b1為第一個字節數組,s1為開始的index,l1為b1比較的長度,b2為第二個字節數組,s2為開始的index,l2為b2比較的長度


       
      比較3.png
    • 底層用到了java.util.Comparator.compare(T o1, T o2)函數


       
      比較4.png

MapReduce執行過程中中間數據的壓縮配置和其余的配置

  1. 壓縮配置見map過程
  2. 設置reduce的數目
    job.setNumReduceTasks(tasks);其中tasks為int型整數。合理的設置reduce數目是一種性能調優,實際生產環境中最好用測試的方式來抉擇較好的reduce數目


作者:心_的方向
鏈接:https://www.jianshu.com/p/fc36464f4c6d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM