一. Yarn资源参数调优
概念介绍:
概念中文称 | 概念英文名 | 解释 |
容器 | container | Yarn中动态资源分配的基本单位,拥有一定的内存及CPU核数 |
物理核 | pcore | 服务器上物理CPU的核 |
虚拟核 | vcore | 设计初衷是考虑不同节点的CPU的性能不一样,每个CPU的计算能力不一样。比如某个物理CPU是另外一个物理CPU的2倍,这时通过设置第一个物理CPU的虚拟core来弥补这种差异 |
涉及参数:
文件 | 参数 | 默认大小 | 备注 |
yarn-site.xml | yarn.nodemanager.resource.pcores-vcores-multiplier | 1 | 将pcore转化为vcore的乘数,若为2,表示pcore*2=vcore。推荐pcore:vcore=1:2 |
yarn-site.xml | yarn.nodemanager.resource.memory-mb | -1 | 所有conatiner能使用的物理内存总和 |
yarn-site.xml | yarn.scheduler.minimum-allocation-mb | 1024 | 单个container向RM能申请到的最小内存 |
yarn-site.xml | yarn.scheduler.maximum-allocation-mb | 8192 | 单个container向RM能申请到的最大内存 |
yarn-site.xml | yarn.nodemanager.resource.cpu-vcores | -1 | 所有container能使用的vcore总和 |
yarn-site.xml | yarn.scheduler.minimum-allocation-vcores | 1 | 单个container想RM能申请到的最小vcore数量 |
yarn-site.xml | yarn.scheduler.maximum-allocation-vcores | 4 | 单个container想RM能申请到的最大vcore数量。cloudera公司推荐一个container的vcores最好不要超过5,一般我们设置为4 |
对于DataNode和NodeManager,一般设置为2G和4G
组件 | 文件 | 参数 | 默认大小 | 备注 |
DataNode | hadoop-env.sh | HADOOP_HEAPSIZE= | 1000 | 改为2048 |
NodeManager | yarn-env.sh | YARN_HEAPSIZE= | 1000 | 改为4096 |
例1:
假设一台服务器,内存128G,16个pcore,需要安装DataNode和NodeManager,
具体如何设置参数?
1)装完CentOS,消耗内存1G;
2)系统预留15%-20%(包含第1点),防止全部使用二导致系统夯住或者OOM机制事件,
或者给未来部署其他组件预留空间。此时余下128*80%=102G
3)DataNode设定2G,NodeManager设定4G,则剩余102-2-4=96G;
4)明确两点:pcore:vcore=1:2 ,故vcore数量为16*2=32;单个container占用4个vcore
5)确定 memory和vcore
yarn.nodemanager.resource.cpu-vcores --> 32 # 16*2=32
yarn.scheduler.minimum-allocation-vcores --> 1 # 最多有32个container
yarn.scheduler.maximum-allocation-vcores --> 4 # 最少有8个container
yarn.nodemanager.resource.memory-mb --> 96G # RM能使用的最大内存
yarn.scheduler.minimum-allocation-mb --> 1G #
yarn.scheduler.maximum-allocation-mb --> 12G # 极限8个(96/8)
注意:若有spark组件,当spark计算时内存不够大,
yarn.scheduler.maximum-allocation-mb势必要调大,
则这种理想化的设置会被打破,以memory为主
例2:
假设一台服务器,内存256G,56个pcore,需要安装DataNode和NodeManager,
具体如何设置参数?
1)装完CentOS,消耗内存1G;
2)系统预留15%-20%(包含第1点),防止全部使用二导致系统夯住或者OOM机制事件,
或者给未来部署其他组件预留空间。此时余下256*80%=204G
3)DataNode设定2G,NodeManager设定4G,则剩余204-2-4=198G;
4)明确两点:pcore:vcore=1:2 ,故vcore数量为56*2=112;单个container占用4个vcore
5)确定 memory和vcore
yarn.nodemanager.resource.cpu-vcores --> 112 # 56*2=112
yarn.scheduler.minimum-allocation-vcores --> 1 # 最多有112个container
yarn.scheduler.maximum-allocation-vcores --> 4 # 最少有28个container
yarn.nodemanager.resource.memory-mb --> 198G # RM能使用的最大内存
yarn.scheduler.minimum-allocation-mb --> 1G #
yarn.scheduler.maximum-allocation-mb --> 7G # 极限28个(198/28)
例3:
假设一台服务器,内存256G,56个pcore,需要安装DataNode、NodeManager和hbase regionserver(占用30G),
具体如何设置参数?
1)装完CentOS,消耗内存1G;
2)系统预留15%-20%(包含第1点),防止全部使用二导致系统夯住或者OOM机制事件,
或者给未来部署其他组件预留空间。此时余下256*80%=204G
3)DataNode设定2G,NodeManager设定4G,则剩余204-2-4-30=168G;
4)明确两点:pcore:vcore=1:2 ,故vcore数量为56*2=112;单个container占用4个vcore
5)确定 memory和vcore
yarn.nodemanager.resource.cpu-vcores --> 112 # 56*2=112
yarn.scheduler.minimum-allocation-vcores --> 1 # 最多有112个container
yarn.scheduler.maximum-allocation-vcores --> 4 # 最少有28个container
yarn.nodemanager.resource.memory-mb --> 168G # RM能使用的最大内存
yarn.scheduler.minimum-allocation-mb --> 1G #
yarn.scheduler.maximum-allocation-mb --> 6G # 极限28个(168/28)
思考:
第一台服务器配置好,pcore:vcore=1:2,
第一台服务器配置好,pcore:vcore=1:1,该怎么办?
通过各个节点上的XML文件配置实现
二. 调度器整理三种
- 区别是什么?
2.1 FIFO调度器
- 先进先出(First In First Out)调度器。FIFO 调度器是 Hadoop 使用最早的一种调度策略,可以简单的将其理解为一个队列,这意味着在集群中同时只能有一个作业运行。所有的应用程序按照提交顺序来执行,在上一个 Job 执行完成之后,下一个 Job 按照队列中的顺序执行。FIFO调度器以独占集群全部资源的方式来运行作业,这样的好处是 Job 可以充分利用集群的全部资源,但是对于运行时间短,优先级高或者交互式查询类的MR Job 需要等待它之前的 Job 完成才能被执行,这也就导致了如果前面有一个比较大的 Job 在运行,那么后面的 Job 将会被阻塞。因此,虽然 FIFO 调度器实现简单,但是并不能满足很多实际场景的要求。这也就促使 Capacity 调度器和 Fair 调度器的诞生。
2.1 Capacity调度器
计算调度器。可以将它理解为一个资源队列。资源队列需要用户自己分配。例如因为 Job 需要要把整个集群分成了AB两个队列,A队列又可以继续分,比如将A队列再分为1和2两个子队列
那么队列的分配就可以参考下面的树形结构:
—A[60%]
|—A1[40%]
|—A2[60%]
—B[40%]
2.1 Fair调度器
- Fair 调度器也称之为公平调度器。Fair 调度器是在整个时间线上,所有的 Job 平分资源。默认情况下,Fair 调度器只是对内存资源做公平的调度和分配。当集群中只有一个任务在运行时,那么此任务会占用集群的全部资源。当有其他的任务提交后,那些释放的资源将会被分配给新的 Job,所以每个任务最终都能获取几乎一样多的资源。
- Fair 调度器也可以在多个队列上工作,例如有两个用户A和B,他们分别拥有一个队列。当A启动一个 Job 而B没有提交任何任务时,A会获得集群全部资源;当B启动一个 Job 后,A的任务会继续运行,不过队列A会慢慢释放它的一些资源,一会儿之后两个任务会各自获得集群一半的资源。如果此时B再启动第二个 Job 并且其它任务也还在运行时,那么它将会和B队列中的的第一个 Job 共享队列B的资源,也就是队列B的两个 Job 会分别使用集群四分之一的资源,而队列A的 Job 仍然会使用集群一半的资源,结果就是集群的资源最终在两个用户之间平等的共享。
- Apache Hadoop的默认调度器是什么?
计算调度器。看参数yarn.resourcemanager.scheduler.class的默认值
文件 | 参数 | 默认值 |
yarn-site.xml | yarn.resourcemanager.scheduler.class | org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler |
- Cloudera Hadoop的默认调度器是什么?
公平调度器。Yarn web: http://localhost:8088/cluster/scheduler 可查看: