实现目标及核心关注点
MapReduce接口可能有多种不同的实现方式,需根据具体的计算环境来选择
以Google的常用计算环境为例
1.机器配置 Linux dual-process x86 2-4GB Memory
2.网络硬件 100/1000 MB/s, 平均整体二分带宽少很多
3.集群 由数百、数千台机器组成,机器故障很常见
4.存储由连接到每个机器的廉价IDE磁盘提供,它们内部开发的分布式文件系统用于管理这些磁盘上的数据。文件系统使用副本在不可靠的硬件之上提供可用性和可靠性
5.用户提交Job到调度系统,每个Job由一组Tasks组成,并由调度器将每个Task映射到机器中一组可用计算机上执行
MapReduce实现流程
Map调用被分布在多台机器,输入数据被自动划分为M个分割,输入分割之间没有交互,可以在不同机器上并行处理。使用分区函数(e.g. hash(key) mod R),将中间键空间划分为R个片段分发给Reduce并行调用,分区函数和分区数由用户指定。用户调用MapReduce函数的系列操作如下
1.Split Input FIles 将输入文件按指定大小S(16~64MB,用户通过可选参数指定)划分为M个分割文件,然后在集群中启动多个副本程序
2.Assign Tasks Master挑选空闲Worker节点并为其分配一个map task或reduce task
3.Parses K/V 被分配map task的worker读取相关分割的内容,从输入内容中解析键/值对并生成中间键/值对缓存于内存中
4.Written to Local Disk 缓存的中间键/值对,通过分区函数划分为R个区域,定期写到本地磁盘并将其相对位置返回给Master,Master再将这些位置信息传给Worker
5.RPC Read and Sort 当Master将位置信息通知到Reduce Worker, Reduce Worker使用远程过程调用从Map Worker的磁盘读入缓存数据。当Reduce Worker读入所有的中间数据按key排序,如果中间数据过大不适合在内存运算,可考虑使用外部排序
6.Iterates and Appended Reduce Worker对已排序的中间数据进行迭代,对于每一个唯一的中间键,它将与之对应的中间值集传递给用户的Reduce函数。将Reduce函数的输出Append到这个reduce分区的最终输出文件
7.Completed 完成所有map和reduce任务后master唤醒用户程序
— edit by 云时代的运维开发(clouddevops)
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/190939.html