mapreduce框架內部核心工做流程

mapreduce框架內部核心工做流程圖

流程

一、mapTask調用InputFormat再調用RecourReader的read()方法來讀取數據,得到key、value,mapreduce經過InputFormat來解耦
二、read()方法依靠一次讀取一行的邏輯來讀取原始文件的數據,返回key、value,mapTask會將其交給自定義的Mapper
三、map方法咱們會調用context.write方法來輸出數據到OutPutCollector類,OutPutCollector會將數據放到(內存中存放 默認MR.SORT.MB:100MB能夠本身配置,通常不會放滿默認80%,這裏面還要留有空間排序默認20%)環形緩衝區(其實就是一個bite()數組,若是寫滿了,那麼就會一邊寫一邊將開始的數據回收,而後繼續寫到回收後的位置上,造成了環形緩衝區)
四、環形緩衝區的溢出的數據溢出以前會經過Hashpartioner進行分區、排序(默認是快速排序法key.compareTO),會經過spiller寫入到mapTask工做目錄的本地文件(全部溢寫文件分區且區內有序)
五、全部溢出的文件會作歸併排序造成mapTask的最終結果文件,一個mapTask對應一個最終結果文件,造成幾個分區就會有對應幾個reduceTask。reduceTask的個數由配置文件或者參數設置,只要不設置自定義partitioner,那麼這裏的分區會動態適配reduceTask個數。若是設置了自定義partitioner,那麼就須要提早設置對應的reduceTask的個數
六、每一個reduceTask都會到每個mapTask的節點去下載分區文件到reduceTask的本地磁盤工做目錄
七、爲了保證最後的結果有序,reduceTask任務A須要再次從全部mapTask下載到的對應文件從新進行歸併排序
八、reduceTask的內部邏輯寫在reducer的reduce(key,values)方法,經過調用GroupingComparaor(key,netxtk)或者自定義GroupingComparaor來判斷哪些key是一組,造成key和values。
九、reducer的reduce方法最後經過context.writer(key,v)寫到輸出文件(全部reduceTask的輸出文件都有序),輸出路徑由提交任務時的參數決定,默認文件名part-r-00000
十、若是設置了combiner,那麼溢寫排序文件會調用,歸併排序時也會combiner,將加快shluffer的效率,可是通常狀況下不建議使用,若是符合條件下必定要使用,也能夠直接指定reducer爲combiner,不必重複寫代碼數據庫

兩個核心點:

map reduce編程模型:把數據運算流程分爲2個階段編程

階段1:讀取原始數據,造成key-value數據(map方法)數組

階段2:將階段1的key-value數據按照相同的key分組聚合(reduce方法)app

mapreduce編程模型的具體實現(軟件):Hadoop中的mapreduce框架;spark框架

hadoop中的mapreduce框架:oop

對編程模型階段1的實現就是:map taskspa

map task:.net

讀數據:InputFormat-->TextInputFormat:讀文本文件orm

                                  -->SequenceFileInputFormat:讀Sequence文件對象

                                   -->DBInputFormat:讀數據庫

處理數據:map task經過調用Mapper類的map()方法實現對數據處理

分區:將map階段產生的key-value數據,分發給若干個reduce task來分擔負載,

map task調用Partitionner類的getPartition()方法來決定如何劃分數據給不一樣的reduce task

對編程模型階段2的實現就是:reduce task

對key-value數據排序:調用key.compareTo()方法來實現對key-value數據排序

reduce task:

讀數據:經過HTTP方式從maptask產生的數據文件中下載屬於本身的「區」的數據到本地磁盤,

而後將多個同區文件(作合併,歸併排序)

處理數據:經過調用GroupingComparator的compare()方法來判斷文件中的哪些key-value

屬於同一組,而後將這一組數據傳給Reducer類的reduce()方法聚合一次

輸出結果:調用OutPutFormat組件將結果key-value數據寫出去

OutputFormat-->TextOutputFormat:寫文本文件(一對key-value寫一行。分隔符號\t)

                       -->SequenceFileOutputFormat:寫Sequence文件(直接將key-value對象序列化到文件中)

                       -->DBOutputFormat

    

版權@須臾之餘https://my.oschina.net/u/3995125

相關文章
相關標籤/搜索