目录

一、MapReduce核⼼思想

二、MapReduce的阶段分类


一、MapReduce核⼼思想

        MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。

阅读资料
        Hadoop的 MapReduce 核⼼技术起源于⾕歌在 2004 年发表的关于 MapReduce系统的论⽂介绍。论⽂中有这么⼀句话:Our abstraction is inspired by the map and reduce primitives present in Lisp and many other functional languages。这句话提到了 MapReduce 思想来源,⼤致意思是, MapReduce 的灵感来源于函数式语⾔(⽐如Lisp )中的内置函数 map (映射)和 reduce (规约)。
        简单来说,在函数式语⾔⾥,map 表示对⼀个列表( List )中的每个元素做计算reduce 表示对⼀个列表中的每个元素做迭代计算。它们具体的计算是通过传⼊的函数来实现的,map reduce 提供的是计算的框架。我们想⼀下,reduce既然能做迭代计算,那就表示列表中的元素是相关的(⽐如我想对列表中的所有元素做相加求和,那么列表中⾄少都应该是数值吧)。⽽map 是对列表中每个元素做单独处理的,这表示列表中可以是杂乱⽆章的数据。这样看来,就有点联系了。在MapReduce ⾥, Map 处理的是原始数据,⾃然是杂乱⽆章的,每条数据之间互相没有关系;到了Reduce 阶段,数据是以 key 后⾯跟着若⼲个value 来组织的,这些 value 有相关性,⾄少它们都在⼀个 key 下⾯,于是就符合函数式语⾔⾥map reduce 的基本思想了。

MapReduce⼀个完整的运算分为MapReduce两个部分

Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。

Reduce负责“合”,即对map阶段的结果进行全局汇总

二、MapReduce的阶段分类

 第⼀阶段

        第⼀阶段,也称之为Map 阶段。这个阶段会有若⼲个 MapTask 实例,完全并⾏运⾏,互不相⼲。每个MapTask 会读取分析⼀个 InputSplit( 输⼊分⽚,简称分⽚ ) 对应的原始数据。计算的结果数据会临时保存到所在节点的本地磁盘⾥。
         数据扭转
        该阶段的编程模型中会有⼀个map 函数需要开发⼈员重写, map 函数的输⼊是⼀个<key,value>对 ,map 函数的输出也是⼀个 <key,value> ,key value 的类型需要开发 ⼈员指定。参考下图:

 第⼆阶段

        第⼆阶段,也称为Reduce 阶段。这个阶段会有若⼲个 ReduceTask 实例并发运⾏,互不相⼲。但是他们的数据依赖于上⼀个阶段的所有maptask 并发实例的输出。⼀个ReudceTask会从多个 MapTask 运⾏节点上 fetch ⾃⼰要处理的分区数据。经过处理后,输出到HDFS上。
         数据扭转
        该阶段的编程模型中有⼀个reduce 函数需要开发⼈员重写, reduce 函数的输⼊也是⼀个<key value> 对, reduce 函数的输出也是⼀个 <key value> 对。这⾥要强调的是,reduce 的输⼊其实就是 map 的输出,只不过 map 的输出经过 shuffle 技术后变成了<key,List> ⽽已。参考下图:
注意 : MapReduce 编程模型只能包含⼀个 map 阶段和⼀个 reduce 阶段,如果⽤户的业务逻辑⾮常复杂,那就只能多个MapReduce 程序,串⾏运⾏。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐