【大数据架构综述】计算引擎篇之MapReduce

MapReduce

1. MapReduce简介

MapReduce是一种简化、并行计算编程模型,它最早出现在2004年Google公司Jeffrey DeanSanjay Ghema wat的论文“MapReduce:Simplified Data Processing on Large Clusters”(面向大型集群的简化数据处理)中,是Google公司开源的一项重要技术。

MapReduce用于进行大数据量的计算,它能够让没多少并行计算经验的开发人员也可以开发并行应用程序。它采用“分而治之”的思想,将大规模数据集的操作分发给一个主节点管理下的各个子节点共同完成,然后整合各个子节点的中间结果,最终得计算结果。简而言之,就是“分散任务,汇总结果”。

MapReduce的特点

  1. 易于编程,用它的一些简单接口,即可完成一个分布式程序,且能分布到大量廉价的PC上运行;
  2. 良好扩展性:可通过简单地增加计算机来扩展它的计算能力;
  3. 高容错性:若其中一台主机出故障,可把上面的计算任务转移到另一个节点上运行,保证任务运行成功,且这个过程无需人工干预,由MapReduce内部完成
  4. 能对PB级以上海量数据进行离线处理

MapReduce不擅长的场景:

  1. 实时计算:无法在毫秒或秒级内返回结果;
  2. 流式计算:MapReduce的输入数据集是静态的,不能动态变化
  3. DAG(有向图)计算

2. MapReduce编程模型

MapReduce至少由两部分组成:Map和Reduce,Map理解为“映射”,Reduce理解为“化简”。用户只需编写map()reduce()两个函数(方法),即可完成简单的分布式程序设计。

可以按照如下理解Map和Reduce:

  1. 输入Input一个大文件,通过拆分Split之后,将其分为多个分片;
  2. 每个文件分片由单独的主机处理 —— Map方法;
  3. 将各个主机计算结果进行汇总并得到最终结果 —— Reduce方法。

【大数据架构综述】计算引擎篇之MapReduce_第1张图片

上图体现了MapReduce编程模型如下几点:

  1. 任务Job = Map + Reduce;

  2. Map的输出是Reduce的输入;

  3. 所有的输入和输出都是的形式:

    是Map的输入,是Map的输出;

    是Reduce的输入,是Reduce的输出。

  4. k2 = k3,v3是个集合,v3的元素就是v2,表示为v3 = list(v2)

  5. 所有的输入输出的数据类型必须是Hadoop的数据类型;

  6. MapReduce处理的数据都是HDFS的数据(或HBase)

3. MapReduce两个重要组件

3.1 分区Partition

在进行MapReduce计算时,有时需把最终的输出数据分到不同的文件中。

若要得到多个文件,就意味着有与文件同样数量的Reducer任务在运行。Reducer的数据来自于Map任务,因此Mapper要划分数据,将不同的数据分配给不同的Reducer运行。

Mapper划分数据的过程 —— 分区Partition,负责实现划分的数据的类 —— Partitioner

MapReduce默认的Partitioner是HashPartitioner。默认情况下,Partitioner先计算key的散列值,然后通过Reducer个数执行求余计算。这样方式不仅能随机将整个key空间平均分发给每个Reducer,同时能确保不同Map产生相同的ket能被分发到同一个Reducer。

【大数据架构综述】计算引擎篇之MapReduce_第2张图片

3.2 合并Combiner

Mapper先输出键值对,然后在网络节点间对其进行Shuffle(洗牌)(下方会介绍),再传入Reducer处理,获得最终输出。

若存在这样一个实际场景:有10个数据文件,Mapper会生成10亿个的键值对在网络间进行传输,但我们只对数据求最大值。因此Mapper只需输出它所知道的最大值。这样不仅可以减轻网络压力,还可以大幅度提高程序效率。

可将合并Combiner操作看做是一个在每个单独节点上先做一次Reduce操作,其输入及输出的参数和Reduce是一样的。

【大数据架构综述】计算引擎篇之MapReduce_第3张图片

3.3 洗牌Shuffle

MapReduce确保每个Reducer的输入都是按键排序。系统执行排序、将Mapper输出作为输入传给Reducer的过程,就称为洗牌Shuffle

【大数据架构综述】计算引擎篇之MapReduce_第4张图片

  1. Map端

    (1)写入缓冲区。map函数开始产生输出时,是先写入一个缓冲区。

    (2)溢写。一旦缓冲内容达到阈值,一个后台线程便开始把内容溢写spill入磁盘。

    (3)分区。在写磁盘前,线程先根据数据最终要传给的Reducer,把数据划分成相应的分区Partition。

    (4)合并、排序。每次内存缓冲区达到溢出阈值,就会新建一个溢出文件Spill File,在Map任务写完其最后一个输出记录后,会有几个溢出文件。在任务完成前,溢出文件被合并成一个已分区且已排序的输出文件。

  2. Reduce端

    (1)复制文件。若Map输出相当小,会被复制到Reduce任务JVM的内存。

    (2)小文件合并。随着磁盘上副本的增多,后台线程会将它们合并为一个更大的、排好序的文件。

    (3)Reduce合并。复制完所有Map输出后,Reduce任务进入合并阶段,此阶段将合并Map输出,维持其顺序排序。

    (4)直接把数据输入Reduce()函数,对已排序输出的每个键调用Reduce()函数。阶段的输出直接写入输出文件系统(一般为HDFS)。

4. MapReduce的工作机制

4.1 MapReduce作业运行机制

运行时,有以下5个独立的实体:

  • 客户端,提交MapReduce作业;
  • YARN资源管理器(ResourceManager),负责协调集群上计算机资源的分配;
  • YARN节点管理器(NodeManager),负责启动和监视集群中主机上的计算容量(Container);
  • MapReduce的Application Master(简写为MRAppMaster),负责协调运行MapReduce作业的任务。
  • 分布式文件系统(一般为HDFS),用来与其他实体间共享作业文件。

【大数据架构综述】计算引擎篇之MapReduce_第5张图片

4.2 进度和状态的更新

当Map任务或Reduce任务运行时,子进程和自己的Application Master进行通信。每隔3秒钟,任务通过向自己的Application Master报告进度和状态,Application Master会形成一个作业的汇聚视图Aggregate View

【大数据架构综述】计算引擎篇之MapReduce_第6张图片

参考文献

《Hadoop大数据技术与应用》——杨治明、许桂秋著

你可能感兴趣的:(大数据)