1.客戶端將每一個block塊切片(邏輯切分),每一個切片都對應一個map任務,默認一個block塊對應一個切片和一個map任務,split包含的信息:分片的元數據信息,包含起始位置,長度,和所在節點列表等算法
2.map按行讀取切片數據,組成鍵值對,key爲當前行在源文件中的字節偏移量,value爲讀到的字符串網絡
3.map函數對鍵值對進行計算,輸出<key,value,partition(分區號)>格式數據,partition指定該鍵值對由哪一個reducer進行處理。經過分區器,key的hashcode對reducer個數取模。
4.map將kvp寫入環形緩衝區內,環形緩衝區默認爲100MB,閾值爲80%,當環形緩衝區達到80%時,就向磁盤溢寫小文件,該小文件先按照分區號排序,區號相同的再按照key進行排序,歸併排序。溢寫的小文件若是達到三個,則進行歸併,歸併爲大文件,大文件也按照分區和key進行排序,目的是下降中間結果數據量(網絡傳輸),提高運行效率
5.若是map任務處理完畢,則reducer發送http get請求到map主機上下載數據,該過程被稱爲洗牌shuffle
6.能夠設置combinclass(須要算法知足結合律),先在map端對數據進行一個壓縮,再進行傳輸,map任務結束,reduce任務開始
7.reduce會對洗牌獲取的數據進行歸併,若是有時間,會將歸併好的數據落入磁盤(其餘數據還在洗牌狀態)
8.每一個分區對應一個reduce,每一個reduce按照key進行分組,每一個分組調用一次reduce方法,該方法迭代計算,將結果寫到hdfs輸出框架
1.copy:一個reduce任務須要多個map任務的輸出,每一個map任務完成時間極可能不一樣,當只要有一個map任務完成,reduce任務當即開始複製,複製線程數配置mapred-site.xml參數「mapreduce.reduce.shuffle.parallelcopies",默認爲5.函數
2.copy緩衝區:若是map輸出至關小,則數據先被複制到reduce所在節點的內存緩衝區大小配置mapred-site.xml參數「mapreduce.reduce.shuffle.input.buffer.percent」,默認0.70),當內存緩衝區大小達到閥值(mapred-site.xml參數「mapreduce.reduce.shuffle.merge.percent」,默認0.66)或內存緩衝區文件數達到閥值(mapred-site.xml參數「mapreduce.reduce.merge.inmem.threshold」,默認1000)時,則合併後溢寫磁盤。
3.sort:複製完成全部map輸出後,合併map輸出文件並歸併排序
4.sort的合併:將map輸出文件合併,直至≤合併因子(mapred-site.xml參數「mapreduce.task.io.sort.factor」,默認10)。例如,有50個map輸出文件,進行5次合併,每次將10各文件合併成一個文件,最後5個文件。線程
框架會對鍵,值序列化,所以鍵類型和值類型須要實現writable接口3d
框架會對鍵進行排序,所以必須實現writableComparable接口 code