MapReduce中reduce端的源码分析:
父类依然有run方法,依然有上下文,并且在上下文会判断
其实在里边传递的是迭代器对象
reduce端完成三种事情:
①:shuffle,就是拉取数据
②:sort就是排序
③:reduce就是按组计算
只有在map端才是真正的排序,其他的都是归并排序,内部有序,外部无序
一共做了三件事情:
shuffle的过程:
这个迭代器就是reduce端的输入:
排序有比较,分组也有比较
分组比较的结果有两种:等于和不等于
分组的宽度小于排序的宽度
在map端首先看用户有没有设置比较器(排序比较器),如果没有设置就按照默认的比较器进行排序
在reduce端首先看用户有没有设置分组比较器,如果用户没有设置,那么再看有没有设置排序比较器,如果连排序比较器都没有设置,那么就按照默认的比较器来比较。
在map端调用的是next key value
在reduce阶段调用的是next key
先清空数据
一组中的第一条数据和上一组的最后一条数据之间是没有关系的
map端的输出是reduce端的输入,map输出会序列化key和value到内存,内存的东西会序列化到磁盘,也是序列化的结果给reduce端计算的时候是需要进行反序列化的。
先拿出第一条数据,然后再拿出第二条数据与第一条进行比较
reduce端的返回数组:GetCurrentValues
getcurrentkey直接将key的值返回
getvalues:返回的是iterable
next key value方法会使用真迭代器
这里是真迭代器:
这里是假迭代器:
next key is same才会调用这一次方法:这样就调用了源语;相同的key为一组,这一组key调用一次reduce方法