1. 程式人生 > >MR計算模型三

MR計算模型三

MapReduce的作業執行涉及的4個獨立實體

  1. 客戶端:(client)
  2. 編寫mapreduce程式,配置作業,提交作業,這就是程式設計師完成的工作。
  3. JobTracker:
  4. 初始化作業,分配作業,與TaskTracker通訊,協調整個作業的執行。
  5. TaskTracker:
  6. 保持與JobTracker的通訊,在分配的資料片段上執行Map或Reduce任務,TaskTracker和JobTracker的不同有個很重要的方面,就是在執行任務的時候TaskTracker可以有n多個,JobTracker則只會有一個。

MapReduce運作詳解1

流程角度運作機制詳解:

  1. 客戶端編寫好mapreduce程式,配置好mapreduce的作業(也就是job)。
  2. 提交job到JobTracker上。
  3. JobTracker分配一個新的job任務的ID值;
  4. 檢查輸出目錄是否存在,如果存在就丟擲錯誤給客戶端;
  5. 檢查輸入目錄是否存在,如果不存在同樣丟擲錯誤;
  6. 根據輸入計算輸入分片(input split),如果分片計算不出來也會丟擲錯誤。

MapReduce運作詳解2

  1. 以上檢查都通過,JobTracker就會配置Job需要的資源。
  2. JobTracker初始化作業,將Job放入一個內部的佇列,讓配置好的作業排程器能排程到這個作業。
  3. 作業排程器初始化job,建立一個正在執行的job物件(封裝任務和記錄資訊),以便JobTracker跟蹤job的狀態和程序
  4. 作業排程器獲取輸入分片資訊(input split),每個分片建立一個任務。

MapReduce運作詳解3

  1. taskTracker執行一個簡單的迴圈機制定期傳送心跳給JobTracker(間隔五秒,可配置),心跳是JobTracker和taskTracker溝通的橋樑,通過心跳,jobTracker可以監控taskTracker是否存活,也可以獲取taskTracker處理的狀態和問題,同時taskTracker也可以通過心跳裡返回值獲取jobTracker給它的操作指令。
  2. 分片執行任務,在任務執行時候jobTracker可以通過心跳機制監控taskTracker的狀態和進度,同時也能計算出整個job的狀態和進度,而tasktracker也可以本地監控自己的狀態和進度。
  3. 當jobtracker獲得了最後一個完成指定的taskTracker操作成功的通知時候,jobTracker會把整個job狀態設為成功。

MapReduce運作詳解4

  1. 然後當客戶端查詢job執行狀態時候(非同步操作),客戶端會查詢到job完成的通知的,任務執行完成。
  2. 如果job中途失敗,mapreduce也會有相應機制處理,一般而言如果不是程式本身有bug,mapreduce錯誤處理機制都能保證提交的job能正常完成,如果是程式本身bug,任務在重複執行2~3次後,會結束執行,jobTracker會把job狀態設定為失敗。

MapReduce運作詳解5

  1. 輸入分片(input split):在進行map計算之前,mapreduce會根據輸入檔案計算輸入分片,每個輸入分片針對一個map任務,輸入分片儲存的並非資料本身,而是一個分片長度和一個記錄資料的位置的陣列,輸入分片往往和hdfs的block關係很密切。
  2. 假如我們設定hdfs的快的大小是64mb,如果我們輸入有三個檔案,大小分別是3mb,65mb和127mb,那麼mapreduce會把3mb檔案分為一個輸入分片,65分為兩個分片,而127也是兩個,
  3. 換句話說我們如果在map計算前做輸入分片調整,例如合併小檔案,那麼就會有5個map任務執行,而且每個map執行的資料大小不均,出現資料傾斜,這個也是mapreduce優化計算的一個關鍵點。

MapReduce運作詳解6

  1. map結算:就是我們寫的map函式,map函式效率相對好控制,而且一般map操作都是本地化操作也就是在資料儲存節點上進行;map函式每次處理一行資料,map主要用於資料的分組,為下一步reduce的運算做資料準備,map的輸出救贖reduce的輸入。

MapReduce運作詳解7

  1. combiner階段:combiner階段是可選的,combiner是一個本地化的reduce操作,它是map運算的後續操作,主要在map計算出中間檔案前做一個簡單的合併重複的key值的操作,使傳入reduce的檔案變小,這樣就是提高了頻寬的傳輸效率,畢竟hadoop計算力頻寬資源往往是計算的瓶頸也是最寶貴的資源,但是combiner操作是有風險的,使用它的原則是combiner的輸入不會影響到reduce計算的最終輸入
  2. 例如:如果計算只是求總數,最大值,最小值可以使用combiner,但是做平均值計算使用combiner的話,最終的reduce計算結果就會出錯。

MpReduce運作詳解8

  1. shuffle階段:
  2. 將map的輸出作為reduce的輸入的過程就是shuffle了。
  3. 這個是mapreduce優化的重點地方。
  4. shuffle一開始就是map階段做輸出操作,一般mapreduce計算的都是海量資料,map輸出時候不可能把所有檔案都放到記憶體操作,因此map寫入磁碟的過程十分複雜,更何況map輸出時候要對結果進行排序,記憶體開銷是很大的,
  5. map在做輸出時候會在記憶體裡開啟一個環形緩衝區,這個緩衝區專門用來輸出的,預設大小是100mb,並且在配置檔案裡面為這個緩衝區設定一個閥值,預設是0.8,同時map還會為輸出操作啟動一個守護執行緒,如果緩衝區的記憶體達到了閥值的80%時候,這個守護執行緒就會把內容寫入磁碟上,這個過程叫spill,另外的20%記憶體可以繼續寫入要寫進磁碟的資料,寫入磁碟和寫入記憶體操作互補干擾的,
  6. 如果快取區被撐滿了,那麼map就會組織寫入記憶體的操作,讓寫入磁碟操作完成後再繼續執行寫入記憶體操作,寫入磁碟前會有個排序操作,就是在寫入磁碟操作的時候進行,不是在寫入記憶體時候進行的,如果我們定義了combiner函式,那麼排序前會執行combiner操作。

MapReduce運作詳解9

  1. 每次spill操作也就是寫入磁碟操作時候就會寫一個溢位檔案,也就是說在做map輸出有幾次spill就會產生多少個溢位檔案,等map輸出全部完成後,map會合並這些輸出檔案
  2. 這個過程還有一個partitioner操作,partitioner操作和map階段的輸入分片很像,一個partitioner對應一個reduce作業,如果我們mapreduce操作只有一個reduce操作,那麼partitioner就只有一個,如果有多個reduce操作,那麼partitioner賭贏的就會有多個,partitioner因此即使reduce的輸入分片,這個我們可以變成控制,只要是根據實際key和value的值,根據實際業務型別或者為了更好的reduce則在均衡要求進行,這是提高reduce效率的一個關鍵所在。
  3. 到了reduce階段就是map輸出檔案了,partitioner會找到對應的map輸出檔案,然後進行復制操作,複製操作時reduce會開啟幾個複製執行緒,這些執行緒預設是5個,我們也可以在配置檔案更改複製執行緒的個數,這個複製過程和map寫入磁碟過程類似,也有閥值和記憶體大小,
  4. 閥值一樣可以在配置檔案裡配置,而記憶體大小是直接使用reduce的tasktracker的記憶體大小,複製時候reduce還會進行排序操作和合並檔案操作,這些操作完成了就會進行reduce計算了。

MapReduce運作詳解10

  1. reduce階段:
  2. 我們編寫的reduce函式,reduce的輸入時map輸出,reduce是主要的邏輯暈眩階段,我們絕大部分業務邏輯都是在reduce階段完後才能的,並把最終結果儲存在hdfs上的。