1、与Map差不多,继承Reducer,一样是四个泛型参数。
前两个泛型参数指的是Map输出的k-v类型(即reduce输入的k-v类型)
后两个就是Reducer自身输出的k-v类型
2、然后要实现Reducer的reduce方法。
这个方法与Mapper的map方法有一点点区别,但是区别不大。
第一个参数是输入的key(map输出的key),第二个参数是valueList,第三个参数是context
(1)其中第一个和第三个参数变化不大。。就略过。。
(2)第二个参数是怎么来的呢?
首先假设,Mapper的map方法每次调用context.write方法就相当于把一个key-value对添加到一个list中。
然后,在调用Reducer的reduce方法之前,hadoop的mapreduce框架会把上面的list根据key进行分组。也就是说,key相同的value都属于同一组,就会被添加到该key对应的valueList中
最后,交给reduce处理。
最后,根据上面可以知道,如果是分布式高并发的调用mapper的map,那么在调用reduce之前,hadoop框架会确保所有map都执行结束(即所有数据都经过map处理过了),然后才会根据key进行分组,再集群调用reduce进行汇总。