本节书摘来异步社区《MapReduce设计模式》一书中的第1章,第1.1节,作者: 【美】Donald Miner , Adam Shook 译者: 徐钊 , 赵重庆 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。
第1章 设计模式与MapReduce
MapReduce设计模式
MapReduce是处理数据分布在数百台机器上的计算框架,近些年来,随着其在Google、Hadoop及其他一些系统中的应用而越来越流行起来。这个计算框架超乎寻常地强大,但它并不是一种针对“大数据”问题的通用解决方案,因此,虽然可以很好地适用于一些问题,但对有些问题来说,解决起来还是非常具有挑战性的。本书将介绍哪些问题适合使用MapReduce计算框架来解决,以及如何高效地使用MapReduce计算框架。
很多初步了解MapReduce的开发者可能没有意识到,MapReduce不仅仅是一个工具,更是一个框架。我们必须拿问题解决方案去适配框架的map和reduce过程,在很多情况下,这个适配过程将非常具有挑战性。MapReduce更多的是一种约束,而不是一个单独的功能。
这使得问题的解决变得既简单又复杂。简单的一面在于,框架给出了关于可以做什么、不可以做什么的清晰界限,因此相对于过去所用的其他编程模型需要考虑的可选项要少很多。复杂的一面在于,在框架的约束下,找到解决问题的方案将会非常有难度。
初学MapReduce更像是在学习递归过程:寻找问题的递归解决方案会比较有挑战性,但一旦找到了问题的解决方案,问题将变得清晰、精准和优雅。在很多情况下,需要关注MapReduce作业所需要的系统资源,尤其是集群内部网络资源的使用情况。这是MapReduce框架在设计上的取舍,是在需要考虑并发、容错、扩展性以及其他挑战与只关注数据的分布式处理之间的平衡。但是,独特的系统加上独特的问题使解决方案产生了独特的设计模式。
什么是MapReduce设计模式?它是使用MapReduce模型来解决数据处理问题的通用模板。模式不是只针对如文本处理或者图像分析等特定领域的,它更像是解决问题的一种通用方法。使用设计模式是通过使用在实践中被尝试和验证过的一些原则来帮助我们构建更好的软件。
设计优秀的软件要面临一系列的挑战,设计并实现一个优秀的MapReduce程序同样也需要面临相似的挑战。就像缺乏优秀的设计会导致一个优秀的开发者写出差的软件一样,优秀的开发者也有可能实现出不够好的MapReduce算法。在MapReduce程序中,我们不仅要关注代码的简洁和可维护性,同时还要考虑到任务会在数百台机器的共享集群上处理TB级甚至PB级的数据,任务性能也需要格外地重视。同时,该作业与共享集群的机器上数以百计的任务存在竞争关系。一个好的设计可以带来几个数量级的性能提升,因此选择正确的设计来实现MapReduce算法就显得尤为重要。在深入讲解后面章节中的MapReduce设计模式之前,我们先来解释一下为什么将设计模式和MapReduce框架结合起来使用可以帮助我们解决问题,以及是如何得到这些启示的。