背景:
我们自己写的reduce方法要继承Reducer<Text, Text, Text, Text>,自定义的reduce方法中相同key的只会进入一次reduce,通过value迭代value。但是实际上框架并没有一次性把相同的key提前归类到一个组中,而是在程序运行的过程中一个kv对一个kv依次读取的并在顺序读的工程中实现了动态分组的功能,实现原理:
- 调用reduce方法的地方是:
//org.apache.hadoop.mapreduce.Reducer#run
public void run(Context context) throws IOException, InterruptedException {
setup(context);
try {
//context.nextKey()最终调用org.apache.hadoop.mapreduce.task.ReduceContextImpl#nextKeyValue读取kv数据对
while (context.nextKey()) {
reduce(context.getCurrentKey(), context.getValues(), context);
// If a back up store is used, reset it
Iterator<VALUEIN> iter = context.getValues().iterator();
if(iter instanceof ReduceContext.ValueIterator) {
((ReduceContext.ValueIterator<VALUEIN>)iter).resetBackupStore();
}
}
} finally {
cleanup(context);
}
}