MapReduce

来源:互联网 发布:java初始化容量 编辑:程序博客网 时间:2024/06/02 05:06

前言

如果只谈 MapReduce,其实它只是一个编程模型,最早对应于由范畴论中态射和函子演化到的函数式编程中的概念,简单来讲就是一种函子(在编程中以函数形式出现)。想知道它的由来,可以看前面关于函数式编程的相关文章,这里只讲简单的模型,尤其是在 Hadoop 中计算框架中的实现。
先理清几个概念:
1. Hadoop,其实现在的 Hadoop 已经是一个大数据各种框架的统称了,主要包含 MapReduce 和 HDFS;
2. MapReduce,一个分布式计算框架
3. HDFS, 一个分布式文件系统的 Hadoop 版本实现;

模型说明

MapReduce 模型是一个分布式计算框架,我们先把它简化单机的一个计算框架,那么它的主要框架流程就是。

INPUT -> MAP -> Combine&Shuffle -> REDUCE -> OUTPUT

一个例子

假如我们有以下一个文件数据:

A, 1, X
B, 2, XX
C, 3, XXX
A, 4, XXXX
B, 2, XX
C, 7, XXXXXXX

第一列代表某个对象(A,B,C),第二列记录了次数,第三列是描述说明;每一行数据代表一个对象在当时记录时被记录的次数,现在想知道,A,B,C 分别一共被记录了几次。那用 MapReduce 的计算框架解决,流程分解如下:

  1. 每一行数据将被依次输入进 Map 阶段;
    a. 计算框架以文件中每一行为数据单位,传递给 MAP;
    b. MAP 拿到一个字符串 “A,1,X”,以 “,” 为分隔取出 A 和 1;
    c. 以字符串 “A” 为键,”1” 转为整形当作值,形成键值对返回给计算框架;
    d. 依次处理所有行;
  2. 进入到 Combine&Shuffle 阶段:
    a. 键相同的键值对可以合并,比如以 A 为键的就可以合并为 A-> [1,4],即以 A 为键,数组[1,4]为值的新的键值对;
    b. 依次将所有键相同的项合并;
  3. 进入到 REDUCE 阶段:
    a. 计算框架会把上次合并后的新的键值对依次发送给 REDUCE;
    b. REDUCE 可以把每个键值对的值,即数组取出来,把里面的元素相加;
    c. 以该健作为键,以刚才相加的结果作为 VALUE 形成新的键值对返回给计算框架;
  4. 输出
    a. 把结果输出到新的文件中。

我们看到,简单来讲,MapReduce 就是一个计算框架,其中把 map 和 reduce 过程开放给我们可以自己实现,而它帮我们实现了输入分割,合并&洗牌,并串联起整个流程。其实这就是 MapReduce 起始的设计思想。

思考

当然,Hadoop 中的 MapReduce 远不止此,设想当输入源数据比较大的时候,单机处理就会存在瓶颈,当多计算节点并行处理里,数据源分割且数据传递是否会消耗过大,多计算节点做数据输出,在本地文件系统上是否方便合并,这都是 Hadoop 需要解决的问题。针对这些问题,有相应的解决方案:

  • 针对源数据存储,有了 HDFS,可以简化数据源输入,以及数据统一存取;
  • 对于并行处理,它本身就是支持多结点计算,即多 MAP 和多个 REDUCE 同时工作;
  • 对于数据转移消耗过大,它选取了移动程序(体量较小),不移动数据的策略,即尽量把你写的 MapReduce 扩展传递到不同结点进行运算,而不是把数据拉取到计算结点。

这些解决方案合起来,就是一个完整的 Hadoop 的 MapReduce 的实现了,其实要想处理好这些细节,还是很复杂的。那进阶到多节点,现在的处理流程就变成了下面这样:
并行运行时MapReduce 流程

这其中体现出了多个 Map Worker 以及 Reduce Worker 时的情形,输入分割,Map 处理后的合并及排序,分区,最后到 Reduce,再到输出,简单明了地展示了整个 MapReduce 流程。

其它

整个计算框架已经为我们处理好了所有通用部分,而放开了 Map 和 Reduce 的算法,我们可以把多个 Mapper 串联起来,像 Linux 下面管道一样工作,用来处理更加复杂的业务流程,并且在 Reduce 后面也是可以添加 0 个或者多个 Mapper 作后续处理。那么通过自已编排 Map 和 Reduce 来处理复杂的计算任务,但这样开发代价还是很高,所以就有了后来的 HIVE,可以提供友好的 HQL 的用户接口,它后面自动生成相关的 MapReduce 任务,让我们可以更加方便地进行计算任务。

原创粉丝点击