MapReduce:
整个called job,每个map 每个reduce 调用called task
有许多worker servers上面有多个mapreduce,有一个主server组织整个计算
主server上有5000个input,发给不同的空闲worker机器
每次map调用emit时,worker进程都会把这个数据写入本地disk
每次调用reduce前,一个worker会和其它几千台server一一进行通信
reduce的结果写入文件集群server中的一个文件
目标:可以读任意worker的任何input
需要一个地方存input:GFS(分布式存储,大文件shard)一般放在和MR同个cluster上,快
master从GFS上找出input1所在的server,在这个server上 用mapreduce执行map(input1)操作
所以input → Map 这里是本地读取(如果没有就就近)
Map→output 也是本地存。【同台机器存的是每一行】
但是从map(的output)到reduce(的input)就需要网络,把它们发到一台机器上【因为reduce要的是每一列】
shuffle:从行转换成列
Map(k, v):拆分
// k:一般忽略;v:输入文本
split v into words
for each word in words:
emit(word, ‘1’)
// mapreduce会为每个给定的key调用reduce,以接收它的所有实例
Reduce(k, v):
//reduce根据这个key关联的所有map对应的值得到一个vector数组
emit(len(v))