0108: MapReduce: Simplified Data Processing on Large Clusters

一、介绍

这是一篇04 google 发表一篇关于分布式计算的论文,主要介绍Map Reduce的编程计算模型。MapReduce用来处理和生成大型数据集。用户指定map处理输入数据生成一组中间键值对和指定reduce函数处理所有中间键值对中与同一键值关联的值。hadoop的计算模型便来源于此。

二、计算流程

MapReduce 执行流程.png
  1. 将输入数据分割成M份,用户代码拷贝到集群中所有的机器中。
  2. 所有用户代码的拷贝中,有一份是特殊的,作为Master, 其余的作为worker.Master 会为空闲的 worker 分配任务(map 或 **reduce **)。 Master 起到调度和监督作用。
  3. 被分到mapworker, 会读取与之关联的输入数据(M份数据之一),将输入数据解析成键值对的形式(key-value), 生产出中间过程的键值对,并缓存到内存中。
  4. 被缓存的数据会定期,写入磁盘中,分区函数会将其分为R份(Rreduce 数量),并将这些数据的存储位置发给Master, 方便Master将其发送给执行 reduceworker.
  5. reduce 在获取这被缓存的中间过程的键值对数据后,会通过RPC读取这些数据,当读取完毕后,会将所有的数据进行排序,以便相同的键值的数据可以分到一起。这一步是很关键的,可以减少键值对数量。
  6. reduce 将排序好的数据,传递给用户编写的reduce函数进行处理,输出会被添加到这个reduce分区对应的文件中。
  7. 当所有的 mapreduce 完成后,Master 在用户程序中返回结果。

三、容错

如果集群中某一个mapreduce 出错了该怎么办呢?

1. worker 出错
  • Master 会定期的检查所有的节点(类似心跳包)状态,如果超时worker没用响应,则认为出错了。 Master 会将其重置到空闲,作为其他的任务候选执行者。
  • 对于出错的worker 已经完成的map将会被重新执行,已完成的reduce 不会, 因为map 的输出结果是存储在出错机器本地,是不可靠的。reduce输出结果存在全局系统中。
  • 被重新执行的map任务会通知对应reduce任务。
2. Master 出错
  • Master 会把当前的结果定期的存到一个checkpoint, 用于出错后恢复。有一点我不理解为啥只有一个Master节点呢?这不是很容易造成单点问题吗?hadoop 的实现中应该代替的节点作为Master节点出错后替代者。
3. 备份执行

集群分布式计算往往会出现个别worker计算很慢,当大部分的worker已经完成任务的时候,这些worker 还要花费不少的时间。于是论文提出了,备份执行的方案,让已经完成的任务的worker 去继续执行未完成的任务, 作为备份,无论主任务还是备份任务一旦被完成,即认为该任务被完成。

四、优化

  • 用户可以自定义分区函数,实行特定功能
  • 有序性保证:保证给定的分区数据是有序的,可以是reduce排序更快。
  • Combiner Function: 对于会在map产生大量键值对的计算任务,通过Combiner Functionmap 之后, reduce之前合并重复键值的键值对元素, 减少带宽和存储压力。
  • 对异常输入,跳过。
  • 分布式计算很难debug, 论文提出一个小的在本地运行的程序模拟集群运行效果方便调试。
  • 状态信息: 集群中节点状态和相关信息会通过http反馈到网页上。
总结

这篇论文的内容我只介绍了一部分,中间有些缺失,感兴趣可以阅读原文。

你可能感兴趣的:(0108: MapReduce: Simplified Data Processing on Large Clusters)