集群为cdh6.3.2

yarn 队列权重 yarn创建队列_Hadoop

yarn 队列权重 yarn创建队列_fair_02

{
  "defaultQueueSchedulingPolicy": "fair",
  "queuePlacementRules": [
    {
      "create": false,
      "name": "specified"
    },
    {
      "name": "default",
      "queue": "fdw_queue"
    }
  ],
  "queues": [
    {
      "aclAdministerApps": "*",
      "aclSubmitApps": "*",
      "name": "root",
      "queues": [
        {
          "name": "fdw_queue",
          "queues": [],
          "schedulablePropertiesList": [
            {
              "maxAMShare": 0.8,
              "maxResources": {
                "cpuPercent": 99.8,
                "memoryPercent": 99.8
              },
              "maxRunningApps": 300,
              "scheduleName": "default",
              "weight": 1.0
            }
          ],
          "schedulingPolicy": "drf"
        },
        {
          "name": "realtime_queue",
          "queues": [],
          "schedulablePropertiesList": [
            {
              "maxAMShare": 0.8,
              "maxResources": {
                "cpuPercent": 0.1,
                "memoryPercent": 0.1
              },
              "maxRunningApps": 50,
              "minResources": {
                "memory": 40960,
                "vcores": 10
              },
              "scheduleName": "default",
              "weight": 1.0
            }
          ],
          "schedulingPolicy": "drf"
        },
        {
          "name": "default",
          "queues": [],
          "schedulablePropertiesList": [
            {
              "maxAMShare": 0.8,
              "maxResources": {
                "cpuPercent": 0.1,
                "memoryPercent": 0.1
              },
              "maxRunningApps": 100,
              "scheduleName": "default",
              "weight": 8.0
            }
          ],
          "schedulingPolicy": "drf"
        }
      ],
      "schedulablePropertiesList": [
        {
          "scheduleName": "default",
          "weight": 1.0
        }
      ],
      "schedulingPolicy": "drf"
    }
  ],
  "users": []
}

 

yarn 队列权重 yarn创建队列_Hadoop_03

 我们设置了fair的容量及策略那么实际是什么样呢?

首先 yarn total mem=740 GB=757760MB yarn total_core=384

先分析第一个队列fdw_queue 

yarn 队列权重 yarn创建队列_yarn 队列权重_04

maxAMShare=0.8

cpuPercent=98.8

MemPercent=98.8

所以

该队列运行的能够申请最大内存 maxMem=757760*99.8=756244.48MB

该队列运行中能够申请的最大core maxCore=384*99.8%=383.232=383core

(这个AMShare是占用该队列的百分比 不是占用所有资源的百分比)

该队列中所有app的am能够申请的最大内存 maxAM=maxMem756244.48*0.8=604995.584MB

该队列中所有app的am能够申请的最大core maxAMCore=383.232*0.8=306.5856core

该队列能够同时运行的最大应用 maxRunningApps=300

yarn 队列权重 yarn创建队列_yarn_05

 实际中可以看到

AM MAX RESOURCE  MEM=604996  CORE=307

MAX RESOURCE MEM=756244 CORE=383 

然后number Active application= 11 = AM USED RESOURCE 中的vcore

used resource 就是正在使用的资源

demand resouce 就是运行在该队列里 所有需要的资源,有可能我现在需要50G 队列只有40G 我还需要等待或者抢占

AM USED RESOURCE  就是am使用的资源  就想我们提交一个spark任务,yarn会先起一个AM然后向rm申请资源划分NM 然后才开始运行Spark任务,一般来说一个app对应一个AM ,而我们一般设置一个AM 一个core 所以 ACTIVE APP = AM USER RESOUCES 里的VCORE

那现在有个问题了 一个AM的MEM是多少? 45056/1024=44G 也就是4G 

后面任务 又变成  38400/1024=37.5G

AM Used Resources:

<memory:45056, vCores:11>

AM Used Resources:

<memory:38400, vCores:10>

其实这跟我们提交的应用有关...能力有限,暂不研究。 但是为什么会有小数点.5因为下面的

yarn 队列权重 yarn创建队列_fair_06

yarn 队列权重 yarn创建队列_Hadoop_07

还有  我提交一个hive任务是hive on spark 直接起了6G的,spark.driver.memory=6442450944b  

yarn 队列权重 yarn创建队列_yarn 队列权重_08

这列说下一般来说AM 1G-2G就够用了

这里设置的3G 以及 maxAMShare=0.8 导致AM可用内存很大,(实际很大,但是不会全部跑满,一般没影响)

本来准备批判下这个0.8的参数的,后来和负责人聊天才知道,因为最开始开发环境资源较少,如果设置为0.1 那么AM可用资源就相当少例如 50G*0.1=5G  我们一个应用一个AM AM设置为2G 那么只能跑2个APP了。。所以开发环境设置的比较大,生产还是0.1 0.2 。

分析第二个队列realtime_queue

yarn 队列权重 yarn创建队列_fair_09

yarn 队列权重 yarn创建队列_scheduler_10

 

 注意这里 写的

"maxResources": {"cpuPercent": 0.1,"memoryPercent": 0.1}

 根据我们上面写的 这里毫无疑问就是错的了。 因为上面的99.8实际是总资源的 99.8%

这里0.1% 啥资源都没有了。

minResources 与yarn web 一样为 40960MB 和10CORE

maxResources这个我估计 是我们设置不合理 所以他直接就就用了最小的了。

maxAMResource 一样  40960*0.8=32768 基本符合

分析第三个队列

yarn 队列权重 yarn创建队列_fair_11

yarn 队列权重 yarn创建队列_scheduler_12

 

 maxResouces =757MB core=0 

实际是因为我们设置的

"maxResources": {"cpuPercent": 0.1,"memoryPercent": 0.1}

那么  maxResouces=总内存740G*0.1%=740*1024*0.001=757.76MB 符合

         totoalCore384*0.1%=0.384=0Core

所以总的认真来看我们的设置其实是有不少问题。

再分析下 这个fair是怎么工作的。

yarn 队列权重 yarn创建队列_yarn 队列权重_13

 

总内存为740*1024=757760MB

当前任务有4个 757760/4=189440  咦 怎么和图中的189061有点出入?

实际上是 这个队列的内存 740*1024*99.8%/4=189061.12 刚好相等。

fairshare 是什么意思。我借鉴的那篇文章写的很详细。我也说一遍,就当学习了

当前队列里共有756244.48MB内存,当前正在运行的任务有4个那么每个任务都能申请到189061MB内存。实际情况肯定有的需要的多 有的需要的少

那么需要少的,直接全部给了。

需要的多的,先占用了189061MB内存, 然后看其余的任务多出来的够不够。

借用作者的例子

有一条队列总资源12个, 有4个job,对资源的需求分别是: 
job1->1,  job2->2 , job3->6,  job4->5
     第一次算:  12 / 4 = 3 
		job1: 分3 --> 多2个 
		job2: 分3 --> 多1个
		job3: 分3 --> 差3个
		job4: 分3 --> 差2个
	第二次算: 3 / 2  = 1.5   这里的3指得是多的1个+2个=3个 2指的是 job3+job4=2个job
         job1: 分1
		job2: 分2
		job3: 分3 --> 差3个 --> 分1.5 --> 最终: 4.5 
		job4: 分3 --> 差2个 --> 分1.5 --> 最终: 4.5 
	第n次算: 一直算到没有空闲资源

 这里到目前就i有点明白公平队列怎么设置,怎么分配任务比较合理了。

比如我们总资源 1000G  200Core 创建三个队列

queue1  600G 120core  负责集群的主要工作 比如hive spark 

queue2  300G  60Core  负责集群的次要工作  实时flink

queue3  100G  20core  负责集群零散工作      比如突然的导数或者测试用的

那么有个问题来了,比如月结的时候,那个时候queue1 资源占满,queue3测试工作暂时不需要

queue3这部分资源等于没有用,那么怎么办?

重新配置 队列?

yarn 队列里有个抢占机制, 详见下文

yarn 队列权重 yarn创建队列_Hadoop_14

https://blog.csdn.net/zhanyuanlin/article/details/71516286我也学习下。

yarn 队列权重 yarn创建队列_yarn_15