Hadoop mapreduce執行過程涉及api

資源的申請,分配過程略過,從開始執行開始。緩存

mapper階段: 首先調用默認的PathFilter進行文件過濾,肯定哪些輸入文件是須要的哪些是不須要的,而後調用inputFormat的getSplits方法進行文件的分割,返回inputSplit列表,每一個inputSplit會分到對應的mapper執行。以後調用默認的createRecordReader()方法,肯定傳給map函數處理的key和value。map函數執行的結果先存到緩存中,默認大小是100M,當達到閥值0.8也就是80M時會寫入磁盤文件,寫入磁盤以前會進行分區,不一樣區的數據會給不用的reduce處理。調用默認Partitioner的getPartition()方法進行分區,分區以後進行key默認的排序,也可讓自定義的key實現WriteableComparable接口進行自定義排序規則。排序後進行分組,分組的目的時key值相同的,value會放到一個集合中,可讓key值繼承RowComparator實現自定義分組。分組後看用戶是否自定義了Combine(能夠說是本地reduce程序),若是定義了則執行Combine函數進行合併數據,合併後寫入本地磁盤。當map任務結束以前會進行一次所有文件的合併,由於在map的執行過程達到80M會進行寫一次文件,可能存在多個文件,因此須要進行一次合併。過程是同樣的,會進行分區,排序,分組,若是有Combine則進行Combine,不一樣分區的結果存放在一個文件中,經過索引進行區分不一樣的分區。固然對於map的結果能夠進行可選性壓縮,須要進行手動的設置。app

reduce階段: 從各個map節點獲取本身對應的分區,map的完成時間時不一樣的,reduce會週期性的詢問是否有完成的map須要copy,reduce存在5個copy線程(能夠經過mapreduce.reduce.shuffle.parallelcopies配置),一旦有屬於本身的那部分分區的map執行完,就會將其copy過來。map端不會當即刪除數據,由於可能出現reduce失敗重作。
若是map輸出的數據足夠小,則會被拷貝到reduce任務的JVM內存中(能夠經過mapreduce.reduce.shuffle.input.buffer.percent配置JVM堆內存的多少比例能夠用於存放map任務的輸出結果)。若是數據太大容不下,則被拷貝到reduce的機器磁盤上。當達到緩衝區的閥值時,會寫入磁盤,後臺的一個線程會對寫入磁盤的文件進行合併和排序,若是有Combine同時也進行Combine較少佔用存儲大小。最後會造成一個排序後的文件,做爲reduce的輸入。執行結果保存到hdfs。函數

相關文章
相關標籤/搜索