课程主页: https://pdos.csail.mit.edu/6.824/schedule.html
本次课程包括了分布式系统的引入内容和MapReduce
, 前者是引入性质的内容就不过多介绍了, 这里介绍MapReduce
1 MapReduce是什么?
MapReduce
是一种编程模型, 用于处理和大数据。其思想是使程序员能通过简单的Map
函数和Reduce
函数的编写就能完成分布式计算的任务, 而不需要知道任何有关分布式的事情,MapReduce
框架会处理剩下的事情。
2 MapReduce结构
上图所示是论文中对MapReduce
架构描述, MapReduce
中有如下术语:
Worker
: 分布式系统中不同计算机上运行的进程Master
: 也是一个计算机上的进程, 负责协调整个处理过程,包括分配任务、监控进度和处理失败的工作节点Task
: 计算任务, 包括Reduce
和Map
Map
: 一个用用户程序提供的函数, 用于将输入的key:value
转化为一组mid-key:mid-value
Reduce
: 一个用用户程序提供的函数, 用于将输入的mid-key:[]mid-value
转化为输出output
通常, Master
将Map
和Reduce
作为任务分配给Worker
进行计算, 称为Map Task
和Reduce Task
, 以下是其一次MapReduce
任务(称为Job
)执行的过程:
- 文件分片
通常是在任务开始之前由Master
完成的。这是初始化阶段的一部分 Master
分配Map Task
Master
将分片信息分配给Worker
节点, 例如: 最开始将切割的文件名和文件内容
作为key:value
通过RPC
提供给worker
使其利用提供的map func
进行计算, 这也是lab 1
中的工作方式Map Task
执行Map Task
的计算过程除了利用map func
进行计算外, 还需要将输出的多个mid-key:mid-value
分割成片存储于不同的本地文件, 不同的分片将提供给不同的Reduce Task
, 通常使用Hash
函数并对取Reduce Task
的数量模得到分片序号。执行Map Task
的Worker
在执行结束后报告Master
某个Map Task
的执行情况Master
等待所有的Map Task
执行成功Master
根据Worker
对Map Task
的执行情况的报告进行决策, 保证所有的Map Task
执行成功Master
分配Reduce Task
Master
会给Worker
分配某个Reduce Task
,Worker
根据其任务序号读取之前所有Map Task
对应分片的内容,这也是为什么要等待所有的Map Task
执行成功后才执行Reduce Task
,这样才能保证Reduce Task
不遗漏mid-key
, 整合这分片文件后遍历所有的mid-key:[]mid-value
并应用reduce func
, 并存储输出结果。同样, 执行Reduce Task
的Worker
在执行结束后报告Master
某个Reduce Task
的执行情况Master
协调所有的Reduce Task
执行成功Master
根据Worker
对Reduce Task
的执行情况的报告进行决策, 保证所有的Reduce Task
执行成功
最后, 不同的Job
可以链式执行, 前一个Job
的输出可以作为下一个Job
的输入, 以此实现负责而庞大的计算任务
3 容错与恢复
- 心跳信号
Worker
只需要向Master
发送心跳信号表示自身的存活, 如果Master在预定时间内没有收到来自某个Worker
的心跳,它就会将该Worker
标记为失效,并将其上运行的所有Map
和Reduce
任务重新调度到其他节点上。不过这种设计不太会再lab 1
中出现, 因为这样会使Master
记录太多有关Task
和Worker
的信息, 设计相对复杂 - 超时重试
如果一个Worker
节点在执行Map
或Reduce
任务耗时过长,Master
会检测到这种情况。Master
将其认定为失败, 可以将失败的任务重新分配给其他健康的Worker
节点执行。这种重试机制可以处理机器故障、软件错误或其他导致任务失败的问题。 checkpoints
Master
会周期性地写入checkpoints
到磁盘以预备可能的崩溃恢复- 原子重命名
将Map
和Reduce
任务的输出写入到一个命名好的临时文件,并且只在任务成功完成时才对其进行重命名,来实现任务的幂等性。 - 文件系统备份
在MapReduce
框架中,输入数据通常存储在一个分布式文件系统(如GFS
)中,该文件系统会将数据块复制到多个节点上。这种数据副本机制确保了即使某些机器发生故障,数据仍然可用。
4 一个wc执行流程的案例
此处给出一个统计单词出现数量任务执行流程的案例, 助于理解
假设单词
a
的哈希值为0,b
的哈希值为1