资源调度框架 - Yarn
1. yarn介绍
Apache Hadoop Yarn是Hadoop 2.0为了分离资源管理和计算组件而引入的,yarn的诞生源于存储在HDFS的数据需要更多的交互模式,能提供更多的处理框架,而不单单是MR模式。
在市面上,有很多基于yarn的云产品应用。当企业的数据在HDFS中是可用的,有多重数据处理方式是很重要的,有了hadoop 2.0和yarn,机构可以采用流处理,互动数据处理方式以及其他的基于Hadoop的应用程序。
2. yarn架构
yarn的架构还是经典的主从(master/slave)结构,和hadoop的架构一样,大体上看,yarn服务由一个ResourceManager(RM)和多个NodeManager(NM)构成,ResourceManager为主节点,NodeManager为从节点。
核心组件
组件名 | 作用 |
---|---|
ResourceManager | 是Master上一个独立运行的进程,负责集群统一的资源管理,调度,分配等 |
ApplicationMaster | 相当于某个Application应用的监护人和管理者,和NodeManager协同工作来运行应用的各个任务,同时负责向Yarn的ResourceManager申请资源,返还资源等。 |
NodeManager | 是Slave从节点上一个独立运行的进程,负责上报节点的状态,资源(磁盘,内存,cpu)等使用情况。 |
Container | 是yarn中分配资源的一个单位,包含内存,cpu等重要资源,yarn以Container为单位分配资源。 |
Client向ResourceManager提交的每一个应用程序都必须有一个ApplicationMaster,它经过ResourceManager分配资源后,运行于某一个Slave节点的Container中。
2.1 ResourceManager
RM是一个全局的资源管理器,集群只有一个,负责整个系统的资源调度管理和分配,包括处理客户端请求,启动/监控ApplicationMaster,监控NodeManager,资源的分配与调度。它主要由两个组件构成:Schedule调度器和ApplicationManager应用程序管理器。
(1)调度器根据容量,队列等限制条件,将系统中的资源分配给各个正在运行的应用程序。调度器根据应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”Container来表示,Container是一个动态资源分配单位,它将内存,磁盘,网络等资源封装在一起,从而限定每个任务使用的资源量。
(2)应用程序管理器ApplicationManager主要负责管理整个系统中所有应用程序,接受job的提交请求,为应用分配一个Container来运行ApplicationMaster并管理。
2.2 ApplicationMaster
ApplicationMaster管理YARN内运行的应用程序的每个实例, 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器的执行和资源使用 (CPU、内存,IO等的资源分配)。
功能:
- 数据切分
- 为应用程序申请资源并进一步分配给内部任务。
- 任务监控与容错
Yarn的动态性,就是指多个Application的ApplicationMaster动态地和ResourceManager进行沟通,不断地申请资源,释放,再申请,再释放资源的过程。
2.3NodeManager
整个集群有多个NodeManager,负责每个节点上的资源和使用。NodeManager负责接受ResourceManager的资源分配请求,分配具体的Contaioner给应用,同时还负责监控并报告Contaioner使用信息给ResourceManager。
具体功能:
-
接受并处理来自ResourceManager的命令请求,分配Container给应用的某个任务;
-
定时向RM汇报,以情报整个集群平稳运行,RM通过收集每个NodeManager报告信息来追踪整个集群的健康状态,而NodeManager负责监控自身的健康状态。
-
处理来自ApplicationMaster的请求
-
管理所在节点的Container生命周期和节点日志信息
-
执行yarn上应用的一些额外的服务,比如mapReduce shuffle过程。
当一个节点启动时,它会向RM注册并告知RM自己由多少资源可用,在运行期间,这些信息会不断被更新。
NodeManager只负责管理自身的Container,它并不知道运行在它上面的应用信息,负责管理应用信息的是ApplicationMaster。
2.4 Container
Container是yarn中的一个资源抽象概念,它封装了某个节点上的多维度资源,如内存,CPU,磁盘,网络等。当ApplicationMaster向RM申请资源时,RM返回的资源便是用Container表示,每个任务分配一个Container,并且每个任务只能使用该Container描述的资源。
Container和集群节点关系是:一个节点会运行多个Container,每个Container不会跨节点,任何一个job或应用必须运行在一个或多个Container上。在yarn中,RM只告诉AM哪些Container可以用,实际ApplicationMaster还要跟NodeManager请求分配具体的Container。
需要注意的是Container是一个动态资源划分单位,是根据应用程序的需求动态生成的,
功能:
- 对task环境的抽象
- 描述一系列信息(因为是抽象概念)
- 任务运行资源的集合
- 任务运行环境。
2.5 ResourceManager和Container
yarn的设计目标就是允许用户的各种应用以共享,安全,多租户的形式使用整个集群,并且为了保证集群资源调度和数据访问的高效性,yarn还必须能够感知整个集群拓扑结构。
一个应用先向ApplicationMaster发送一个满足自己需求的资源请求,然后ApplicationMaster把这个资源请求发送给RM的Scheduler,Scheduler再对这个请求返回分配到的资源描述Container信息。
2.6 JobHistoryServer
作业历史服务,记录在yarn中调度的作业历史运行情况。
启动命令:
mr-jobhistory-daemon.sh start historyserver
启动后就可以在jps命令中看到多了一个进程,或者在yarn UI界面点击history跳转查看map reduce执行的详细信息。
2.7 Timeline Server
用来写日志服务数据,一般来写与第三方结合的日志服务数据,是对jobhistoryserver功能的有效补充。
链接:http://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/TimelineServer.html
3. yarn应用运行原理(重要)
yarn主要由以下四个实体:
1.一个全局的资源管理器ResourceManager
2.每个应用程序一个ApplicationMaster
3.每个从节点一个NodeManager
4.每个应用程序运行在NodeManager上的Container
3.1 yarn应用提交过程。(重要)
application在yarn中的执行过程,整个执行过程可以分为三步:
(1)应用程序提交
(2)启动应用的ApplicationMaster实例
(3)ApplicationMaster实例管理应用程序的执行。
具体提交过程如下:
- 客户端应用程序向ResourceManager提交应用并请求资源来运行一个ApplicationMaster实例
- RM中的ApplicationManager接受应用的请求,为应用分配一个Container给NodeManager,然后在NodeManager中启动ApplicationMaster实例。
- ApplicationMaster启动后向RM注册,注册后客户端就可以查询到自己申请应用对应的ApplicationMaster的详细信息,以后可以和管理应用的ApplicationMaster直接交互。这时应用会向ApplicationMaster发送一个满足自己需求的资源请求。
- 在后面的操作过程中,ApplicationMaster会根据resource-request协议向RM发送resource-request请求,RM中的Sechedular接受到请求后返回分配到的资源描述Container信息。
- ApplicationMaster获取到Container信息后,分配给各个NodeManager,并通过向NodeMagager发送contaioner-launch-specification信息来启动Container。
- 后续应用程序的代码以task形式(比如map task和reduce task)在启动的Container运行,并向ApplicationMaster报告运行进度,状态等信息。,另外客户端也可以通过ApplicationMaster得知应用的运行情况。
- 最后应用程序运行完成后,ApplicationMaster向ResourceManager取消注册然后关闭,用到的所有Continer归还给系统。
概括:(1)用户提交应用程序给ResourceManager
(2)向ResourceManager申请资源,在某个NodeManager上启动Container,启动ApplicationMaster。
(3)ApplicationMaster向ResourceManager注册进行通信,动态申请资源,然后告知NodeManager启动对应的task。
(4)所有任务运行完成后,ApplicationMaster注销,释放资源。
3.2 Mapreduce on yarn
MarReduce基于yarn的工作原理:通过提交jar包,进行MapReduce处理,可以分为五个概括的过程:
(1)客户端提交提交MapReduce.job
(2)随后yarn的ResourceManager进行资源分配
(3)由NodeManager加载与监控container
(4)通过ApplicationMaster与ResourceManager进行资源的申请和状态交互,由NodeManager管理MapReduce运行时的job
(5)通过hdfs进行job配置文件,jar包的各节点分发。
详细过程如下:
-
作业提交:client调用job.waitForCompletion方法,向整个集群提交MapReduce作业 (第1步) ,ResourceManager这时会给应用分配一个application ID,且判断client的输出是否存在,并判断输入,计算split分片信息,将信息反馈给client。client将作业的资源(包括Jar包, 配置文件, split信息)拷贝给HDFS(第3步)。接着, 通过调用资源管理器的submitApplication()来提交作业(第4步).
-
作业初始化:当资源管理器收到submitApplication()的请求时, 就将该请求发给调度器(scheduler), 调度器分配container, 然后资源管理器在该container内启动ApplicationMaster进程,由NodeManager监控。
MapReduce的ApplicationMaster可以监控作业的进度和完成报告(第6步)。然后其通过分布式文件系统得到由客户端计算好的输入split(第7步)。然后为每个输入split创建一个map任务, 根据mapreduce.job.reduces创建reduce任务对象
-
任务分配:ApplicationMaster向ResourceManager请求Container来运行所有的map和reduce任务(第八步),这些请求是通过心跳机制来传输的,包括每个map任务的数据位置,由于ResourceManager的本地化特点,它会优先将任务分配给存储对应数据的节点。
-
任务运行:当ResourceManager分配Container给ApplicationMaster后,ApplicationMaster会通知各个NodeManager启动Container(9a和9b)来运行任务,任务运行之前会通过HDFS获取需要的jar文件,配置文件,split分片等信息。(第十步)
-
作业完成:最后任务运行期间会将其进度和状态更新给ApplicationMaster,进而告知用户任务运行情况。待任务结束后,ApplicationMaster关闭,释放资源,作业的信息也会被存入作业历史服务器以便用户核查。
3.3 yarn的生命周期:
申请资源 -> 启动appMaster -> 申请运行任务的container -> 分发task -> 运行task -> task结束 -> 回收container
4. 如何使用yarn
4.1 配置文件
$HADOOP_HOME/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
$HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
4.2 yarn启动和停止:
启动RM和NM:
#主节点运行
start-yarn.sh
#停止yarn
stop-yarn.sh
#若RM没有启动,可以单独设置启动和关闭:
yarn-daemon.sh start resourcemanager
yarn-daemon.sh stop resourcemanager
#如果NM没有启动,可以单独启动和关闭
yarn-daemon.sh start nodemanager
yarn-daemon.sh stop nodemanager
4.3 yarn常用命令
yarn application
#查看正在运行的任务
yarn application -list
#杀掉正在运行的任务
yarn application -kill 任务id
#查看节点列表
yarn node -list
#查看节点状况:根据上一步节点列表查看
yarn node -status node3:40652(Node-Id)
#查看yarn依赖的jar环境变量
yarn classpath
5. yarn调度器(重要)
5.1 调度器分类
yarn中有三种调度器选择:FIFO Scheduler(先进先出调度器),Capacity Scheduler(容量调度器),Fair Scheduler(均分调度器)
5.2 三种调度器区别
- hadoop1.x使用的默认调度器就是FIFO。FIFO采用队列方式将一个一个job任务按照时间先后顺序进行服务,比较好理解,哪个任务先进来就先完成它,在继续下一个任务。
- hadoop2.x使用的默认调度器是Capacity Scheduler。Capacity Schedule调度器以队列为单位划分资源,队列有独立的资源,队列的结构和资源是可以进行配置的。
- Fair Scheduler调度器会为所有job任务动态调整系统资源,且是平均分配的形式,让任务公平的共享集群资源
5.3 Capacity Scheduler配置方式
调度器的核心就是队列的分配和使用,修改conf/capacity-scheduler.xml可以配置队列。
将HADOOP_HOME/etc/hadoop/中对应的capacity-scheduler.xml配置文件备份到其他地方,然后新建capacity-scheduler.xml文件,添加以下内容:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>prod,dev</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.queues</name>
<value>hdp,spark</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.prod.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
<value>75</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.hdp.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.spark.capacity</name>
<value>50</value>
</property>
</configuration>
将应用放在哪个队列中,取决于应用本身
然后程序打包,提交集群运行:
hadoop jar jar包名称 完整类型 hdfs输入文件 输出文件位置
6. yarn应用状态
在官方文档中也可以看到.
- NEW:新建状态
- NEW_SAVING:新建保存状态
- SUBMITTED:提交状态
- ACCEPTED:接受状态
- RUNNING:运行状态
- FINISHED:完成状态
- FAILED:失败状态
- KILLED:杀掉状态
运行mr程序显示的map100%,reduce0%进度,就是由第六步的记账本提供的。
容器和task对应,只不过可能是map task或者是reduce task。
后续reduce task的过程也是和记账本的appMaster通信,然后启动和map同样的流程
另外。修改队列属性,添加新队,编辑xml文件后要运行生效:
yarn rmadmin-refreshQueues
修改记录
时间 | 内容 |
---|---|
2020年04月10日 | 第一次发布 |
2020年9月13日 | 删除目录显示 |
- 学习参考:《开课吧-大数据开发高级工程师一期》课程
本文为学习课程做的笔记,如有侵权,请联系作者删除。