本文是论文《MapReduce: Simplified Data Processing on Large Clusters》的翻译。
原作者:Jeffrey Dean and Sanjay Ghemawat @ Google, Inc.
为了刷MIT 6.824 2021,分布式系统课程,可以去B站看下,也有Lab可以刷
概述
MapReduce是一个针对处理大数据集的编程模型以及关联实现。用户定义一个map函数,该函数用来处理一个键/值对,生成一系列的中间键/值对;reduce函数合并所有与相同中间键关联的中间值。就像本论文说的,许多真实世界的任务都可以适配这个模型。
使用这种函数式方式编写的程序可以自然而然的在大型商用机集群上并行化执行。运行时系统来关心输入数据的分区细节;在一系列机器上调度程序执行;处理机器故障(failures);管理必要的机器间通信。这使得程序员可以轻松的利用大型分布式系统的资源而无需任何并行化以及分布式系统的经验。
我们的MapReduce实现运行在一个大的商用机集群上,并且高度可扩展:一个典型的MapReduce计算会在数千台机器上处理几TB的数据。程序员们会发现系统非常易用:我们已经实现了数百的MapReduce程序(译者:指利用MapReduce框架编写的程序),并且在谷歌的集群中,每天都有一千多个MapReduce任务在执行。
1. 介绍
在过去五年里,作者以及Google的其他很多人已经实现了数百个特定用途的,用于处理大量原始数据的计算程序,这些数据可能是爬取的文档、web请求日志等。我们要计算出很多类型的派生数据,比如反向索引、多种表现形式的图形化结构的web页面、每一个host下爬取了多少页面的汇总数据、给定一天下最频繁的查询等等......在概念上,大多数这样的计算都是简单明了的,然而,输入数据通常很大很大,为了在合理时间内完成任务,这种计算必须分布在数百或数千台机器上,如何并行化计算,如何分布数据以及如何处理失败这些问题使得原本简单的计算被用来处理这些问题的大量复杂的代码所掩盖。
为了对付这种复杂性,我们设计了一个新的抽象,允许我们可以表示我们想要执行的简单计算,但是将并行化、容错以及数据分布、负载均衡的复杂问题隐藏到一个库中。我们的抽象灵感来源于Lisp语言以及很多其它函数式语言提供的map以及reduce原语。我们发现,我们的大部分计算都涉及到在输入中的一个逻辑“记录”上应用一个map操作,以计算出一系列中间键/值对,然后对所有共享相同键的值应用一个reduce操作,以组合出使用的派生数据。由于用户自定义的map和reduce操作是函数式的,所以我们可以轻易地并行化大型计算,并且将重新执行作为容错的主要机制。
这个工作的主要贡献就是一个简单并且强大的接口,它能够自动的并行化、分布大规模计算,结合该接口的实现以达到在大型商用PC集群上的高性能。
第二节介绍了基础编程模型,给出了一些示例;第三节介绍了针对我们的基于集群的计算环境的MapReduce接口实现;第四节介绍了我们认为有用的几种编程模型的改进;第五节中包含在多种任务下我们的实现的性能;第六节探索了Goolge对MapReduce的应用,包含我们将它作为重写我们生产索引系统的基础的经验;第七节讨论了相关以及未来的工作。