【概念】詳解MapReduce原理

MapReduce原理

原理圖1
原理圖2

Map階段

  • 文件在被讀取(調用read())的是用Inputformat方法讀入的。在這裏讀入一行,返回一個key-vlaue(K,V)對,key是行號的偏移量,value的值是這一行的內容。
  • 在上述過程當中,在第4步調用map()方法後,將以上內容真正轉換成(key,value)的形式,key爲值,value爲1,而後調用context.write方法將該數據寫出來
  • 通過outputcollector收集器以後會寫入環形緩衝區。在環形緩衝區會作以下幾件事
    1. 排序,調用的是快速排序法
    2. 分區,調用的 hashpartitioner分區。達到80%以後會溢出將文件寫到磁盤。相同的hash值會分到一個分區中,能夠認爲設定分區數。排序的時候是依據partition和key兩個來做爲依據的。同一個partition中是按照key進行排序的
  • 第7步:環形緩衝區spill溢寫到磁盤中,會溢出屢次到不一樣的分區中,以後會進行merge,並進行歸併排序。將多個小文件合併成大文件,因此合併以後的大文件仍是分區,而且分區內部是有序的
  • Combiner階段是可選項,形式上也是一種reduce操做。在這個過程當中能夠直接讓相同key的value進行聚合(相加等),減小數據量以及在網絡中傳輸的開銷,能大大提升效率

Reduce階段

  • Reduce階段會去map階段merge以後的文件中拿數據,按照相同的分區去取數據。reduce中有分區號,將數據拿過來以後會存儲在本地磁盤。此過程會進行I/O讀寫,並有相應的網絡傳輸
  • 拿到數據後,會按照相同的分區,再將取過來的數據進行merge歸併排序,大文件的內容按照key有序進行排序
  • 以後會調用 groupingcomparator 進行分組,以後的reduce中會按照這個分組,每次取出一組數據,調用reduce中自定義方法進行處理
  • 最後調用outputformat將內容寫入到文件中

Shuffle階段

  • 核心機制:數據分區,排序,緩存,分發

原理圖3

針對MR原理進行HIVE優化

  1. 優化整體思路就是減小數據傾斜,下降I/O,下降網絡傳輸量
    1. 數據傾斜:是指在shuffle的過程當中,把大量相同的key分到了一個Reduce節點上進行處理,其餘的key分到其餘Reduce節點上,致使Reduct Task處理完後,還有一個Reduct Task節點還在處理數據。最終致使整個Reduce的延遲狀況
  2. 採用分而治之的方式,在Sql層面,經過改寫Sql進行優化

環形緩衝區默認100M,mr.sort.mb=100M緩存

參考連接:網絡

相關文章
相關標籤/搜索