开门见山,在接触大数据hadoop等的这几天里,各种大数据的专有名词出现在我的世界里,对各中架构、模型也开始了解。
在读《Google MapReduce》之前,对MapReduce的了解是认为它是处理海量数据的一种模型。在处理海量数据时,在Map阶段将大量的数据分发到各个服务器上,由服务器进行处理后,在Reduce阶段将处理结果汇总,最后展现出来。阅读了这篇文章后,对其模型的内部结构,行为处理更加了解,感叹功能的强大。
MapReduce对于数据的处理是通过将其处理成key/value pair,用户自定义的Map函数接收一个key/value pair,然后产生一个中间key/value pair值的集合,然后MapReduce库把所有具有相同中间key值的中间value值集合在一起后传递给reduce函数,此时用户自定义的Reduce函数接收一个中间key的值和相关的一个value值的集合,然后合并这些value值形成较小的value值的集合。
文中例举了大量的例子来理解这个原理过程,其中在以Google自身的实际情况的实现模型中,详细分析了整个集群模型的执行概况,和各分部的实现原理,例如Master数据结构、模型容错,失效方面的处理机制等等。在出现各种问题后都有相应的解决办法,展现出了MapReduce模型的强大之处。
文中对于环境的搭建,模型使用技巧以及一些宝贵的经验详细阐述,在之后我的学习实践之中之路中会更加受用。
2019/07/02
这次反复读了前三节
注意到master进程,我理解为它是这个MapReduce执行过程中的大脑,有且只有一个。
master存储着每一个Map和Reduce任务的状态,以及worker的标识(非空闲)。
master进程首先分配任务,将Map任务或Reduce任务分发给空闲的worker。在处理Map任务的worker处理完成后,将结果存储在本地磁盘,而将存储位置、大小返还给master。master再将这个位置信息分配给Reduce worker。当Map和Reduce都处理完成后,master再把全部的结果返还给用户。
master 还会定期ping每一个worker,如果再约定时间没有回应,就认为此worker故障失效,这个故障worker中正在处理以及已经处理完成的Map任务都将被重新设定为初始的状态,等待重新分配。如果是Reduce的worker故障,但任务已经完成,则不需要重新初始化,因为Reduce的任务输出存储在全局文件系统上。
既然是大脑,核心程序,为防止master失效,需要定期的将已存储的信息写入磁盘。然而现实是,由于只有一个master,所以失效,就要重新启动程序。
关于“Map任务产生R 个中间文件”这句话刚开始一直不理解。
R是由用户根据需求设定的值,Map根据需求将结果处理成R 个,Reduce的R 个任务分别针对Map的R汇总处理。
2019/07/04 再补充:
Shuffle进程在整合数据时,描述着数据从map task输出到reduce task输入的这段过程。
首先,map将输入的数据解析为key/value pair形式,然后由Partitioner决定将map处理结果分配给哪个相应的reduce。然后将Partitioner处理的结果,写入缓冲区等待。缓冲区只设了100M,如果内存达到80M就会发生spill(溢写)到磁盘中。在磁盘中,如果用户设定了combiner函数,就会在此时进行数据的合并。然后所有的数据文件就到放在了磁盘中,因为最终磁盘中只有一个溢写文件,所有此时会进行merge(归并)将数据化为group,这个归并是将本机中map处理不同的溢写文件归并,所有key也可能相同,此时也会调用combiner再次进行合并。
接着,reduce 在执行之前的工作就是不断地拉取当前job里每个map 的最终结果,然后对从不同地方拉取过来的数据不断地做merge,也最终形成一个文件作为reduce的输入文件。
合并(Combine)和归并(Merge)的区别:
两个键值对<“a”,1>和<“a”,1>,如果合并,会得到<“a”,2>,如果归并,会得到<“a”,<1,1>>
Combiner函数 是用户自定义的函数。在每台机器的map执行完毕后,combiner在本机就进行一次整合,这样可以提高MapReduce的执行速度。
对于mapreduce是不是等到所有的map处理完才开始执行reduce,因为中间的shuffle进程会把所有相同的key合并,然后给reduce。但是,文中在“备用任务”小节中又描述出现“落伍者”,拉低执行效率,此时检测到mapreduce操作接近完成时,master调用备用任务执行“落伍者”的任务。那么,所谓的mapreduce接近完成是指全部进程接近完成,只剩落伍worker的map任务么?如果这样的话,那说明部分reduce大致完成,不然怎么能称是“mapreduce”程序接近完成。
那么又说明并不是等到所有map处理完,才开始处理reduce。这样说似乎也不对。
第五节的实例中,观察处理运行图像时发现,在map没有全部完成时,reduce也开始进行了。