MapReduce的MapTask執行機制


Map階段流程:input File通過split被邏輯切分為多個split文件,通過Record按行讀取內容給map(用戶自己實現的)進行處理,數據被map處理結束之后交給OutputCollector收集器,對其結果key進行分區(默認使用hash分區),然后寫入buffer,每個map task都有一個內存緩沖區,存儲着map的輸出結果,當緩沖區快滿的時候需要將緩沖區的數據以一個臨時文件的方式存放到磁盤,當整個map task結束后再對磁盤中這個map task產生的所有臨時文件做合並,生成最終的正式輸出文件,然后等待reduce task來拉數據。

詳細步驟:

  1. 首先,讀取數據組件InputFormat(默認TextInputFormat)會通過getSplits方法對輸入目錄中文件進行邏輯切片規划得到splits,有多少個split就對應啟動多少個MapTasksplitblock的對應關系默認是一對一。
  2. 將輸入文件切分為splits之后,由RecordReader對象(默認LineRecordReader)進行讀取,以\n作為分隔符,讀取一行數據,返回<key,value>Key表示每行首字符偏移值,value表示這一行文本內容。
  3. 讀取split返回<key,value>,進入用戶自己繼承的Mapper類中,執行用戶重寫的map函數RecordReader讀取一行這里調用一次。
  4. map邏輯完之后,將map的每條結果通過context.write進行collect數據收集。在collect中,會先對其進行分區處理默認使用HashPartitioner
    1. MapReduce提供Partitioner接口,它的作用就是根據keyvaluereduce的數量來決定當前的這對輸出數據最終應該交由哪個reduce task處理。默認對key hash后再以reduce task數量取模。默認的取模方式只是為了平均reduce的處理能力,如果用戶自己對Partitioner有需求,可以訂制並設置到job上。
  5. 接下來,會將數據寫入內存,內存中這片區域叫做環形緩沖區,緩沖區的作用是批量收集map結果,減少磁盤IO的影響。我們的key/value對以及Partition的結果都會被寫入緩沖區。當然寫入之前,keyvalue值都會被序列化成字節數組。
    1. 環形緩沖區其實是一個數組,數組中存放着keyvalue的序列化數據和keyvalue的元數據信息,包括partitionkey的起始位置、value的起始位置以及value的長度。環形結構是一個抽象概念。
    2. 緩沖區是有大小限制,默認是100MB。當map task的輸出結果很多時,就可能會撐爆內存,所以需要在一定條件下將緩沖區中的數據臨時寫入磁盤,然后重新利用這塊緩沖區。這個從內存往磁盤寫數據的過程被稱為Spill(溢寫)。由單獨線程完成,不影響往緩沖區寫map結果的線程。溢寫線程啟動時不應該阻止map的結果輸出,所以整個緩沖區有個溢寫的比例spill.percent。這個比例默認是0.8,也就是當緩沖區的數據已經達到閾值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢寫線程啟動,鎖定這80MB的內存,執行溢寫過程。Map task的輸出結果還可以往剩下的20MB內存中寫,互不影響。
  6. 當溢寫線程啟動后,需要對這80MB空間內的key排序(Sort)。排序是MapReduce模型默認的行為,這里的排序也是對序列化的字節做的排序。
    1. 如果job設置了Combiner,那就是使用Combiner的時候。將有相同keykey/value對的value加起來,減少溢寫到磁盤的數據量。Combiner會優化MapReduce的中間結果,所以它在整個模型中會多次使用。
    2. 那哪些場景才能使用Combiner呢?從這里分析,Combiner的輸出是Reducer的輸入,Combiner絕不能改變最終的計算結果。Combiner只應該用於那種Reduce的輸入key/value與輸出key/value類型完全一致,且不影響最終結果的場景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它對job執行效率有幫助,反之會影響reduce的最終結果。
  7. 每次溢寫會在磁盤上生成一個臨時文件(須先判斷是否有combiner),如果map的輸出結果真的很大,有多次這樣的溢寫發生,磁盤上相應的就會有多個臨時文件存在。當整個數據處理結束之后開始對磁盤中的臨時文件進行merge合並,因為最終的文件只有一個,寫入磁盤,並且為這個文件提供了一個索引文件,以記錄每個reduce對應數據的偏移量。
  8. map整個階段結束。
 




免責聲明!

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



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