1.ReduceTask
同mapper阶段类似,reduce阶段处理一个个reducetask,只不过mapper阶段mapper的map处理的是每一个切片的按行读取的数据。而reducetask的reduce处理的是每一个分区中每组数据的聚合汇总。
2.Reducer类
同样执行一个reducetask会调用一次run方法,而run方法则会调用setup
,reduce
和cleanup
方法。其中setup和cleanup方法在此同样没有方法体代码。
setup方法(每一个分区中进行扥组汇总前调用一次,分区维度的)
protected void setup(Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException {
}
cleanup方法(同样是分区维度的调用,每一个分区内数据汇总完毕后才会调用一次)
protected void cleanup(Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException {
}
reduce方法
protected void reduce(KEYIN key, Iterable<VALUEIN> values, Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException {
Iterator var4 = values.iterator(); // 获取当前组中value的迭代器对象
while(var4.hasNext()) {
VALUEIN value = var4.next();
context.write(key, value);
}
}
由于reduce方法的调用频率是每组调用一次,所以reduce方法的key对应的是mapper阶段的key,而value则是每一个分区内该key的所有value值的一个迭代器。
而且,一般是Mapper的key类型和值的类型作为Reducer的输入key类型和输入value类型。而reduce的输出key和value的类型的话,通常是按照需求设计而定。