前言
之前做了MIT6.828操作系统课程,过程很痛苦,也学到了很多。不过最大的收货还是发现了非常好的学习方式——刷顶级名校的闻名课程。自然同样是麻省理工久负盛名的分布式系统课程MIT6.824就顺理成章的加入了todolist。值得议一提的是,这两门课程都是同一个实验室出品,实在是良心。
我的项目地址在:github.com/T0mmyliu/distributed-system-course-MIT6.824
课程网址在:https://pdos.csail.mit.edu/6.824/
MapReduce
MapReduce是谷歌的并行计算框架,据说是谷歌的工程师觉得每天处理分布式的代码,开锁解锁实在是又难又烦,而且有很多重复工作。就对并行的过程进行了抽象,就搞了这样一套简单易用的框架。
要想理解其中奥妙,当然是要阅读谷歌的那一篇顶顶有名的论文“MapReduce: Simplified Data Processing on Large Clusters”,这篇论文也在课程的schedule里面,值得一提的是,6.824的schedule里有很多assignment,其中不少是论文,能入选的都是经典中的经典,一定不能跳过,况且很多都和lab有很大的关系。
什么是MapReduce
虽然MapReduce是一个威力强大的工具,但是一般来说威力强大的工具最好也要简单好用,而把复杂封装在背后,才能称之为好工具。具体背后有多复杂,比如如何处理各类异常,我暂时不能领会。这里只介绍下这个工具如何简单好用!
lab1需要我们实现一个toy版本的MapReduce框架出来,虽然代码量比较少,但是难度也还是不小,下面先解释下这个mapreduce的逻辑。
直观解释
MapReduce的逻辑实在是非常的直观。简单的说就分为两步:Map 和 Reduce 。
用一个生活中的例子来举例说明:炒菜
假如你是一个酒店的行政总厨(Master),你不负责做菜,只负责指挥下面的厨师Worker。每天都进行着如下的步骤:
Register
每天都会有人去采购很多食材回来,有牛肉,猪肉,藕,土豆……..买回来这些食物后,需要将他们注册在一个本子上,这就是今天要处理的任务(task)了!
Partition and Map
做菜的第一个过程,当然是切菜,你是主厨(Master),你不负责做菜,只负责通知。”喂,过来把这个藕切成丁“,于是就有一个空闲的厨师过来切藕,你就把藕这个任务分发给了厨师(Worker)。切东西的过程,就是partition。之后可能还需要对食物做一些预先处理,比如抹上盐和料酒,这个过程就是mapfunc。
厨师切好藕后,根据一个规则”噢,藕是要炒肉的,放到第一个盆子里面去“,规则对于每一个厨师都是一样的,这样保证了,同一个input,处理(map)完后肯定都在一起。比如藕片肯定就都放在第一个盆里。一般来说如果有R个输出对象(盆子),一个简单的分配规则就是hash后MOD R。
Reduce
在介绍这个环节之前有一点要注意:和做菜一样,炒菜之前务必要保证菜已经切好了,这样才能不至于要炒回锅肉,发现只有肉片没有蒜苗。当确认前一个环节(map)确实结束后,开始炒菜(Reduce)。在这个环节里,你还是负责通知空闲的厨师,”喂你去炒一份回锅肉“。就有一个厨师接收到这个任务,开始准备炒肉。
”我需要煮熟的五花肉“说完从第一个盆子里拿了肉,”我还需要辣椒”,说完从第二个盆子里拿了辣椒。。。。“最后来一点蒜”从第R个盆子里拿了蒜。原料准备好了,就开始炒菜,这个过程就是reduce function,炒完了过后,统一输出到一个盘子里。这个环节一共要炒M盘菜(M个任务),那么就有了M盘菜了。
Merge
这个环节最好理解,在所有菜都做好了之后,统一端出去,给客人(