MapReduce基础知识

MapReduce简介

MapReduce 是一个分布式运算程序的编程框架,是用户开发“于 Hadoop 的数据分析应用”的核心框架。使用该框架编写的应用程序能够以一种可靠的、容错的方式并行处理大型集群上的大量数据,也可以对大数据进行加工、挖掘和优化等处理。

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

MapReduce设计思想

MapReduce的设计思想是,从HDFS中获得输入数据,将输入的一个大的数据集分割成多个小数据集,然后并行计算这些小数据集,最后将每个小数据集的结果进行汇总,得到最终的计算结果,并将结果输出到HDFS中。

在MapReduce并行计算中,对大数据集分割后的小数据集的计算,采用的是map()方法,各个map()方法对输入的数据进行并行处理,对不同的输入数据产生不同的输出结果,而对小数据集最终结果的合并,采用的是reduce()方法,各个reduce()方法也各自进行并行计算,各自负责处理不同的数据集合。但是在reduce()方法处理之前,必须等到map()方法处理完毕,因此在数据进入到reduce()方法前需要有一个中间阶段,负责对map()方法的输出结果进行整理,将整理后的结果输入到reduce()方法,这个中间阶段称为Shuffle阶段。

MapReduce体系结构

Client:

1.用户编写的MapReduce程序通过Client提交到JobTracker端。

2.用户可通过Client提供的一些接口查看作业运行状态。

JobTracker:

1.JobTracker负责资源监控和作业调度。

2.JobTracker 监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其他节点。

3.JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而调度器会在资源出现空闲时,选择合适的任务去使用这些资源。

TaskTracker:

1.TaskTracker 会周期性地通过“心跳”(3秒)将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。

2.TaskTracker 使用“slot”等量划分本节点上的资源量(CPU、内存等)。一个Task获取到一个slot 后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot 分为Map slot和Reduce slot两种,分别供MapTask和Reduce Task使用。

Task:

Task 分为Map Task和Reduce Task两种,均由TaskTracker启动。

MapReduce三个阶段

map阶段:

首先通过InputFormat将文件读取进来,并进行切分,将输入的多个分片(Split)由Map任务以完全并行的方式处理。每个Map任务对输入分片的记录按照一定的规则解析成<key,value>对。由于频繁的磁盘I/O会降低效率,因此Map任务的输出<key,value>对会首先存储在Map任务所在节点的内存缓冲区中。

shuffle阶段:

Map任务的输出结果首先被写入缓存,当缓存满时,就启动溢写操作,把缓存中的数据写入磁盘文件,并清空缓存。当启动溢写操作时,首先需要对缓存中的数据进行分区,然后对每个分区的数据进行排序和合并,再写入磁盘文件。每次溢写操作会生成一个新的磁盘文件,随着Map任务的执行,磁盘中就会生成多个溢写文件。在Map任务全部结束之前,这些溢写文件会被归并成一个大的磁盘文件,然后通知相应的Reduce任务来“领取”属于自己处理的数据。

Reduce任务从Map端的不同Map机器“领取”属于自己处理的那部分数据,然后对数据进行归并后交给Reduce处理。

shuffle主要职责:将Map任务的无规则输出形成一定的有规则数据,以便Reduce任务进行处理。

Reduce阶段:

首先对Map阶段的输出结果按照分区进行再一次合并,将同一分区的<key,value>对合并到一起,然后按照key对对分区中的<key,value>对进行排序。 每个分区将排序后的<key,value>对按照key进行分组,key相同的<key,value>对合并为<key,value-list>对,最终每个分区形成多个<key,value-list>对。 排序并分组后的分区数据将会输入到reduce()方法进行处理,reduce()方法一次只能处理一个<key,value-list>对。 最后,reduce()将处理结果仍然以<key,value>对的形式通过。context.write(key,value)进行输出。

MapReduce任务流程

MapReduce程序运行与YARN之上,使用YARN进行集群资源管理和调度。每个MapReduce应用程序会在YARN中产生名为“MRAppMaster”的进程,改进程MapReduce的ApplicationMaster实现,它具有YARN中“ApplicationMaster”角色的所有功能,包括管理整个MapReduce应用程序的生命周期、任务资源申请、Container启动与释放等。

客户端将MapReduce应用程序(jar、可执行文件等)和配置信息提交给YARN集群的ResourceManager,ResourceManager负责将应用程序和配置信息分发给Container、调度和监控任务、向客户端提供状态和诊断信息等。

MapReduce在YARN中的执行流程

1.客户端提交MapReduce应用程序到ResourceManager。

2.ResourceManager分配用于运行MRAppMaster的Container,然后与Container通信,要求它在Container中启动MRAppMaster。MRAppMaster启动后,它将负责应用程序的整个生命周期。

3.MRAppMaster向ResourceManager注册(注册后客户端可以通过ResourceManager查看应用程序的运行状态)并请求运行应用程序各个Task所需的Container(资源请求是对一些Container的请求)。如果符合条件,ResourceManager回分配给MRAppMaster所需的Container。

4.MRAppMaster请求NodeManager使用这些Container来运行应用程序的相应Task(即将Task发布到指定的Container中运行)。

各个运行中的Task会通过RPC协议向MRAppMaster汇报自己的状态和进度,这样一旦某个Task运行失败时,MRAppMaster可以对其重新启动。当应用程序运行完成时,MRAppMaster会向ResourceManager申请注销自己。

MapReduce核心编程思想

1.分布式的运算程序往往需要分成至少 2 个阶段。

2.第一个阶段的 MapTask 并发实例,完全并行运行,互不相干。

3.第二个阶段的 ReduceTask 并发实例互不相干,但是他们的数据依赖于上一个阶段

的所有 MapTask 并发实例的输出。

4.MapReduce 编程模型只能包含一个 Map 阶段和一个 Reduce 阶段,如果用户的业

务逻辑非常复杂,那就只能多个 MapReduce 程序,串行运行。

MapReduce 进程

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

MrAppMaster:负责整个程序的过程调度及状态协调。

MapTask:负责 Map 阶段的整个数据处理流程。

ReduceTask:负责 Reduce 阶段的整个数据处理流程。

MapTask 并行度决定机制

数据块:Block 是 HDFS 物理上把数据分成一块一块。数据块是 HDFS 存储数据单位。

数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是 MapReduce 程序计算输入数据的单位,一个切片会对应启动一个 MapTask。

一个Job的Map阶段并行度由客户端在提交Job时的切片数决定。每一个Split切片分配一个MapTask并行实例处理。切片时不考虑数据集整体,而是逐个针对每一个文件单独切片。

WritableComparable 排序

排序是MapReduce框架中最重要的操作之一。

MapTask和ReduceTask均会对数据按照key进行排序。该操作属于Hadoop的默认行为。任何应用程序中的数据均会被排序,而不管逻辑上是否需要。

默认排序是按照字典顺序排序,且实现该排序的方法是快速排序。

对于MapTask,它会将处理的结果暂时放到环形缓冲区中,当环形缓冲区使用率达到一定阈值后,再对缓冲区中的数据进行一次快速排序,并将这些有序数据溢写到磁盘上,而当数据处理完毕后,它会对磁盘上所有文件进行归并排序。

对于ReduceTask,它从每个MapTask上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则溢写磁盘上,否则存储在内存中。如果磁盘上文件数目达到一定阈值,则进行一次归并排序以生成一个更大文件;如果内存中文件大小或者数目超过一定阈值,则进行一次合并后将数据溢写到磁盘上。当所有数据拷贝完毕后,ReduceTask统一对内存和磁盘上的所有数据进行一次归并排序。

排序分类

部分排序:

MapReduce根据输入记录的键对数据集排序。保证输出的每个文件内部有序。

全排序:

最终输出结果只有一个文件,且文件内部有序。实现方式是只设置一个ReduceTask。但该方法在处理大型文件时效率极低,因为一台机器处理所有文件,完全丧失了MapReduce所提供的并行架构。

辅助排序(GroupingComparator分组):

在Reduce端对key进行分组。应用于:在接收的key为bean对象时,想让一个或几个字段相同(全部字段比较不相同)的key进入到同一个reduce方法时,可以采用分组排序。

二次排序:

在自定义排序过程中,如果compareTo中的判断条件为两个即为二次排序。

MapReduce 优缺点

优点:

1.易于编程

它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的 PC 机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得 MapReduce 编程变得非常流行。

2.良好的扩展性

当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。

3.高容错性

MapReduce 设计的初衷就是使程序能够部署在廉价的 PC 机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop 内部完成的。

4.适合 PB 级以上海量数据的离线处理

可以实现上千台服务器集群并发工作,提供数据处理能力。

缺点:

1.不擅长实时计算

MapReduce 无法像 MySQL 一样,在毫秒或者秒级内返回结果。

2.不擅长流式计算

流式计算的输入数据是动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。

3.不擅长 DAG(有向无环图)计算

多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce 并不是不能做,而是使用后,每个 MapReduce 作业的输出结果都会写入到磁盘,会造成大量的磁盘 IO,导致性能非常的低下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值