草庐IT

06yarn简介

touch-fish 2023-03-28 原文

YARN简介

一、YARN是什么

YARN不是facebook的那个yarn,它从Hadoop 2引入,最初目的是改善MapReduce的实现,但是因为具备足够通用性,同样也可以支持其他的分布式计算模式。YARN全称是Yet Another Resource Negotiator,翻译过来是另一种资源协调者,名字听起来有点奇怪,但是不难看出它的用途是管理和调度Hadoop中的资源,具体来说是计算资源。

YARN和DHFS一样也是主从架构,它有两种服务,分为resourcemanager和nodemanager。resourcemanager负责管理nodemanager和application master进程,nodemanager负责管理容器,以及监控容器使用资源。

YARN有几个重要的概念:

  • resourcemanager:资源管理器,管理和协调集群资源
  • nodemanager:节点管理器,启动容器运行应用,监控容器的资源使用资源,周期向资源管理器报告自己的状态
  • container:容器,nodemanager管理的资源的最小单元
  • application master:应用的第一个进程,可以直接运行或者继续向资源管理器申请资源

一个YARN应用的启动流程如下,图中每一个虚线框代表一个物理机器:

首先客户端提交作业到resourcemanager资源管理器(图中第1步)。resourcemanager资源管理器寻找集群中可用资源,向nodemanager节点管理器发出创建容器请求(图中2a步骤)。随后容器启动并运行应用程序,也就是application master进程(图中2b步骤),application master会运行周期的向资源管理器报告自己的状态。应用程序可能做什么取决于应用本身,应用可能只是简单执行任务,或者向集群继续申请资源运行多个子任务。例如MapReduce应用,它会把大任务拆分成小任务,然后向resourcemanager资源管理器申请资源(图中第3步),并且运行小任务(图中4a和4b步骤)。YARN本身并不会为应用的进程提供通信手段,应用之间的通信手段是专属于应用本身。


二、一个MapReduce应用运行的简单分析

下面通过在集群运行一个简单MapReduce应用来理解YARN应用的启动流程

1、集群拓扑图

笔者的集群拓扑图如下:

Linux-1运行一个资源管理器和节点管理器,Linux-2只运行一个节点管理器,提交任务的是一台Windows主机。Windows机器的ip是192.168.0.109

2、应用启动

先用jps查看集群各个机器当前运行的进程:

-- Linux-1 192.168.0.200
debian@Linux-1:~$ jps
848 ResourceManager
4112 Jps
752 DataNode
1088 NodeManager
663 NameNode

-- Linux-2 192.168.0.201
debian@Linux-2:~$ jps
15893 Jps
10219 NodeManager

然后向集群提交应用,可能会看到如下输出:

这里提交的应用还是maxSaleMapReduce,唯一不同的是配置文件mapreduce.job.running.map.limit(map同时最大运行数量)设置成3。可以在https://github.com/xunpengliu/hello-hadoop获取代码,如果之前已经下载过需要拉取最新代码后重新打包

23/02/07 17:26:27 INFO client.RMProxy: Connecting to ResourceManager at /192.168.0.200:8032
23/02/07 17:26:37 INFO input.FileInputFormat: Total input files to process : 5
23/02/07 17:26:37 INFO mapreduce.JobSubmitter: number of splits:15
23/02/07 17:26:38 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1675757920071_0004
23/02/07 17:26:38 INFO conf.Configuration: resource-types.xml not found
23/02/07 17:26:38 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
23/02/07 17:26:38 INFO resource.ResourceUtils: Adding resource type - name = memory-mb, units = Mi, type = COUNTABLE
23/02/07 17:26:38 INFO resource.ResourceUtils: Adding resource type - name = vcores, units = , type = COUNTABLE
23/02/07 17:26:38 INFO impl.YarnClientImpl: Submitted application application_1675757920071_0004
23/02/07 17:26:38 INFO mapreduce.Job: The url to track the job: http://192.168.0.200:8088/proxy/application_1675757920071_0004/
23/02/07 17:26:38 INFO mapreduce.Job: Running job: job_1675757920071_0004
23/02/07 17:26:43 INFO mapreduce.Job: Job job_1675757920071_0004 running in uber mode : false
23/02/07 17:26:43 INFO mapreduce.Job:  map 0% reduce 0%
23/02/07 17:26:59 INFO mapreduce.Job:  map 3% reduce 0%
23/02/07 17:27:00 INFO mapreduce.Job:  map 11% reduce 0%

可以看到当前应用id是application_1675757920071_0004,作业id是job_1675757920071_0004,从 http://192.168.0.200:8088/proxy/application_1675757920071_0004/ 可以查询到应用运行状态。

等一小会,再使用jps查看运行的进程,可以看到多了1个MRAppMaster和3个YarnChild和进程。查看MRAppMaster进程端口绑定情况和NodeManager的进程树:

-- Linux-1 192.168.0.200
debian@Linux-1:~$ jps
848 ResourceManager
752 DataNode
1088 NodeManager
3649 MRAppMaster
663 NameNode
3754 YarnChild
3789 Jps
debian@Linux-1:~$ pstree -T -p 1088
java(1088)─┬─bash(3628)───bash(3648)───java(3649)
           └─bash(3795)───bash(3750)───java(3754)
debian@Linux-1:~$ lsof -i | grep 3649
java    3649 debian  262u  IPv6  88478      0t0  TCP *:43763 (LISTEN)
java    3649 debian  273u  IPv6  88485      0t0  TCP *:42565 (LISTEN)
java    3649 debian  279u  IPv6  88487      0t0  TCP *:41731 (LISTEN)
java    3649 debian  289u  IPv6  96002      0t0  TCP 192.168.0.200:50682->192.168.0.200:8030 (ESTABLISHED)
java    3649 debian  291u  IPv6  91613      0t0  TCP 192.168.0.200:43763->192.168.0.109:55029 (ESTABLISHED)
java    3649 debian  292u  IPv6  96258      0t0  TCP 192.168.0.200:41731->192.168.0.200:46720 (ESTABLISHED)
java    3649 debian  293u  IPv6  91977      0t0  TCP 192.168.0.200:41731->192.168.0.201:56746 (ESTABLISHED)
java    3649 debian  261u  IPv6  96005      0t0  TCP 192.168.0.200:41731->192.168.0.201:56744 (ESTABLISHED)

-- Linux-2 192.168.0.201
debian@Linux-2:~$ jps
10219 NodeManager
15356 Jps
15326 YarnChild
15295 YarnChild
debian@Linux-2:~$ pstree -T -p 10219
java(10219)─┬─bash(15291)───bash(15293)───java(15295)
            └─bash(15320)───bash(15323)───java(15326)

MRAppMaster也就是MapReduce应用的application master进程,它启动后向资源管理器继续申请资源,然后启动3个YARNChild进程来执行子任务,3个子任务分别运行在Linux-1和Linux-2机器上。

maxSaleMapReduce的map任务和reduce任务在启动和完成会各输出一行日志,日志内容有ip、进程启动时间、主类名称、进程pid。日志文件位置在userlogs/${appid}目录中,如果你的集群像笔者一样没开日志聚合也没修改目录,userlogs目录在Hadoop安装位置的logs目录下。日志是按容器进行分组的,例如Linux-2上的application_1675757920071_0004目录就有下面几个文件夹:

debian@Linux-2:~/program/hadoop-2.10.2/logs/userlogs/application_1675757920071_0004$ ll
总用量 44
drwx--x--- 2 debian debian 4096  2月  7 17:26 container_1675757920071_0004_01_000002
drwx--x--- 2 debian debian 4096  2月  7 17:26 container_1675757920071_0004_01_000003
drwx--x--- 2 debian debian 4096  2月  7 17:27 container_1675757920071_0004_01_000007
drwx--x--- 2 debian debian 4096  2月  7 17:27 container_1675757920071_0004_01_000008
drwx--x--- 2 debian debian 4096  2月  7 17:27 container_1675757920071_0004_01_000009
drwx--x--- 2 debian debian 4096  2月  7 17:27 container_1675757920071_0004_01_000011
drwx--x--- 2 debian debian 4096  2月  7 17:27 container_1675757920071_0004_01_000012
drwx--x--- 2 debian debian 4096  2月  7 17:28 container_1675757920071_0004_01_000014
drwx--x--- 2 debian debian 4096  2月  7 17:28 container_1675757920071_0004_01_000015
drwx--x--- 2 debian debian 4096  2月  7 17:28 container_1675757920071_0004_01_000017
drwx--x--- 2 debian debian 4096  2月  7 17:28 container_1675757920071_0004_01_000018
debian@Linux-2:~/program/hadoop-2.10.2/logs/userlogs/application_1675757920071_0004$ ll container_1675757920071_0004_01_000002
总用量 32
-rw-r--r-- 1 debian debian     0  2月  7 17:26 prelaunch.err
-rw-r--r-- 1 debian debian    70  2月  7 17:26 prelaunch.out
-rw-r--r-- 1 debian debian     0  2月  7 17:26 stderr
-rw-r--r-- 1 debian debian     0  2月  7 17:26 stdout
-rw-r--r-- 1 debian debian 27051  2月  7 17:27 syslog

syslog文件有我们自定义输出的日志,日志内容如下:

-- Linux-1 192.168.0.200
debian@Linux-1:~/program/hadoop-2.10.2/logs/userlogs/application_1675757920071_0004$ cat */syslog | grep mainClass
2023-02-07 17:26:44,392 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.200,startTime->2023-02-07 17:26:42,pid->3754,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000002_0, 4]
2023-02-07 17:26:56,849 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.200,pid->3754,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000002_0, 4]
2023-02-07 17:27:06,347 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.200,startTime->2023-02-07 17:27:04,pid->3839,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000003_0, 6]
2023-02-07 17:27:18,586 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.200,pid->3839,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000003_0, 6]
2023-02-07 17:27:27,675 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.200,startTime->2023-02-07 17:27:25,pid->3904,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000006_0, 10]
2023-02-07 17:27:39,979 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.200,pid->3904,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000006_0, 10]
2023-02-07 17:27:48,950 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.200,startTime->2023-02-07 17:27:47,pid->3965,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000009_0, 13]
2023-02-07 17:28:01,263 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.200,pid->3965,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000009_0, 13]
2023-02-07 17:28:10,980 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.200,startTime->2023-02-07 17:28:09,pid->4026,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000012_0, 16]
2023-02-07 17:28:15,964 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.200,pid->4026,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000012_0, 16]

-- Linux-2 192.168.0.201
debian@Linux-2:~/program/hadoop-2.10.2/logs/userlogs/application_1675757920071_0004$ cat */syslog | grep mainClass
2023-02-07 17:26:43,338 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.201,startTime->2023-02-07 17:26:41,pid->15295,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000000_0, 2]
2023-02-07 17:26:58,315 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.201,pid->15295,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000000_0, 2]
2023-02-07 17:26:44,621 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.201,startTime->2023-02-07 17:26:42,pid->15326,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000001_0, 3]
2023-02-07 17:26:59,053 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.201,pid->15326,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000001_0, 3]
2023-02-07 17:28:32,397 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleReducer: reducer task setup,ip->192.168.0.201,startTime->2023-02-07 17:27:05,mainClass->org.apache.hadoop.mapred.YarnChild,pid->15421
2023-02-07 17:28:44,596 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleReducer: reducer task cleanup,ip->192.168.0.201,pid->15421,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_r_000000_0, 7]
2023-02-07 17:27:09,522 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.201,startTime->2023-02-07 17:27:07,pid->15467,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000004_0, 8]
2023-02-07 17:27:24,832 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.201,pid->15467,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000004_0, 8]
2023-02-07 17:27:11,552 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.201,startTime->2023-02-07 17:27:08,pid->15500,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000005_0, 9]
2023-02-07 17:27:32,893 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.201,pid->15500,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000005_0, 9]
2023-02-07 17:27:36,450 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.201,startTime->2023-02-07 17:27:34,pid->15567,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000007_0, 11]
2023-02-07 17:27:52,060 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.201,pid->15567,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000007_0, 11]
2023-02-07 17:27:41,647 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.201,startTime->2023-02-07 17:27:40,pid->15617,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000008_0, 12]
2023-02-07 17:27:56,207 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.201,pid->15617,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000008_0, 12]
2023-02-07 17:28:01,633 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.201,startTime->2023-02-07 17:28:00,pid->15679,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000010_0, 14]
2023-02-07 17:28:07,591 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.201,pid->15679,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000010_0, 14]
2023-02-07 17:28:04,827 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.201,startTime->2023-02-07 17:28:03,pid->15725,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000011_0, 15]
2023-02-07 17:28:11,105 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.201,pid->15725,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000011_0, 15]
2023-02-07 17:28:16,469 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.201,startTime->2023-02-07 17:28:14,pid->15783,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000013_0, 17]
2023-02-07 17:28:25,503 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.201,pid->15783,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000013_0, 17]
2023-02-07 17:28:17,918 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task setup,ip->192.168.0.201,startTime->2023-02-07 17:28:16,pid->15814,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000014_0, 18]
2023-02-07 17:28:25,095 INFO [main] org.example.helloHadoop.maxSaleMapReduce.MaxSaleMapper: mapper task cleanup,ip->192.168.0.201,pid->15814,mainClass->org.apache.hadoop.mapred.YarnChild,args->[192.168.0.200, 41731, attempt_1675757920071_0004_m_000014_0, 18]

3、应用执行分析

通过日志可以得到map任务和reduce任务甘特图:

红条是进程启动时间,绿条是任务真正开始消耗的时间

从图中不难看出同一时间最多只有3个map任务在运行,reduce任务很早就启动了,但是要等map任务全部完成才真正开始。这个是因为MapReduce的“慢启动”机制,由参数mapreduce.job.reduce.slowstart.completedmaps控制,默认值0.05,相当于map任务完成5%就开始启动reduce任务。

MRAppMaster通过网络连接获取子任务的状态,MRAppMaster地址和绑定的端口会通过启动参数传给子进程,也就是日志输出的192.168.0.200, 41731。同时MRAppMaster会周期性向资源管理器报告自己的状态,也就是这条连接192.168.0.200:50682->192.168.0.200:8030

所以基本可以简单说明:

  1. 任务启动首先会运行application master进程
  2. 节点管理器负责启动容器运行应用的任务
  3. application master向资源管理器报告自己状态
  4. application master会根据需要继续申请资源
  5. 应用通信依赖自身,而不是通过YARN来中转

任务会被分配到不同的机器执行,那执行文件是如何共享的呢?答案是通过HDFS共享,在MRAppMaster的日志中有这样两行:

The job-jar file on the remote FS is hdfs://192.168.0.200:8082/tmp/hadoop-yarn/staging/debian/.staging/job_1675757920071_0004/job.jar
The job-conf file on the remote FS is /tmp/hadoop-yarn/staging/debian/.staging/job_1675757920071_0004/job.xml

从HDFS下载文件对比可以发现,这两个就是任务的可执行文件和使用的配置,同时当前目录下还有一些其他文件,比如我们的自定义依赖库就在libjars文件夹中。


三、YARN调度资源的几种模式

1、三种调度模式

YARN有三种调度器,分别是FIFO调度器(先进先出),容量调度器和公平调度器。

FIFO调度器是最简单的调度器,不需要任何配置,每个应用通过排队的方式使用集群资源。容量调度器通过队列分割资源,不同队列配置的容量不同,应用运行在不同的队列上。公平调度器通过动态的方式调度资源,当一个应用启动它会占用集群所有资源,当第二个应用启动后,它会慢慢等第一个应用释放出的部分资源,最终达到一个动态的公平共享资源。

2、容量调度器配置

假设有这样一个队列层次结构

root─┬─default
     └─dev
        └─test1
        └─test2

修改etc/hadoop/capacity-scheduler.xml文件内容为如下:

更多配置可以参考 https://hadoop.apache.org/docs/r2.10.2/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html

<configuration>
  <property>
    <name>yarn.scheduler.capacity.maximum-applications</name>
    <value>10000</value>
    <description>
      最大可以运行多少个应用
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
    <value>0.1</value>
    <description>
      application master进程占用的最大资源比例
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default,dev</value>
    <description>
      root队列下的队列
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.dev.queues</name>
    <value>test1,test2</value>
    <description>
      dev队列下的队列
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>70</value>
    <description>
      default队列默认容量
    </description>
  </property>
  
  <property>
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
    <value>90</value>
    <description>
      default队列最大容量
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
    <value>*</value>
    <description>
      哪些用户可以提交作业到default,*全部
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
    <value>*</value>
    <description>
      哪些用户可以控制default队列任务,*全部
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.default.acl_application_max_priority</name>
    <value>*</value>
    <description>
      哪些用户可以在default队列设置任务优先级,*全部
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.dev.capacity</name>
    <value>30</value>
    <description>
      dev队列默认容量
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
    <value>50</value>
    <description>
      dev队列最大容量
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.dev.acl_submit_applications</name>
    <value>*</value>
    <description>
      哪些用户可以提交作业到dev,*全部
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.dev.acl_administer_queue</name>
    <value>*</value>
    <description>
      哪些用户可以控制dev队列任务,*全部
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.dev.acl_application_max_priority</name>
    <value>*</value>
    <description>
      哪些用户可以在dev队列设置任务优先级,*全部
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.dev.test1.capacity</name>
    <value>50</value>
    <description>
      test1队列默认容量
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.dev.test2.capacity</name>
    <value>50</value>
    <description>
      test2队列默认容量
    </description>
  </property>
</configuration>

default队列和dev队列分别分配到了70%和30%的资源,dev队列又被分成了test1和test2两个队列,test1和test2平分dev队列资源。可以在资源管理器的web服务看到队列配置:

MapReduce应用通过配置mapreduce.job.queuename来指定运行队列,默认值是default。需要注意的是应该配置的是队列名,例如test1,而不是队列的全局限定名root.dev.test1。

修改应用配置文件mapreduce.job.queuenametest1,再次运行maxSaleMapReduce应用,可以发现此时只会启动1个application master和1个YarnChild进程。

启动进程数量和集群资源相关,因为资源受限,可以发现此时应用执行时间明显偏长

队列状态:

任务信息:

3、公平调度器配置

还是刚才的队列层次结构:

root─┬─default
     └─dev
        └─test1
        └─test2

首先要修改yarn-site.xml文件中的配置yarn.resourcemanager.scheduler.classorg.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

然后创建fair-scheduler.xml文件,内容如下:

更多配置可以参考 https://hadoop.apache.org/docs/r2.10.2/hadoop-yarn/hadoop-yarn-site/FairScheduler.html

<?xml version="1.0"?>
<allocations>
    <!-- 队列内默认调度策略 -->
    <defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>

    <queue name="default">
        <weight>70</weight>
        <!-- 队列内调度策略,支持fifo,fair,drf -->
        <schedulingPolicy>fifo</schedulingPolicy>
        <!-- 允许提交的用户 -->
        <aclSubmitApps>*</aclSubmitApps>
        <!-- 允许管理的用户 -->
        <aclAdministerApps>*</aclAdministerApps>
    </queue>

    <queue name="dev">
        <weight>30</weight>
        <!-- 允许提交的用户 -->
        <aclSubmitApps>*</aclSubmitApps>
        <!-- 允许管理的用户 -->
        <aclAdministerApps>*</aclAdministerApps>
        <queue name="test1">
            <weight>50</weight>
        </queue>
        <queue name="test2">
            <weight>50</weight>
        </queue>
    </queue>

    <!-- 任务匹配队列规则 -->
    <queuePlacementPolicy>
        <rule name="specified" />
        <rule name="default" queue="dev.test2" />
    </queuePlacementPolicy>
</allocations>

defaultQueueSchedulingPolicy配置指定队列内默认调度模式,如果队列自身没有指定调度模式,则采用此配置的值。

queuePlacementPolicy配置包含一个规则,用于匹配应用放置在哪个队列。specified表示优先采用应用指定的队列,如果匹配失败则继续匹配下一条规则。如果所有规则都不匹配则命中default规则,应用会放置在test2队列中。

重启资源管理器,web服务显示信息如下:

不配置mapreduce.job.queuename参数启动应用,可以发现应用被调度到队列test2上:

队列状态:

任务信息:

与容量调度器不同的是,test1虽然只设置了dev的一半的权重,但是实际使用了dev全部资源,而dev也超出了自身的30%的权重。这个是因为当前集群只有一个任务,所以这个任务可以独占集群所有资源。

如果一个集群非常繁忙,当任务被提交后,任务不会立即启动,任务会等待已经运行的任务释放资源才会启动。为了使任务从提交到执行的时间可预测,公平调度器支持“抢占”功能。

所谓抢占就是允许调度器主动终止超过权重的队列中运行的任务,释放的资源会被分配给低于应得权重的队列。但是因为任务被终止,所以被终止的任务会被重新执行,相当于降低了整个集群的运行效率。

通过设置yarn.scheduler.fair.preemption为true启动抢占功能,更详细的参数可以参考 https://hadoop.apache.org/docs/r2.10.2/hadoop-yarn/hadoop-yarn-site/FairScheduler.html 中的Configuration内容。

4、总结

YARN提供了三种调度器,分别是FIFO调度器(先进先出),容量调度器和公平调度器。FIFO调度器规则最为简单,任务可以独占所有资源以便更快的完成,但是如果出现大任务的情况会阻塞后续任务的执行。容量调度器通过队列来分割和保留集群资源,在一个繁忙的集群中可以为某些任务有效的保留可用资源,缺点是无法高效利用集群整体资源。公平调度器通过动态调度的模式调度资源,应用之间支持主动让出和抢占分配资源。

使用哪种模式要根据集群的业务场景来决定,不存在哪种调度模式更好或更差。

有关06yarn简介的更多相关文章

  1. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  2. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  3. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

  4. pytest简介 - 2

    介绍pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等测试用例的skip和xfail处理可以很好的和jenkins集成

  5. ruby-on-rails - Rails 未定义方法 `strftime' 为 "2013-03-06":String - 2

    我遇到了错误“2013-03-06”的未定义方法`strftime':String当尝试使用strftime从字符串2013-03-06正常显示日期(2013年6月3日或类似日期)时。在我的index.html.erb中执行此操作的行看起来像这样我只是在学习Rails,所以我确信这只是一个愚蠢的初学者错误,我们将不胜感激。谢谢 最佳答案 当strftime是时间/日期类的方法时,您的截止日期看起来是一个字符串。你可以试试这个:Date.parse(task.duedate).strftime("%B%e,%Y")

  6. SpringCloud入门实战(七)-Hystrix入门简介 - 2

    📝学技术、更要掌握学习的方法,一起学习,让进步发生👩🏻作者:一只IT攻城狮。💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。❤️《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo:源码地址👉🏻SpringCloud入门实战系列不迷路👈🏻:SpringCloud入门实战(一)什么是SpringCloud?SpringCloud入门实战

  7. flink on yarn - 2

    文章目录使用flinksqlclientonyarnsession模式Per-JobCluster模式flinkrunflinkrunapplication-tyarn-application配置任务退出时保留Checkpoint从外部checkpoint恢复应用资料使用安装完hadoop3.3.4之后,启动hadoop、yarn将flink1.14.6上传到各个服务器节点,解压flinksqlclientonyarnhttps://nightlies.apache.org/flink/flink-docs-release-1.15/docs/deployment/overview/Appli

  8. ruby - yarn 未初始化常量 Socket::SOL_TCP - 2

    我在这里尝试使用yarn,遇到了一个可能与ruby​​相关的问题。在执行任何yarn命令,我收到错误.../.rvm/gems/ruby-2.3.0/gems/yarn-0.1.1/lib/yarn/server.rb:14:in':uninitializedconstantSocket::SOL_TCP(NameError)错误堆栈:$yarn.../.rvm/gems/ruby-2.3.0/gems/yarn-0.1.1/lib/yarn/server.rb:14:in':uninitializedconstantSocket::SOL_TCP(NameError)Didyoume

  9. 最新2023年Kali Purple,紫色的带防御kali,简介和安装(超详细) - 2

    文章目录一,什么是kaliPurle(卡利紫)二,如何安装kaliPurple。(有步骤没图片直接是默认)1,复制它的下载链接到迅雷可以让你下镜像变得更快。2,打开你的虚拟机创建新的虚拟机3,点击后面浏览然后找到镜像的所在地选中确定,下一步4,这里默认就可以,因为Ubuntu和这个差不多架构。5,然后,名字自己改一下,然后把他安到你想要装的盘,容量默认。之后一直下一步就可以**6,打开它,然后第一个图形界面安装,直接回车,然后选中文点continue之后没有图片的直接点继续。7,密码想设什么设什么。然后一直继续到我的图片那里改一下就可以了。8,软件默认就行。9,耐心等待。然后点手动配置dvc然

  10. MPU6050 简介 - 2

    目录关于MPU6050芯片关于小板关于厂家和DATASHEET关于漂移关于角加速度还是角速度关于精度和量程(可调,可选)关于功耗,陀螺仪+加速器工作电流:3.8mA(全功率,陀螺仪在所有速率下,在1kHz采样率下加速)采样率高,功耗也高可以参考  MPU6050陀螺仪与Processing和匿名上位机飞控联动实录-知乎关于MPU6050芯片MPU6050传感器模块是6轴运动跟踪设备。包含3轴陀螺仪、3轴加速度计、运动处理器、温度传感器。I2C总线接口,可与微控制器进行通信。通过辅助I2C总线与其他传感器设备通信,如3轴磁力计、压力传感器等。如果3轴磁力计连接到辅助I2C总线,则MPU6050可

随机推荐