《云计算》(第二版)[刘鹏]读书笔记
分布式数据处理MapReduce
编程模型:
Map的输入参数是in_key和in_value,输出结果是一组<key,value>对,这是经过Map操作后所产生的中间结果。进行Reduce操作之前,对所有Map产生的中间结果进行归并处理,Reduce的输入参数是(key,[value1,...,valuem])。Reduce对相同的key的value值进行归并处理,最终形成(key, final_value)的结果。
实现机制:
1. MapReduce函数首先把输入文件分成M块,每块大概16M~64MB,接着在集群的机器上执行分派处理程序。
2. 主控程序Master分派工作的Worker(工作机),Master选择空闲的Worker来分配这些Map或Reduce任务。
3. 分配了Map任务的Worker读取并吹相关的输入快,将分析出的<key, value>对传递给用户定义的Map函数。Map函数产生的中间结果<key,value>对暂时缓冲到内存。
4. 缓冲到内存的中间结果将被定时写到本地硬盘,这些数据通过分区函数分成R个区。中间结果在本地硬盘的位置信息将被发送回Master,然后Master负责把这些位置信息传送给Reduce Worker。
5. Master通知执行Reduce的Worker关于中间<key,value>对的位置时,调用远程过程,从Map Worker的本地硬盘上读取缓冲的中间数据。当ReduceWorker读到所有的中间数据,它就是用中间key进行排序,这样可使相同key的值都在一起。如果中间结果集过于庞大,那么就需要是用外排序。
6. ReduceWorker根据每一个唯一中间key来遍历所有排序后的中间数据,并且把key和想的中间结果值几何传递给用户定义的Reduce函数。Reduce函数的结果写到一个最终的输出文件。
7. 当所有的Map任务和Reduce任务都完成的时候,Master激活用户程序,此时MapReduce返回用户程序的调用点。
容错实现:
1. Master失效
Master周期性地设置检查点,一个某个任务失效,系统就从最近的一个检查点恢复并重新执行,如果Master失效了,重新开始。
2. Worker失效
Master周期性给Worker发送ping命令,如果没有应答,任务失效,终止对这个Worker的任务调度,把失效Worker的任务调度到其他Worker上重新执行。
案例分析:
对海量26个字母组成的字符串排序
- 对原始的数据进行分割,得到N个不同的数据分块。
- 对每一个数据分块都启动一个Map进行处理。采用桶排序的方法,每个Map中按照首字母将字符串分配到26个不同的桶中。
- 对于Map之后的中间结果,启动26个Reduce,按照首字母放置到相应的Reduce中进行处理。由于Map过程中已经做到了首字母有序,Reduce输出的结果就是最终的排序结果。
参考资料:
《云计算》(第二版)[刘鹏]