大数据的任务除了存储以外,更加重要的时计算。因此当完成了分布式存储的设计之后,不妨再来尝试设计一款分布式并行计算的框架。
对于计算而言,场景是非常众多的,这里以最简单的数字累加为例。在基于前一节的分布式存储框架之上,文件已经进行了拆分存储到不同的磁盘,每个磁盘代表着一台单独的计算机,拥有着单独的cpu和内存进行计算,因此,对于累加的操作而言,单台电脑计算的情况下,纵使计算机能够完成数据的存储,基于相同cpu和内存的限制,计算速度仍然要比每台计算机计算自身磁盘上的文件,再将计算结果进行汇总慢得多。
总的来说,依靠分布式存储的机制,计算时可以依靠每台计算机自身的计算资源并行计算,摆脱计算资源不足的困境。因此,在解决了海量数据分布式存储的情况下,也同样通过分布式并行计算的方式解决了计算的效率问题,这也就是Hadoop基础计算框架MapReduce的雏形。
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
MapReduce的核心思想是“分而治之”。所谓“分而治之”就是把一个复杂的问题,按照一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的结果,把各部分的结果组成整个问题的结果,这种思想来源于日常生活与工作时的经验,同样也完全适合技术领域。
为了更好地理解“分而治之”思想,先来看一个生活中的例子。例如,某大型公司在全国设立了分公司,假设现在要统计公司一年的营收情况制作年报,有两种统计方式。第一种方式是全国分公司将自己的账单数据发送至总部,由总部统一计算公司当年的营收报表;第二种方式是采用分而治之的思想,也就是说,先要求分公司各自统计营收情况﹐再将统计结果发给总部进行统一汇总计算。这两种方式相比,显然第二种方式的策略更好,工作效率更高。
MapReduce作为一种分布式计算模型,它主要用于解决海量数据的计算问题。使用MapReduce分析海量数据时,每个MapReduce程序被初始化为一个工作任务,每个工作任务可以分为Map 和 Reduce两个阶段,具体介绍如下。
Map阶段:负责将任务分解,即把复杂的任务分解成若干个“简单的任务”来并行处理,但前提是这些任务没有必然的依赖关系,可以单独执行任务。
Reduce阶段:负责将任务合并,即把Map 阶段的结果进行全局汇总。
使用MapReduce执行计算任务的时候,每个任务的执行过程都会被分为两个阶段,分别是 Map和 Reduce,其中Map阶段用于对原始数据进行处理,Reduce阶段用于对Map阶段的结果进行汇总﹐得到最终结果。
MapReduce 编程模型借鉴了函数式程序设计语言的设计思想,其程序实现过程是通过map()和reduce()函数来完成的。从数据格式上来看,map()函数接收的数据格式是键值对,产生的输出结果也是键值对形式, reduce()函数会将map()函数输出的键值对作为输入,把相同key值的value进行汇总,输出新的键值对。
MapReduce简易数据流模型说明如下:
(1)将原始数据处理成键值对<K1,V1>形式。
(2)将解析后的键值对<K1,V1>传给map()函数, map()函数会根据映射规则,将键值对<Kl,Vl>映射为一系列中间结果形式的键值对<K2,V2>。
(3)将中间形式的键值对<K2,V2>形成<K2,{ V2,…}>形式传给reduce()函数处理,把具有相同key 的value合并在一起,产生新的键值对<K3,V3>,此时的键值对<K3,V3>就是最终输出的结果。