6 经验
我们在2003年1月写了第一个版本的MapReduce函数库,并且在2003年8月作了显著的增强,包括了本地优化,worker机器之间的动态负载均衡等等。自那以后,MapReduce函数库就广泛用于我们日常处理的问题。它现在在Google内部各个领域内广泛应用,包括:
。大尺度的计算机学习问题。
。Google News和Froogle产品的集群问题。
。从公众查询产品(比如Google的Zeitgeist)的报告中抽取数据。
。从web网页作新试验和抽取新的产品(例如,从大量的webpage中的本地查找抽取物理位置信息)。
。大尺度的图型计算。
任务数 平均任务完成时间 使用的机器时间 | 29423 634秒 79,186天 |
读取的输入数据 产生的中间数据 写出的输出数据 | 3,288TB 758TB 193TB |
每个job平均worker机器数 每个job平均死掉work数 每个job平均map任务 每个job平均reduce任务 | 157 1.2 3,351 55 |
map唯一实现 reduce的唯一实现 map/reduce的combiner实现 | 395 296 426 |
表1:MapReduce2004年8月的执行情况
图四显示了我们的源代码管理系统中,随着时间推移,MapReduce程序的显著增加,从2003年早先时候的0个增长到2004年9月份的差不多900个不同的程序。MapReduce之所以这样成功是因为他能够在不到半小时时间内写出一个简单的能够应用于上千台机器的大规模并发程序,并且极大的提高了开发和原形设计的周期效率。并且,他可以让一个完全没有分布式和/或并行系统经验的程序员,能够很容易的开发处理海量数据的程序。
在每一个任务结束的时候,MapReduce函数库记录使用的计算资源的状态。在表1,我们列出了2004年8月份MapReduce运行的任务所占用的相关资源。
6.1 大尺度的索引
到目前为止,最成功的MapReduce的应用就是重写了Google web 搜索服务所使用到的index系统。索引系统处理蠕虫系统抓回来的超大量的数据,这些数据保存在GFS文件里。普通这些文档的大小是超过了20TB的数据。索引程序是通过一系列的,大概5到10次MapReduce操作来建立索引。通过利用MapReduce(替换掉上一个版本的特别设计的分布处理的索引程序版本)有这样一些好处:
l 索引代码很简单,很小,很容易理解。因为对于容错的处理代码,分布以及并行处理代码都通过MapReduce函数库封装了,所以索引代码很简单,很小,很容易理解。例如,当使用MapReduce函数库的时候,计算的代码行数从原来的3800行C++代码一下减少到大概700行代码。
l MapReduce的函数库的性能已经非常好,所以我们可以把概念上不相关的计算步骤分开处理,而不是混在一起以期减少处理次数。这使得我们容易改变索引处理方式。比如,我们对老索引系统的一个小更改可能要好几个月的时间,但是在新系统内,只需要花几天时间就可以了。
l 索引系统的操作更容易了,这是因为机器的失效,速度慢的机器,以及网络风暴都已经由MapReduce自己解决了,而不需要操作人员的交互。此外,我们可以简单的通过对索引系统增加机器的方式提高处理性能。