本节书摘来异步社区《MapReduce设计模式》一书中的第1章,第1.1节,作者: 【美】Donald Miner , Adam Shook 译者: 徐钊 , 赵重庆 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.1 设计模式
近些年来,设计模式使开发者的工作变得更轻松。这些设计模式为解决问题提供了可复用的通用方法,开发者在遇到问题时可以花更少的时间来思考解决问题的策略,从而有更多的时间用来迎接新的挑战。与此同时,开发者积累的丰富经验也有了简洁的方式传递给新入门的开发者。
在软件工程的设计模式领域中,有一个重要里程碑,即《Design Patterns:Elements of Reusable Object-Oriented Software》一书(由Gamma等人所著),通常也被称为“四人组”(Gang of Four)的书。这本畅销书中没有一种模式是新发明的,而且很多模式都是使用了多年的。这本书经久不衰的秘诀在于,作者花了大量的时间记录和整理面向对象编程中最重要的设计模式。因为这本书出版于1994年,所以整理和收录的设计模式都来自于开发者之间口口相传、会议和杂志,以及当时还不太流行的互联网。
设计模式经受了时间的验证,并展示了正确的抽象层次:既避免了太具体,使得细节过于繁杂,从而难以裁剪来满足问题的需要,又不至于太泛泛,使得解决问题的一种模式需要包含大量的工作。这个层面的抽象产生的更大益处是,为开发者在日常交流和代码层面的交互提供了公共语言。简单地引用“抽象工厂”要比一遍遍地解释抽象工厂的原理更便于交流。而且,在读过他人实现的抽象工程代码后,也能同时领会到作者的意图。
MapReduce设计模式同样也是为问题和解决方案之间搭建桥梁的。MapReduce设计模式通过提供通用框架来解决数据计算问题,而不局限于特定领域。经验丰富的MapReduce开发者可以借此将积累的知识传授给新入门的开发者。这一点非常重要,因为MapReduce是一个正在快速成长的新技术,每天都会有新的开发者加入进来。MapReduce设计模式可以成为一起工作的团队之间的通用语言。建议其他开发者使用“reduce端连接”(reduce-side join)代替“map端复制连接”(map-side replicated join),要比分别解释两种机制的底层原理更加简洁与方便。
MapReduce设计模式的现状就像1994年以前设计模式在面向对象语言领域的情况一样。MapReduce设计模式的相关资料目前已经广泛分布在博客、类似StackOverflow的网站、技术类书籍以及世界各地的高级技术团队中。本书的目的不是提供全新的问题解决方案,而是将目前已经广泛应用的模式汇总整理起来,以方便大家分享。
即使已经了解了设计模式,在真实的问题解决实践中,还需要仔细考虑设计模式所适用的场景。当尝试使用从本书或其他地方学到的设计模式来解决新的问题之前,请仔细考量该设计模式的“适用场景”。
在通常情况下,本书涉及的MapReduce设计模式是与平台无关的。MapReduce框架最初是在Google的论文中提出的,但其对应的代码并没有开源。目前已经有多个独立的系统(如Hadoop、Disco和Amazon Elastic MapReduce)实现了MapReduce框架,另外一些大型系统的查询语言(如MongoDB、Greenplum DB和Aster Data)也已经内置了对MapReduce的支持。虽然设计模式的初衷是通用性,但是本书中的MapReduce主要面向的是Hadoop平台。由于各个MapReduce实现都使用了相同的概念架构,因此很多设计模式可以应用在其他的MapReduce系统(如MongoDB)中。然而,各个MapReduce系统实现之间的细节差异也是不容忽视的。“四人组”书中的设计模式是使用C++语言编写的,但是开发者会发现这些概念在其他现代编程语言(如Ruby和Python)中也适用。本书中的设计模式也可以应用在Hadoop之外的其他MapReduce系统中。你可以参考本书中的示例代码来完成你的代码开发工作。