前言
最近在做 CDH -> CDP
的迁移,Yarn
迁移完成后,发现在spark/flink
作业的executor
内存参数和Yarn web ui
显示申请的内存不一致。
例如:一个 spark
任务申请了 10个 executor
,每个executor
内存为 1G,driver
内存为 1G ,共11G,但是Yarn web ui
上面显示单个容器内存为 2G,共22G。
环境
yarn 3.0
capacity scheduler
问题排查
首先需要明确一点,不管是 spark/flink
任务,申请的 executor
的内存并不等于 yarn
的容器内存。
yarn 的容器内存肯定是要大于,spark/flink
的申请的executro的内存的。但是为什么是总大于1G,这个就是我们今天的排查方向。
问题原因
Capacity Scheduler 分配容器内存的大小是“最小容器内存”的倍数。例如,如果你的每个容器的最小调度器mb内存是1gb,而你要求一个4.5gb大小的容器,调度器会把这个请求四舍五入为5gb。对于非常高的最小值,这可能会造成巨大的资源浪费问题,例如,如果我们要求5GB的最小值,我们将得到8GB的服务,提供我们甚至从未计划使用的3GB的额外资源 当配置最小和最大的容器大小时,最大的容器应该被最小的容器平均分割。
结论
经过一系列排查,得出以下结论。
yarn
的容器申请的内存肯定是要大于,spark/flink
的申请的executro
的内存的。Capacity Scheduler
是根据最小容器内存
的倍数分配,比如我们设置executor memory
为1G, yarn 申请的容器内存肯定要高于1G,由于倍数分配的问题,最终yarn containor
内存分配为2G。- 这里顺便说下
Fair Scheduler
的机制是类似的,都是整数倍的分配,不同的是根据yarn.scheduler.increment-allocation-mb
这个参数来设置的,默认为512M
。
参考
- https://blog.cloudera.com/yarn-capacity-scheduler/
- https://hadoop.apache.org/docs/r3.1.2/hadoop-yarn/hadoop-yarn-site/FairScheduler.html