mapreduce论文第三部分

2018-05-14  本文已影响21人  WJL3333

运行时系统保存输入数据分区的细节。调度程序在集群的不同机器上执行,对失败任务进行处理,管理集群内机器之间的通信。

关键点在于如何并行计算,分发数据,处理任务失败。

编程模型
map(k1,v1) -> list(k2,v2)
reduce(k2,list(v2)) -> (v2)

例子

实现

3.0 谷歌使用的集群环境

3.1 执行流程

流程

3.2 master上保存的数据

3.3 容错机制

1.worker挂了

master会定期给worker发心跳信息,一段时间内没有回复的话,master就会标记节点为不可用状态。

如果一个map任务先被A执行(之后挂了)然后又被B执行,所有运行reduce任务的worker都会知道这个任务被重新运行了,之前没有从A读取数据的reduce task会从B读取数据。

2.master挂了

可以让master周期性的记录一些检查点来记录之前所说需要保存的数据,如果master挂了就启动另外一个任务复制这些检查点数据,恢复任务状态。
如果只有一个master,那么这个master是不允许失败的。当前的实现是让用户决定是否重新执行mapreduce任务

3.出现错误(Failure)时的语义保证

当用户提供的map和reduce任务是确定性的函数(纯函数)的时候,分布式实现和正常情况下执行结果是一致的。

我们依赖map和reduce任务的原子提交(atomic commits)来达到这个语义保证,每个正在运行的任务都会将其结果写入临时的私有文件中。
reduce任务会产生一个这样的文件,map任务会产生R个这样的文件。

多数写出的map和reduce操作都是确定性的,如果两个操作都是不确定的,假设map任务M和reduce任务 R1 R2。 e(Ri)表示第i个任务的执行完毕并提交。
弱语义产生是因为e(R1)可能读取一个M执行产生的结果。而e(R2)可能读取的是M的另外一次执行产生的结果。

3.4 数据本地性

网络带宽一般非常稀有。我们利用了输入数据实际上是保存在集群节点的本地磁盘的特性。GFS将每个文件分成64M大小的块,而且会存储每个块的副本在不同的机器上。
master会考虑输入文件信息的位置,并尝试调度map任务到包含对应输入文件副本的机器上去。如果不满足条件则尝试调度任务到离数据保存位置相对较近的位置上。
如果在集群中运行一个使用较大比例集群节点的mapreduce任务时,可以发现大部分任务都是从本地读取输入数据的。

3.5 任务粒度

map任务被分成M块,而reduce任务被分成R块。理想化来讲一般M和R都要远大于集群中的worker节点数目。让每个节点执行不同种类的任务可以动态的达到负载均衡,也会减少因为worker down掉导致的错误(failuer)的恢复速度。
参数边界:master需要做O(M+R)次调度决定,并在内存中保存O(R*M)种状态

一般来说我们会调整M来让每个单独的任务的输入文件正好是分布式文件系统的块大小,而且将R设置成想要使用的worker节点的倍数。

3.6 备份任务

一个导致任务执行时间较长的问题,是整个任务要等待那些运行时间较长的任务完成。我们使用了这个方案来缓解这种现象。
当一个mapreduce任务接近完成时,master调度一个备份执行,来执行那些正在进行的任务。无论哪个任务先完成(原来的任务和备份执行的任务)任务都会被标记为完成。虽然这样会增加资源的消耗,但是我们发现这大大减低了完成较大规模mapreduce任务完成的时间。

上一篇 下一篇

猜你喜欢

热点阅读