MapReduce概述
MapReduce基于Google发布的MapReduce论文设计开发,基于分而治之的思想,用于大规模数据集(大于1TB)的并行计算和离线计算,具有如下特点:
- 高度抽象的编程思想:程序员仅需描述做什么,具体怎么做交由系统的执行框架处理。
- 良好的扩展性:可通过添加节点以扩展集群能力。
- 高容错性:通过计算迁移或数据迁移等策略提高集群的可用性与容错性。
资源调度与分配
- 在Hadoop1.0版本中,只有HDFS和MapReduce,而资源调度通过MRv1来进行,存在着很多缺陷:
- Master是单点,故障恢复依赖于周期性的Checkpoint,不保证可靠性,发生故障的时候会通知用户,由用户自行决定是否重新计算。
- 没有区分作业调度与资源调度。MapReduce在运行时,环境会有大量的Job并发,因此多样且高效的调度策略是非常重要的。
- 没有提到资源隔离与安全性,大量Job并发的时候,如何保证单个Job不占用过多的资源,如何保证用户的程序对系统而言是安全的,在Hadoop1.0中是个大问题。
- 因此,针对Hadoop1.0中MRv1的不足,以及为了满足编程范式多样化的需求,Hadoop2.0中正式引入了Yarn框架,以便更好地完成集群的资源调度与分配。
Yarn概述
- Apache Hadoop YARN(Yet Another Resource Negotiator),中文名为“另一种资源协调者”。它是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
MapReduce过程
- MapReduce计算过程可具体分为两个阶段,Map阶段和Reduce阶段。其中,Map阶段输出的结果是Reduce阶段的输入。
- 可以把MapReduce理解为,把一堆杂乱无章的数据按照某种特征归纳起来,然后处理并得到最后的结果。
- Map面对的是杂乱无章的互不相关的数据,它解析每个数据,从中提取出key和value,也就是提取了数据的特征。
- 到了Reduce阶段,数据是以key后面跟着若干个value来组织的,这些value有相关性。在此基础上我们可以做进一步的处理以便得到结果。
MapReduce工作流程
Map阶段详解
- Job提交前,先将待处理的文件进行分片(Split)。MR框架默认将一个块(Block)作为一个分片。客户端应用可以重定义块与分片的映射关系。
- Map阶段先把数据放入一个环形内存缓冲区,当缓冲区数据达到80%左右时发生溢写(Spill),需将缓冲区中的数据写入到本地磁盘。
Reduce阶段详解
- 前面提到的MOF文件是经过排序处理的。当ReduceTask接收的数据量不大时,则直接存放在内存缓冲区中,随着缓冲区文件的增多,MR后台线程将它们合并成一个更大的有序文件,这个动作是Reduce阶段的Merge操作,过程中会产生许多中间文件,最后一次合并的结果直接输出到用户自定义的Reduce函数。
- 当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给Reduce。
Shuffle过程详解
- Shuffle的定义:Map阶段和Reduce阶段之间传递中间数据的过程,包括Reduce Task从各个MapTask获取MOF文件的过程,以及对MOF的排序与合并处理。
典型程序WordCount举例
WordCount程序功能
WordCount的Map过程
WordCount的Reduce过程
Yarn的组件架构
MapReduce On Yarn任务调度流程
Yarn HA方案
- Yarn中的ResourceManager负责整个集群的资源管理和任务调度,Yarn高可用性方案通过引入冗余的ResourceManager节点的方式,解决了ResourceManager单点故障问题。
Yarn AppMaster容错机制
资源管理
- 每个NodeManager可分配的内存和CPU的数量可以通过配置选项设置(可在Yarn服务配置页面配置)。
- yarn.nodemanager.resource.memory-mb:可以分配给容器的物理内存的大小
- yarn.nodemanager.vmem-pmem-ratio:虚拟内存跟物理内存的比值
- yarn.nodemanager.resource.cpu-vcore:可分配给容器的cPu核数
- 在Hadoop3.x版本中,YARN资源模型已被推广为支持用户自定义的可数资源类型(support user-defined countable resource types),而不是仅仅支持CPU和内存。
- 常见的可数资源类型,除了CPU和Memory以外,还包括GPU资源、软件licenses或本地附加存储器(locally-attached storage)之类的资源,但不包括端口(Ports)和标签(Labels)。
YARN的三种资源调度器
- 在Yarn中,负责给应用分配资源的叫做Scheduler(调度器)。在YARN中,根据不同的策略,共有三种调度器可供选择:
- FIFOScheduler:把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
- CapacityScheduler:允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,通过设置多个队列的方式给多个组织提供服务。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了。在一个队列内部,资源的调度是采用的是FIFO策略。
- FairScheduler:为所有的应用分配公平的资源(对公平的定义可以通过参数来设置)。
容量调度器的介绍
- 容量调度器使得Hadoop应用能够共享的、多用户的、操作简便的运行在集群上,同时最大化集群的吞吐量和利用率。
- 容量调度器以队列为单位划分资源,每个队列都有资源使用的下限和上限。每个用户可以设定资源使用上限。管理员可以约束单个队列、用户或作业的资源使用。支持作业优先级,但不支持资源抢占。
- 在Hadoop3.x中,OrgQueue扩展了容量调度器,通过RESTAPI提供了以编程的方式来改变队列的配置。这样,管理员可以在队列的administer_queueACL中自动进行队列配置管理。
资源分配模型
- 调度器维护一群队列的信息。用户可以向一个或者多个队列提交应用。
- 每次NM心跳的时候,调度器根据一定的规则选择一个队列,再在队列上选择一个应用,尝试在这个应用上分配资源。
- 调度器会优先匹配本地资源的申请请求,其次是同机架的,最后是任意机器的。