摘要:本文中主要讲述大数据领域中最著名的批处理和离线处理计算框架——MapReduce,包括MapReduce的原理、流程、使用场景,以及Hadoop集群中负责统一的资源管理和调度的组件——Yarn。
作者:来自ArimaMisaki创作
说明:MapReduce基于Google发布的MapReduce论文设计开发,基于分而治之的思想,用于大规模数据集的并行计算和离线计算,具有如下特点:
说明:在Hadoop1.0版本中,只有HDFS和MapReduce,而资源调度通过MRv1(即MapReduce1.x版本)来进行,因此存在很多缺陷。
缺点:
yarn的出现:针对以上的缺点以及满足编程范式多样化的需求,Hadoop2.x版本中正式引入了Yarn框架,以便更好地完成集群的资源调度和分配。
说明:Apache Hadoop YARN(Yet Another Resource Negotiator),中文名为另一种资源协调者。它是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源和调度,它的引入为集群在利用率、资源统一管理和数据共享层面带来了巨大好处。
说明:MapReduce计算的过程可以分为两个阶段:Map阶段和Reduce阶段。其中,Map阶段输出的结果就是Reduce阶段的输入。我们可以把MapReduce简单地理解为将一堆杂乱无章的数据按照某种特征归纳起来,然后处理并得到最后的结果。
Map面对的是杂乱无章的互不相关的数据,其解析每个输出,并从中提取出key:value即数据的特征。
Reduce阶段接收Map阶段的数据,且该阶段的数据是以key后面跟着若干个value来阻组织的,这些value具有相关性,在此基础上我们可以作进一步的处理以便得到结果。
说明:通常我们将一个文件中的数据分为若干个切片(Split),有多少个Split就会有多少个Map任务,Map任务和Reduce任务之间存在洗牌(Shuffle),他们将Map分好的key:value整理有序并分区,然后传递给Reduce任务,通过Reduce任务输出最终结果。
说明:我们将一个传递给MapReduce处理的文件数据成为Job。Job提交前,先将待处理的文件进行分片,MR框架默认将一个块作为一个分片,客户端应用可以重定义块和分片的映射关系。
Map阶段先把数据放入一个环形内容缓冲区,缓冲区的数据溢出即可进入后续处理阶段,我们将这个过程称为溢写
;溢写的比例一般是80%左右,当达到溢写比例时,需要将缓冲区的数据全部写入本地磁盘。
溢写后并不是直接将数据写入本地磁盘,这是需要经过Map Phase(Map Shuffle)过程,这实际上是一个冗长的过程,其中细化可以分为分区
、排序
、合并
、归并
。
说明:通过Map阶段输出的数据文件我们称为MOF(MapOutFile)。MOF文件经过排序处理。当Reduce Task接收的数据量不大时,则直接存放内存缓冲区中,随着缓冲区文件的增多,MR后台线程将它们合并成一个更大的有序文件,这个动作时Reduce阶段的Merge操作,过程中会产生许多中间文件,最后一次合并的结果直接输出到用户自定义的reduce函数。
当数据很少时,我们在Map阶段可能不会达到溢写比例。这时候数据会在缓存中归并,然后输出给Reduce。
说明:Map阶段和Reduce阶段之间传递中间数据的过程成为Shuffle。这在前面学习过程中已经提及。这个过程包括ReduceTask从各个MapTask获取MOF我呢间的过程,以及对MOF的培训和合并处理。
过程详解:从输入开始即为Map任务的启动;将Job任务提交给Map,Map会将一整个任务分为许多个键值对,此后将这些键值对数据传入环形缓存区中,溢写的数据进入MapShuffle过程;在这个过程中,我们将键值对进行整理,主要的整理过程为分区、排序和合并。集中合并不是必须的,合并过程我们可以举例:如<”a”,1>,<”a”,1>变为<”a”,2>的过程;通过归并可以将数据分区;进行分区后的数据经由reduce取走,在reduce端再次做一次归并,然后合并为一个文件进行输出。
说明:以下是MR1.0的架构图,在当时,主要工作都是由JobTracker负责,造成任务繁多。
说明:在MR2.0后,Yarn分离了出来,并且使用ResourceManager分担了JobTracker的部分工作,而任务调度主要则交由ApplicationMaster来承担。
过程:
说明:在上面的执行过程中,我们可以看到实际上yarn中的ResourceManager负责整个集群的资源调度和任务调度;为了解决单点故障问题,Yarn高可用性方案采用了引入冗余的ResourceManager节点的方式。Zookeeper时刻通过心跳机制监听ResourceManager的状态,一旦出现故障,则启动第二ResourceManager。
说明:
可数资源类型
,而不是仅仅支持CPU和内存;常见的可数资源类型,除了CPU和Memory以外,还包括GPU资源,软件licenses或本地附加存储器之类的资源,但不包括端口和标签。说明:在Yarn中,负责给应用分配资源的叫做Scheduler(调度器)。根据不同的策略,yarn为我们提供了三种调度器:
说明:容量调度器使得Hadoop应用能够共享的,多用户的,操作简便的运行在集群上,同时最大化集群的吞吐量和利用率。
容量调度器以队列
为单位划分资源,么给队列都有资源使用的下限和上限。每个用户可以设定资源使用上限。管理员可以约束单个队列、用户或作业的资源使用。支持作业优先级,但不支持抢占。
在Hadoop3.x中,OrgQueue扩展了容量调度器,通过REST API
提供了编程的方式来改变队列的配置,这样,管理员可以在队列的adminster-queueACL中自动进行队列的配置管理。
说明:调度器维护一群队列的信息;用户可以向一个或多个队列提交应用。
每个NodeManager心跳的时候,调度器根据一定的规则
选择一个队列,再在这个队列上选择一个应用,尝试在这个应用上进行分配资源。
调度器会优先匹配本地资源的申请请求,其次是同机架的,最后是任意机器的。
说明:华为大数据对Yarn提供了动态内存容器技术。前面我们提到过,所有的任务都是运行在各个Node的容器中,在传统的Hadoop平台中,我们的容器是固定大小的,一旦任务所需的内存超过了容器的内存设置大小,那么任务会执行失败;而在华为的大数据方案中,在运行容器的同时会同时计算容器的内存使用,如果任务的大小超过了容器的内存阈值,则会向NodeManager请求扩容容器;在任务内存大小不超过NodeManager设定的阈值范围内对容器进行扩容时允许的,若超过了阈值则终止任务。
说明:我们可以对不同的应用打上不同的标签。对于常规资源需求的应用,我们通过打标签的方式可以将其固定分配给普通性能的机器,而把高内存需求的应用分配给高内存机器。