這裏的分片不是物理分片,輸入分片存儲的並非數據本身,而是壹個分片長度和壹個記錄數據的位置的數據
例如10MB文件,切分10各1MB小文件,0-1MB位置定義為第壹個切片,1MB-2MB定義為第二個分片
map階段(每個分片對應壹個map task)
每個mapper任務都是壹個java進程,它讀取hdfs文件中自己對應的輸入分片,將分片中記錄按照壹定規則調用map函數解析成鍵值對,如<word,1>,<word,1>形式,如果有100個鍵值對,就調用100次map方法
鍵:每壹行的起始位置值:本行的文本內容
map shuffle階段、洗牌階段,分區partition,排序sort,combine(本地reducer),合並
map方法輸出的數據,進入到內存緩沖區,緩沖區滿了後,啟動線程寫磁盤,在啟動線程寫磁盤之前,對數據進行key的hash分區,對每個分區進行key值排序,設置了combiner,則對排序的數據做簡單的合並重復key值操作,如<word,2>,寫磁盤操作會產生多個文件,當map寫完磁盤後則對文件進行壹次合並,確保壹個map task最終只生成壹個數據文件
reduce shuffle階段:copy、merge、reduce
map方法輸出完成後,reduce線程會啟動copy線程,請求所有map task的輸出結果,如果reduce端接收的數據量小,則直接存內存中,數據量超過內存,則數據數據合並後寫磁盤,在寫磁盤過程中會把這些文件合並成壹個更大的有序文件,最後壹次合並的結果沒有寫磁盤,直接輸入給reduce函數中
對copy過來的數據先放入內存緩沖區中,如果是數據量超過緩沖區大小,則對數據合並後寫磁盤,如果設置combiner,combiner也可以這個時候做合並,如果map task1中的<word,1>,map task2中的<word,2>,那麽combiner之後則為<word,{1,2}>
調用reduce函數
reduce階段分組好的<word,{1,2}>,調用reduce函數進行聚合<word,3>,將結果輸出到hdfs,每個reduce進程會對應壹個輸出文件,名稱以part-開頭
詞頻統計mr過程:
split:由於輸入文件太大,mapreduce會對其進行分割,大文件會被切分成多份
map:解析出每壹行中的每個單詞,並在後面記上數字1,表示此單詞出現過1次
shuffle:將每壹份中相同的單詞分組到壹起,並按默認字母順序進行升序排序
reduce:將每壹組中的單詞出現的次數進行累加求和
以上復雜的運行過程,用壹張圖來簡單說明,方便理解和記憶,如下圖所示: