MapReduce阅读笔记

MapReduce是什么?
MapReduce是一个分布式编程模型,用户只需实现map和reduce两个函数,就可以完成分布式的任务处理。
map函数将原始数据转换成中间KV对,Reduce函数将中间KV对根据K分组,相同的K对应一组V,最后生成最终文件。

MapReduce的具体流程:
1. MapReduce将输入文件分割成M个小文件。
2. 一共有M个map任务,R个reduce任务。master会选择一个状态为idle的worker分配任务。
3. 被分配到map任务的worker从对应的输入小文件中读取数据。这个worker就文件并产生中间KV,中间KV缓冲在内存上。
4. 缓冲在内存上的中间KV周期性的写到本地磁盘(worker所属机器的硬盘)里,本地磁盘分成R个块,key是K的中间KV写到hash(K)%R这个块上。存储位置会被传回给master,master会告诉reduce worker每个块的存储位置。
5. reduce worker根据master提供的位置信息,用RPC去读文件内容,reduce worker会将这些KV根据键进行排序,然后每个K对应一个值列表list(V)。
6. 在中间KV都排序并得到每个K的值列表后,reduce函数得到的就是(K, IteratorV),reduce函数用迭代器读出对应K的所有值V,输出附加到gfs上对应的输出文件(每个reduce任务对应一个输出文件)的最后。
7. 至此,MapReduce任务完成,唤醒用户代码。

Master的数据结构:
记录每个tasks的状态(idle,in-progress,completed),master会记录每个状态为in-progress或completed任务被处理的机器ID。master也会存储被map worker传回的中间KV存储位置。

容错机制:
worker崩溃:
master周期性的ping每个worker,如果一段时间没有响应,master认为这个worker挂掉了,所有由这个worker执行的map任务会被重新调度执行,因为map任务产生的输出在worker运行机器的磁盘上,挂掉后reduce worker就拿不到输入了。reduce任务不需要重新执行,因为输出在gfs上。由此机制,MapReduce可以容忍大规模的服务器崩溃,因为只需要简单的重新执行map任务就行了。
master挂掉:
每一段时间设置一个checkpoint记录master的数据结构,挂掉后再开一个master回滚。

局部性:
MapReduce会把输入文件分成若干个小文件块(大约64MB每个),每个块存在一般三台机子上,master分配任务时,如果该任务对应的输入文件所在的机子是空闲的,就分配到这台机子,这样可以不用远程读输入文件。如果都不空闲,就分配到一个离输入文件所在机子“最近”的机子(如使用同一个交换机),从而节省带宽。

任务粒度:
M个map任务,R个reduce任务。M和R应远比机器高,这样可以保证动态的负载平衡,当某些机子挂掉,可以快速由其他机子分配执行它执行过的任务。

备份任务:
当最后剩下几个map或reduce任务在慢机器上运行时可能导致结束得很慢,因此在最后会将这些任务在剩下的idle机器上运行,当一个任务的多个副本中的其中一个完成,则该任务完成。

改进:
每个partition输出文件的中间KV是有序的。
combiner函数:在map产生的输出发到网络前对输出进行合并,从而减少带宽使用。如计数程序:将5个(word, 1)合并成(word, 5)。combiner和reduce的区别是输出文件的不同。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值