Map Reduce
Mapper接口
extends Mapper<LongWritable, Text, Text, IntWritable>
輸入key類型,輸入value類型,輸出key類型氛琢,輸出value類型
void map(LongWritable, Text, Context)
輸入key類型,輸入value類型
context.write(Text, IntWritable)
輸出key類型肯污,輸出value類型
Reducer接口
extends Reducer<Text, IntWritable, Text, IntWritable>
輸入key類型碍遍,輸入value類型噪叙,輸出key類型渐裂,輸出value類型
void reduce(Text, Iterable<IntWritable>, Context)
輸入key類型豺旬,輸入value類型
context.write(Text, IntWritable)
輸出key類型,輸出value類型
MapReduce機(jī)制
角色:client, JobTracker, TaskTracker, HDFS
Client: 提交job到JobTracker
JobTracker: 分發(fā)任務(wù)給TaskTracker, 輸入分片 Input Split
TaskTracker: 執(zhí)行小任務(wù)柒凉,每個(gè)分片一個(gè)map任務(wù)
HDFS:存儲(chǔ)數(shù)據(jù)
過程:
- 輸入分片(Input Split):分片在在HDFS里
- map:輸入分片split族阅,輸出到內(nèi)存緩沖區(qū)
- shuffle: 排序,key相同的數(shù)據(jù)放在一起膝捞,分區(qū) partitioner
- reduce: 一個(gè)分區(qū)partition對(duì)應(yīng)一個(gè)reduce
shuffe階段
- partition: 根據(jù)key把k-v放入某個(gè)partition耘分。在內(nèi)存緩沖區(qū)優(yōu)化,決定數(shù)據(jù)交給哪個(gè)reducer處理绑警,負(fù)載均衡
- spill: 每個(gè)partition里的k-v進(jìn)行排序,并且執(zhí)行combine央渣。sort & combine计盒,優(yōu)化,通常跟reducer是一樣的芽丹,寫磁盤
- merge: 每個(gè)partition里的k-v寫成group:k-list(?) 磁盤可能有多個(gè)溢寫文件北启,需要merge成一個(gè)?merge成group: key, list?
- fetch: 從不同的map拉取中間結(jié)果
- merge: 合并來自不同map的輸出文件
分片 split
- 根據(jù)map task的數(shù)量來確定分片的數(shù)目拔第,確定分片的大小
分區(qū) partition
- 為了解決map的結(jié)果數(shù)據(jù)太大咕村?交給多個(gè)reduce去處理?
- 同一個(gè)key的所有數(shù)據(jù)都寫入同一個(gè)分區(qū)蚊俺?不能分散到多個(gè)分區(qū)懈涛?
- 分區(qū)的數(shù)量默認(rèn)由reducer確定,一個(gè)分區(qū)里包括多個(gè)key
- map會(huì)把輸出數(shù)據(jù)寫到多個(gè)分區(qū)文件泳猬?
- reduce去map拉取分區(qū)文件批钠,然后處理?
歸并排序
- 先把大數(shù)組分解成小數(shù)組
- 小數(shù)組兩兩排序
謝謝閱讀得封!