MapReduce阅读笔记+实现心得

贡献

parallelization,
fault-tolerance,
locality optimization,
load balancing

心得

restricting the programming model makes it easy to parallelize and distribute computations and to make such computations fault-tolerant.

瓶颈

网络带宽

Map

{
拆分数量: M 远大于worker机器数 一个worker处理多个任务增强了动态负载均衡且加快了宕机恢复速度:the many map tasks it has completed can be spread out across all the other worker machines

Output: R个临时文件 原子性

完成后:message master,包括R个临时文件的名字(若master已经收到过这个task的信息,则忽略此信息),master将这R个临时文件的名字记录到master data structure

Combiner Function:map完成后可以使用自定义Combiner Function将结果合一下,生成中间文件

输入文件备份:GFS将输入文件分成64MB的块,并存储3个备份,当一个map task 失败时,会启用一个靠近存储输入备份的worker(如在同一个交换机下)
}

Reduce

{
拆分数量: R 远大于worker机器数

Output: 1个文件 原子性

完成后:原子性重命名临时输出文件为最终输出文件(当多个备份任务也完成时,GFS保证一个任务只有一个输出文件,没有重复的)

}

partition: hash(key) mod R

Master Data Structures

{
state: idle, in-progress, completed

identity of the worker machine

locations and sizes: of the R 个map任务的中间文件
}

Fault Tolerance

Worker Failure

Map:
已完成的任务:中间文件已保存至GFS,无需重新运行
未完成的任务:中间文件保存在本地,需重新运行

所有运行Reduce任务的worker会收到map worker重新运行通知,还没有从失败worker A读数据的reduce worker会从另一个重新运行任务的worker B读数据

Master Failure

master周期性写checkpoint
从上一个checkpoint重新运行

Backup Tasks

无论是主任务还是备份任务完成,任务都将被标记为完成

Skipping Bad Records

每个worker都安装了一个signal handler

运行map或reduce之前,会将argument的序列号记录在一个全局变量中

遇到错误时,会将此序列号发给master

如果某个record有多个失败,它会被跳过

其他

Debug

由于分布式不好debug,google开发了一个本地MapReduce用于调试,所有操作串行执行

Status Information

master有一个http服务器用于显示info,如哪些worker失败了,它们导致哪些map和reduce任务失败了

分析bug有用

Counters

worker的count value附在ping的response中回给master

 

使用GO实现MapReduce的心得

  1. worker id 不能复用,crashedWorker的answer要直接抛弃。存在crashedWorker复活情景:crashedWorker由于运行时间过长被master认为crash,但中途没有worker对这个task answer,然后crashedWorker正常answer
  2. hash出来的值不一定能覆盖到所有范围,如[0,nReduce),可能只有4个值能取到
  3. 函数参数赋值和普通赋值均是复制成一个新变量,修改新变量不会影响老变量,注意指针问题
posted @ 2021-09-02 16:49  Numerz  阅读(296)  评论(0编辑  收藏  举报