Mapreduce模型、核心思想、构思及编程规范

本文最后更新于:2 年前

MapReduce 简介

MapReduce 是分布式并行计算框架,用来进行大规模数据集计算(大于1TB)。分布式程序运行在大规模的计算机集群中,可以并行执行大规模处理任务,从而获取海量的计算能力。

核心思想

MapReduce 的思想核心是 “分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。它将运行在大规模集群中的复杂的并行计算的过程抽象成了两个方法:mapreduce

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

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

  • MapReduce 运行在 yarn 集群

    • ResourceManager
    • NodeManager

    这两个阶段合起来正是 MapReduce 思想的体现。

img

还有一个比较形象的语言解释 MapReduce:

我们要数图书馆中的所有书。你数 1 号书架,我数 2 号书架。这就是 “Map” 。我们人越多,数书就更快。

现在我们到一起,把所有人的统计数加在一起。这就是 “Reduce” 。

MapReduce思想应用举例

MapReduce 模型

在 MapReduce 中,一个存储在 HDFS 的大规模数据集都会被分成若干个独立的小数据块,这些数据块可 以被多个 map 任务并行处理。MapReduce 框架会为每一个 Map 任务输出一个数据子集,map 任务生成 的结果会被作为 reduce 任务的输入,最终由 reduce 任务输出最终结果,并写入到 HDFS。

“计算向数据靠拢”。

MapReduce任务过程分为两个处理阶段:Map阶段 和 Reduce阶段。每个阶段都是以 K-V 键值对作为输入和输出。

Map 阶段的代码需要继承 Mapper 类,并重写 map 方法;Reduce阶段的代码需要继承 Reducer 类,并重写 reduce 方法。

Map 阶段的输入是文件的原始数据(可以使文件,也可以是分布式文件系统的文件块),这些数据的格式可以是文档,也可以是二进制,默认是将数据集的每一行作为文件输入,当做 Map 阶段的输入 value而输入的 key 则是输入行数据起始位置相对于整个文件的起始位置的偏移量(字符数)。

Map 阶段的输出结果,经由框架处理后(处理过程包括基于键排序和分组),最后发送给 reduce 阶段,这个过程叫做 Shuffle 。

Reduce 阶段将 Map 阶段输出的一系列具有相同 key 的键值对组合起来,经过计算处理后(reduce方 法),默认将结果以键值对的形式合并成一个结果文件。用户可以自己指定 reduce 任务的数量以及 Map 阶段输出 key 输出到哪个 reducer 的规则。

MapReduce 设计构思

MapReduce 是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在 Hadoop 集群上。

MapReduce 设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统层面的处理细节。为程序员提供一个抽象和高层的编程接口和框架。程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处理应用本身计算问题的程序代码。如何具体完成这个并行计算任务所相关的诸多系统层细节被隐藏起来,交给计算框架去处理:

Map 和 Reduce 为程序员提供了一个清晰的操作接口抽象描述。MapReduce 中定义了如下的 Map 和 Reduce 两个抽象的编程接口,由用户去编程实现 Map 和 Reduce, MapReduce 处理的数据类型是 <key,value> 键值对。

  • Map: (k1; v1) → [(k2; v2)]
  • Reduce: (k2; [v2]) → [(k3; v3)]

一个完整的mapreduce程序在分布式运行时有三类实例进程:

  1. MRAppMaster

    负责整个程序的过程调度及状态协调;

  2. MapTask

    负责map阶段的整个数据处理流程;

  3. ReduceTask

    负责 reduce 阶段的整个数据处理流程.

MapReduce 编程规范

MapReduce 的开发一共有八个步骤:Map 阶段分为 2 个步骤,Shuffle 阶段 4 个步骤,Reduce 阶段分为 2 个步骤。

Map 阶段 2 个步骤

  1. 设置 InputFormat 类, 将数据切分为 Key-Value (K1 和 V1) 对, 输入到第二步;
  2. 自定义 Map 逻辑, 将第一步的结果转换成另外的 Key-Value(K2 和 V2) 对, 输出结果。

Shuffle 阶段 4 个步骤

  1. 对输出的 Key-Value 对进行分区
  2. 对不同分区的数据按照相同的 Key 排序
  3. (可选) 对分组过的数据初步规约, 降低数据的网络拷贝;
  4. 对数据进行分组, 相同 Key 的 Value 放入一个集合中。

Reduce 阶段 2 个步骤

  1. 对多个 Map 任务的结果进行排序以及合并, 编写 Reduce 函数实现自己的逻辑, 对输入的 Key-Value 进行处理, 转为新的 Key-Value(K3和V3)输出;
  2. 设置 OutputFormat 处理并保存 Reduce 输出的 Key-Value 数据。

MapReduce编程流程