MapReduce中的源码分析:
map端的源码分析:
MapReduce阶段,map中key面向文章的偏移量=上一行面向文章的偏移量+本行相对于上一行的偏移量+本单词相对于本行的偏移量。
这个key为本单词相对于文章的偏移量
这个是MapReduce中map的输出,调用context的write方法,前边对应的是key,后边对应的是value的值。
在方法被调用的时候,方法中参数的传递有两种:值传递和应用传递
应用传递,传递的是地址
以上这种是值传递,外部的值不会跟着内部的值的变化而变化的
int a=3;
{
a=5
}
a=3
//方法的实现体中对a进行重新赋值
//外部的a=3不会随着内部a=5的变化而变化的
int a=3;
{
*a=5
}
a=5
//内部的a传递的是外部的a的应用地址
Integer a= new Integer a
{
a=5
}
a=5
//这种传递是应用传递,传递的是堆内存中对象的应用地址
这种就是应用传递了。
放在这个地方是为了避免频繁地GC
输入数据集由map映射成中间数据集,也就是映射成了(K,V)键值对的形式
中间数据集最终交给reduce去完成
reduce端从map端拉取数据,reduce的输入来自map的输出
map端完成的是计算向数据移动的过程,map的输出会存在map的主机,供reduce从map端拉取数据的,也就是抽象的名词叫做shuffle,也就是reduce端数据向计算移动的过程,而map端完成的是计算向数据移动的过程。
reduce端完成的是数据向计算移动的过程
reduce端分析:
reduce端的输入正好是map端的输出
map端的run方法:
源语中:相同的key为一组,这一组key调用一次reduce方法。
reduce中的run方法:
reduce端做的事情:
shuffle是从map端copy一份数据过来的。
shuffle就是reduce从map端拷贝数据的过程
有的人认为是从map端的(k,v) p进入缓冲区,然后排序,归并等,最后到reduce端拉取,排序等都叫做shuffle
MapReduce中map端的接口: