MapReduce( 二 )


MapReduce

文章插图
MapReduce执行流程右图是论文里给出的流程图 。一切都是从最上方的user program开始的,user program连结了MapReduce库,实现了最基本的Map函式和Reduce函式 。图中执行的顺序都用数字标记了 。1.MapReduce库先把user program的输入档案划分为M份(M为用户定义),每一份通常有16MB到64MB,如图左方所示分成了split0~4;然后使用fork将用户进程拷贝到集群内其它机器上 。2.user program的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的 。3.被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函式,map函式产生的中间键值对被快取在记忆体中 。4.快取的中间键值对会被定期写入本地磁碟,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker 。5.master通知分配了Reduce作业的worker它负责的分区在什幺位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区),当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起 。因为不同的键可能会映射到同一个分区也就是同一个Reduce作业(谁让分区少呢),所以排序是必须的 。6.reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函式,reduce函式产生的输出会添加到这个分区的输出档案中 。7.当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函式调用返回user program的代码 。所有执行完毕后,MapReduce输出放在了R个分区的输出档案中(分别对应一个Reduce作业) 。用户通常并不需要合併这R个档案,而是将其作为输入交给另一个MapReduce程式处理 。整个过程中,输入数据是来自底层分散式档案系统(GFS)的,中间数据是放在本地档案系统的,最终输出数据是写入底层分散式档案系统(GFS)的 。而且我们要注意Map/Reduce作业和map/reduce函式的区别:Map作业处理一个输入数据的分片,可能需要调用多次map函式来处理每个输入键值对;Reduce作业处理一个分区的中间键值对,期间要对每个不同的键调用一次reduce函式,Reduce作业最终也对应一个输出档案 。经典实例MapReduce的一个经典实例是Hadoop 。用于处理大型分散式资料库 。由于Hadoop关联到云以及云部署,大多数人忽略了一点,Hadoop有些属性不适合一般企业的需求,特别是移动应用程式 。下面是其中的一些特点:Hadoop的最大价值在于资料库,而Hadoop所用的资料库是移动应用程式所用资料库的10到1000倍 。对于许多人来说,使用Hadoop就是杀鸡用牛刀 。
Hadoop有显着的设定和处理开销 。Hadoop工作可能会需要几分钟的时间,即使相关数据量不是很大 。
Hadoop在支持具有多维上下文数据结构方面不是很擅长 。例如,一个定义给定地理变数值的记录,然后使用垂直连线,来连续定义一个比hadoop使用的键值对定义更複杂的数据结构关係 。
Hadoop必须使用叠代方法处理的问题方面用处不大——尤其是几个连续有依赖性步骤的问题 。
MapReduce (EMR),这是一项Hadoop服务 。Hadoop旨在同期档案系统工作,以HDFS着称 。当用户用EMR创建了一个Hadoop集群,他们可以从AWS S3或者一些其他的数据存储複製数据到集群上的HDFS,或者也可以直接从S3访问数据 。HDFS使用本地存储,而且通常提供了比从S3恢复更好的性能,但是在运行Hadoop工作之前,也需要时间从S3複製数据到HDFS 。如果EMR集群要运行一段时间,且针对多项工作使用相同的数据,可能值得额外的启动时间来从S3複製数据到HDFS 。参考Dean, Jeffrey & Ghemawat, Sanjay (2004). "MapReduce: Simplified Data Processing on Large Clusters". Retrieved Apr. 6, 2005"Our abstraction is inspired by the map and reduce primitives present in Lisp and many other functional languages." -"MapReduce: Simplified Data Processing on Large Clusters"