模型架構:
- 執行計算任務有兩個角色一個是JobTracker,一個是TaskTracker,前者用於管理和調度工作,后者用於執行工作。
- 一般來說一個Hadoop集群由一個JobTracker和N個TaskTracker構成。
- 可以理解為shuffle描述着Map task到Reduce task的整個過程
執行流程:
- 每次的計算任務都分為兩個階段,一個Map階段一個Reduce階段。(shuffle階段位於Map和Reduce的中間)
- Map階段接收一組鍵值對形式的值<key,Value>,然后對這個輸入進行處理並輸出一組鍵值對形式的值 (map接收的數據是由InputFormat處理過的先spilt然后再生成鍵值對)
- Reduce接收Map輸出的結果進行計算並輸出(map過程產生的數據默認寫入內存緩沖區,因為在內存里可以提高combine和sort的速度,默認的緩沖區的大小為100MB可以進行配置,但是當緩沖區的內存使用大於一定的值得時候會發生溢寫,默認是使用率80%,一個后台的線程就會啟動把緩沖區的數據寫入到磁盤中,往內存中寫入的線程會繼續的執行)
- 當(Spill)寫入線程啟動后,會對這80MB空間內的key/value對進行sort。排序是MapReduce模型的默認行為,首先進行key排序,對於key相同的按照value進行排序。
- Combine(規約)發生在Spill的階段本質上Combine就是Reduce,通過Combine可以減少輸入reduce的數據量,優化MR的中間數據量
- 每次的Spill都會在本地聲稱一個Spill文件,如果map的數據量很大進行了多次的spill磁盤上對應的會有多個的spill文件存在、當map task 真正的完成的時候,內存緩沖區中的數據也會spill到本地磁盤上形成一個spill文件,所以磁盤上最少會有一個spill文件的存在,因為最終的文件只能有一個,所以需要把這些spill文件歸並到一起,這個歸並的過程叫做Merge
- Merger是把多個不同的spill文件合並到一個文件,所以可能會發生有相同的key的事情,如果這時候設置過Combiner就會直接用Combiner來合並相同的key
- reduce分為四個子階段 ①從各個map task上讀取相應的數據 ②sort ③執行reduce函數 ④把結果寫到HDFS中