大数据快速入门(05):MapReduce 编程模型赏析

2020-10-23 15:06:26 浏览数 (1)

一、Hadoop 诞生的传奇故事

(上图是 Doug Cutting,hadoop 之父)

1985年,Cutting 毕业于美国斯坦福大学。

Cutting 的第一份工作是在 Xerox 做实习生,为激光扫描仪上的操作系统开发屏幕保护程序,这也是他最早的“平台”级的作品。

Cutting 却不满足于此,于是他开始踏入搜索领域,让搜索技术可以为更多人所用。于是1997年底,他用 java 开发出了 Lucene,一个非常伟大的项目。

2004年,Cutting 和同为程序员出身的 Mike Cafarella 决定开发一款可以代替当时的主流搜索产品的开源搜索引擎,这个项目被命名为 Nutch

刚好 2004 年 Google 发布了大数据分析、MapReduce 算法的论文,于是 Doug Cutting 利用 Google 公开的技术,扩充他已经开发出来的 Lucene 搜索技术,进而打造出了 Hadoop

二、MapReduce 编程模型

其实在 Hadoop 诞生之前,其实就已经有了分布式计算,只是那个时候的分布式计算都是专用的系统,只能专门处理某一类计算问题,比如大规模数据的排序,有很多的局限性。

而 Hadoop 的出现,使大数据计算通用编程成为可能,我们只需要遵循 MapReduce 编程模型编写业务处理代码,就可以运行在 hadoop 集群上,无需关系分布式计算内部是如何处理的。

但其实 MapReduce 编程模型并不是 Hadoop 原创,甚至也不是 Google 原创,但是 Google 和 Hadoop 创造性地将 MapReduce 编程模型用到大数据计算上,立刻产生了神奇的效果。

看似复杂的各种各样的机器学习、数据挖掘、SQL 处理等大数据计算变得简单清晰起来。

MapReduce 是一种非常简单的模型。

简单在于其编程模型只包含 Map 和 Reduce 两个过程,map 的主要输入是一对 <Key, Value> 值,经过 map 计算后输出一对 <Key, Value> 值;

然后将相同 Key 合并,形成 <Key, Value 集合 >;

再将这个 <Key, Value 集合 > 输入 reduce,经过计算输出零个或多个 <Key, Value> 对。

MapReduce 又是一份非常强大的模型

不管是关系代数运算(SQL 计算),还是矩阵运算(图计算),大数据领域几乎所有的计算需求都可以通过 MapReduce 编程来实现。

三、Hadoop 的 MapReduce 设计目标是什么

hadoop 的 MapReduce 大部分借鉴了 Google 的 MapReduce 的设计思想,包括简化编程接口,提高系统容错性等等。总结一下 MapReduce 的设计目标,主要有四个:

  • 易于编程

传统的分布式程序设计非常复杂,用户需要关注的细节非常多,比如数据分片、数据传输、节点间通信等,因而设计分布式程序的门槛非常高。

MapReduce的一个重要设计目标便是简化分布式程序设计。它将与并行程序逻辑无关的设计细节抽象成公共模块并交由系统实现,而用户只需专注于自己的应用程序逻辑实现,这样简化了分布式程序设计且提高了开发效率。

  • 良好的扩展性

随着业务的发展,积累的数据量(如搜索公司的网页量)会越来越大,当数据量增加到一定程度后,现有集群可能已经无法满足其计算和存储需求,这时候管理员可能期望通过添加机器以达到线性扩展集群能力的目的。

  • 高容错性

在分布式环境下,随着集群规模的增加,集群中的故障次数(这里的“故障”包括磁盘损坏、机器宕机、节点间通信失败等硬件故障和用户程序bug产生的软件故障)会显著增加,进而导致任务失败和数据丢失的可能性增加,为避免这些问题,MapReduce通过计算迁移或者数据迁移等策略提高集群的可用性与容错性。

  • 高吞吐率

一个分布式系统通常需要在高吞吐率和低延迟之间做权衡,而MapReduce计算引擎则选择了高吞吐率。MapReduce通过分布式并行技术,能够利用多机资源,一次读取和写入海量数据。

四、核心设计思想是什么

MapReduce模型是对大量分布式处理问题的总结和抽象,它的核心思想是分而治之,即将一个分布式计算过程拆解成两个阶段:

第一阶段:Map阶段,由多个可并行执行的Map Task构成,主要功能是,将待处理数据集按照数据量大小切分成等大的数据分片,每个分片交由一个任务处理。

第二阶段:Reduce阶段,由多个可并行执行的Reduce Task构成,主要功能是,对前一阶段中各任务产生的结果进行规约,得到最终结果。

以一个 wordcount 词频统计来说明

map 函数的计算过程是,将这行文本中的单词提取出来,针对每个单词输出一个 <word, 1> 这样的 <Key, Value> 对。

reduce 函数的计算过程是,将这个集合里的 1 求和,再将单词(word)和这个和(sum)组成一个 <Key, Value>,也就是 <word, sum> 输出。每一个输出就是一个单词和它的词频统计总和。

五、总结

今天介绍了 MapReduce 编程模型,它是一个非常简单而又强大的模型。

简单之处在于它只有两个方法

强大之处在于它几乎可以处理大数据领域所有的计算需求。

0 人点赞