Hadoop - YARN

YARN - 资源管理

Hadoop -MapReduce
Hadoop -HDFS


导读

一. Hadoop 1.x 介绍
二. Hadoop 2.x 介绍 - 重点
三. yarn的产生
四. YARN各个组件的作用
五. YARN的工作原理
六. YARN的容错性及调度器
七. 关于yarn常用参数设置

一. Hadoop 1.x 介绍

Hadoop - YARN_第1张图片
Hadoop 1.x

文件系统核心模块:
NameNode:集群当中的主节点,主要用于管理集群当中的各种数据
secondaryNameNode:主要能用于hadoop当中元数据信息的辅助管理
DataNode:集群当中的从节点,主要用于存储集群当中的各种数据

数据计算核心模块:
JobTracker:接收用户的计算请求任务,并分配任务给从节点
TaskTracker:负责执行主节点JobTracker分配的任务


由于 Hadoop1.x中暴露出来的问题,重点是jobTracker的问题,例如单点故障,任务过重,其中除了JonTracker同时还有一个TaskTracker,因此产生的了Hadoop 2.x版本,将框架重构,将各个节点任务更加明确,并根据zookeeper实现了高可用,防止了单点故障的发生.

Hadoop - YARN_第2张图片
1.x的任务调度
hadoop1.x中的jobTracker和TaskTracker进行的任务调度

jobTracker其承担的任务有接受任务、计算资源、分配资源、与datanode进行通信。在hadoop中每个应用程序被表示成一个作业,每个作业又被分成多个任务,jobTracker的作业控制模块负责作业的分解和状态监控。其中状态监控主要包括TaskTracker状态监控、作业状态监控和任务状态监控,主要为容错和任务调度提供决策依据。
TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker。TaskTracker与JobTracker和Task之间采用了RPC协议进行通信。TaskTracker的功能:

1.汇报心跳:Tracker周期性将所有节点上各种信息通过心跳机制汇报给JobTracker。这些信息包括两部分:
机器级别信息:节点健康情况、资源使用情况等。
任务级别信息:任务执行进度、任务运行状态等。
2.执行命令:JobTracker会给TaskTracker下达各种命令,主要包括:启动任务(LaunchTaskAction)、提交任务(CommitTaskAction)、杀死任务(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(TaskTrackerReinitAction)。

可以看出JobTracker的任务繁重,因此暴露出了很多问题,也因此产生的Hadoop 2.x 版本


二. Hadoop 2.x 介绍 - 重点

Hadoop - YARN_第3张图片
2.x 高可用

hdfs主要模块:
NameNode:集群当中的主节点,主要用于管理集群当中的各种数据,一般都是使用两个,实现HA高可用

JournalNode:元数据信息管理进程,一般都是奇数个
DataNode:从节点,用于数据的存储

yarn主要模块:
ResourceManager:Yarn平台的主节点,主要用于接收各种任务,通过两个,构建成高可用
NodeManager:Yarn平台的从节点,主要用于处理ResourceManager分配的任务


三. yarn的产生

hadoop1.x与hadoop2.x架构的区别是hadoop2.x将资源管理功能从MapReduce框架中独立出来,也就是现在的YARN模块。
在没有 YARN 之前,是 一个集群一个计算框架。比如:MapReduce 一个集群、Spark 一个集群等。造成各个集群管理复杂,资源的利用率很低;比如:在某个时间段内 Hadoop 集群忙而Spark 集群闲着,反之亦然,各个集群之间不能共享资源造成集群间资源并不能充分利用。
并且, hadoop 1.x 的MapReduce中,JobTracker负担的任务太多,接收任务,资源调度,监控等都是由JobTracker承担,这样实现简单并且也容易管理,但是也暴露除了很多问题,为了解决这个问题将JobTracker进行拆分,因此产生了yarn

当一个框架一个集群时,需要多个管理人员管理这些集群,进而增加运维成本;而共享集群通常需要少数管理人员即可完成多个框架的统一管理; 随着数据量的暴增,跨集群间的数据移动不仅需要花费更长的时间,且硬件成本也会大大增加;而共享集群模式可让多种框架共享数据和硬件资源,将大大减少数据移动带来的成本(移动计算比移动数据好,真棒)。这时就需要想yarn这样的资源管理系统了,由yarn管理集群资源,并按需求分配资源,谁需要给谁,不需要的时候收回资源,这样整个集群中的资源利用率就高于多个小集群的资源利用率


四. YARN各个组件的作用

ResuourceManager:yarn集群的主节点,负责集群资源的统一管理和调度
1.处理来自客户端的请求(启动/杀死应用程序);
2.启动/监控 ApplicationMaster;一旦某个 ApplicationMaster挂了之后,ResuourceManager将会在另外一个节点上启动该 ApplicationMaster;
3.监控 NodeManager,接收 NodeManager的心跳汇报信息并分配任务到 NodeManager去执行;一旦某个 NodeManager,标志下该 NodeManager上的任务,来告诉对应的 ApplicationMaster如何处理;
4.负责整个集群的资源分配和调度;
RM包含了两个主要的组件:定时调用器(Scheduler)以及应用管理器(ApplicationManager),后面会具体在介绍

定时调度器(Scheduler):从本质上来说,定时调度器就是一种策略,或者说一种算法。当Client提交一个任务的时候,它会根据所需要的资源以及当前集群的资源状况进行分配。注意,它只负责向应用程序分配资源,并不做监控以及应用程序的状态跟踪。
应用管理器(ApplicationManager):同样,听名字就能大概知道它是干嘛的。应用管理器就是负责管理Client用户提交的应用。应用管理器(ApplicationManager)对程序进行监控

NodeManager:集群中存在多个,负责单节点资源管理和使用,并向ResourceManager心跳

1.周期性向 ResuourceManager汇报本节点上的资源使用情况和各个 Container 的运行状;
2.接收并处理来自 ResuourceManager的 Container 启动/停止的各种命令;
3.处理来自 ApplicationMaster的命令;
4.负责单个节点上的资源管理和任务调度;

ApplicationMaster:当有新的任务提交到ResourceManager的时候,ResourceManager会在某个从节点nodeManager上面启动一个ApplicationMaster进程,负责这个任务执行的资源的分配,任务的生命周期的监控等

1.计算应用的资源需求,资源可以是静态或动态计算的,静态的一般是Client申请 时就指定了,动态则需要ApplicationMaster根据应用的运行状态来决定
2.根据数据来申请对应位置的资源(Data Locality)
3.向ResourceManager申请资源,与NodeManager交互进行程序的运行和监控,监控申请的资源的使用情况,监控作业进度
4.跟踪任务状态和进度,定时向ResourceManager发送心跳消息,报告资源的使用情况和应用的进度信息
5.负责本作业内的任务的容错


Hadoop - YARN_第4张图片
Container

Container:yarn对资源做的一层抽象

1.由NodeManager启动和管理,并被它所监控
2.被ResourceManager进行调度
3.任务是运行在Container中,一个Container中既可以运行ApplicationMaster也可以运行具体的 Map/Reduce/Flink task/Spark Task等;


五. YARN的工作原理

Hadoop - YARN_第5张图片
yarn的简单执行流程

1.用户向 YARN 中提交应用程序/作业,其中包括 ApplicaitonMaster 程序、启动ApplicationMaster 的命令、用户程序等;
2.ResourceManager 为作业分配第一个 Container,并与对应的 NodeManager 通信,要求它在这个 Containter 中启动该作业的 ApplicationMaster;
3 .ApplicationMaster 首 先 向 ResourceManager 注 册 , 这 样 用 户 可 以 直 接 通 过ResourceManager 查询作业的运行状态;然后它将为各个任务申请资源并监控任务的运行状态,直到运行结束。
4.ApplicationMaster 采用轮询的方式通过 RPC 请求向 ResourceManager 申请和领取资源;
5.一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务;
6.NodeManager 启动任务;
7.各个任务通过 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以让ApplicaitonMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;在作业运行过程中,用户可随时通过 RPC 向 ApplicationMaster 查询作业当前运行状态;
8.作业完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己;


六. YARN的容错性及调度器

容错性

ResourceMananger基于 zookeeper 实现 HA 避免单点故障;
NodeManager执行失败后,ResourceManager 将失败任务告诉对应的 ApplicationMaster;
由 ApplicationMaster 决定如何处理失败的任务;
ApplicationMaster执行失败后,由 ResourceManager 负责重启;
ApplicationMaster 需处理内部任务的容错问题;
RMAppMaster 会保存已经运行完成的 Task,重启后无需重新运行。

调度器

1. FIFO Scheduler (队列调度器)
Hadoop - YARN_第6张图片
FIFO Scheduler

把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用Capacity Scheduler或Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。

2. capacity scheduler(容量调度器,apache版本默认使用的调度器)
Hadoop - YARN_第7张图片
capacity scheduler

Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。

3. Fair Scheduler(公平调度器,CDH版本的hadoop默认使用的调度器)
Hadoop - YARN_第8张图片
Fair Scheduler

Fair调度器的设计目标是为所有的应用分配公平的资源(对公平的定义可以通过参数来设置)。公平调度在也可以在多个队列间工作。举个例子,假设有两个用户A和B,他们分别拥有一个队列。当A启动一个job而B没有任务时,A会获得全部集群资源;当B启动一个job后,A的job会继续运行,不过一会儿之后两个任务会各自获得一半的集群资源。如果此时B再启动第二个job并且其它job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job会用于四分之一的集群资源,而A的job仍然用于集群一半的资源,结果就是资源最终在两个用户之间平等的共享

使用哪种调度器取决于yarn-site.xml当中的yarn.resourcemanager.scheduler.class 这个属性的配置


七. 关于yarn常用参数设置

第一个参数:container分配最小内存
yarn.scheduler.minimum-allocation-mb 1024 给应用程序container分配的最小内存
第二个参数:container分配最大内存
yarn.scheduler.maximum-allocation-mb 8192 给应用程序container分配的最大内存
第三个参数:每个container的最小虚拟内核个数
yarn.scheduler.minimum-allocation-vcores 1 每个container默认给分配的最小的虚拟内核个数
第四个参数:每个container的最大虚拟内核个数
yarn.scheduler.maximum-allocation-vcores 32 每个container可以分配的最大的虚拟内核的个数
第五个参数:nodeManager可以分配的内存大小
yarn.nodemanager.resource.memory-mb 8192 nodemanager可以分配的最大内存大小,默认8192Mb

yarn-site.xml中设置yarn使用的资源

定义每台机器的内存使用大小
yarn.nodemanager.resource.memory-mb 8192
定义每台机器的虚拟内核使用大小
yarn.nodemanager.resource.cpu-vcores 8
定义交换区空间可以使用的大小(交换区空间就是讲一块硬盘拿出来做内存使用)
这里指定的是nodemanager的n内存的2.1倍
yarn.nodemanager.vmem-pmem-ratio 2.1




Hadoop -MapReduce
Hadoop -HDFS

如有不正确欢迎指出;

你可能感兴趣的:(Hadoop - YARN)