MapReduce shuffle過程淺析


整個shuffle的流程圖

Paste_Image.png

Map Shuffle的作用以及相應(yīng)的設(shè)置

  1. partition

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


        Paste_Image.png
  2. sort

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

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


        Paste_Image.png
      2. 尋找要設(shè)置的相關(guān)屬性


        compress.png
      3. 內(nèi)置的三種壓縮算法


        compresssuanfa.png
      4. 配置key,value


        peizhi.png
  2. spill

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

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

Reduce Shuffle的作用以及相應(yīng)的設(shè)置

  1. merge

    • 過程:reduce拷貝map()最終輸出的磁盤數(shù)據(jù),一個reduce應(yīng)該拷貝每個map節(jié)點的相同partition的數(shù)據(jù)。
    • 作用:因為有多個map節(jié)點,拷貝后的數(shù)據(jù)文件不止一份,先進性合并操作,為后面的排序做準(zhǔn)備。
  2. sort

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

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

shuffle階段中Comparator的理解和作用

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


    sort.png

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


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


      比較4.png

MapReduce執(zhí)行過程中中間數(shù)據(jù)的壓縮配置和其余的配置

  1. 壓縮配置見map過程
  2. 設(shè)置reduce的數(shù)目
    job.setNumReduceTasks(tasks);其中tasks為int型整數(shù)。合理的設(shè)置reduce數(shù)目是一種性能調(diào)優(yōu),實際生產(chǎn)環(huán)境中最好用測試的方式來抉擇較好的reduce數(shù)目
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容