Yarn调优
假设内存128G 16物理core
装完CentOS,消耗内存1G
系统预览15%-20%内存(包含1.1),以防全部使用导致系统夯住 和 oom机制事件,或者给未来部署组件预览点空间(128*20%=25.6G==26G)
假设只有DN NM节点,余下内存: 128-26=102G
给DN进程(自身)2G,给NM进程(自身)4G,剩余102-2-4=96G
container(容器)内存的分配
yarn.nodemanager.resource.memory-mb 96G
yarn.scheduler.minimum-allocation-mb 1G 极限情况下,只有96个container 内存1G
yarn.scheduler.maximum-allocation-mb 96G 极限情况下,只有1个container 内存96G
container的内存会自动增加,默认1g递增
container:1-96个
container虚拟核
物理核:虚拟核 =1:2 32vcore
默认1:2 一般不修改
yarn.nodemanager.resource.pcores-vcores-multiplier 2
container物理核分配 (物理核:虚拟核 =1:2 ==>16:32)
yarn.nodemanager.resource.cpu-vcores 32个
yarn.scheduler.minimum-allocation-vcores 1个 极限情况下,只有32个container
yarn.scheduler.maximum-allocation-vcores 32个 极限情况下,只有1个container
container的物理核会自动增加,默认1个递增,那么container的个数的范围: :1-32个
关键: cloudera公司推荐,一个container的vcore最好不要超过5,那么我们设置4
yarn.scheduler.maximum-allocation-vcores 4 极限情况下,只有8个container
综合memory+vcore的分配
一共有32个vcore,一个container的vcore是4个,那么分配container一共有8个
重新分配物理核
yarn.nodemanager.resource.cpu-vcores 32个
yarn.scheduler.minimum-allocation-vcores 1个
yarn.scheduler.maximum-allocation-vcores 4个 极限container 8个
根据物理核重新分配内存
yarn.nodemanager.resource.memory-mb 96G
yarn.scheduler.minimum-allocation-mb 1G
yarn.scheduler.maximum-allocation-mb 12G 极限container 8个
分配后的每个container的物理核数是4个,内存大小是12G,当然当spark计算时内存不够大,这个参数肯定要调大,那么这种理想化的设置个数必然要打破,以memory为主
假如 256G内存 56core,请问参数如何设置
首先减去系统内存开销和其他进程开销,
系统开销: 256*0.2=52G
DN开销: 2G
NM开销: 4G
Hbase开销: 暂无
剩余内存容量: 256-52-2-4=198G
物理核:虚拟核 =1:2
每个container的物理核数量是4个,56*2/4=28个container容器
确定了最多分配28个container容器,每个容器的内存应该分配的容量是: 198/28==>7G
但是生产上正常取内存是2的倍数,随意内存定位8g
那么每个container的最大核数设置4,最大内存数设置8G
假如该节点还有组件,比如hbase regionserver进程,那么该如何设置?
总容量减就完事了。
所有的配置信息在yarn-default.xml文件中
内存参数默认值:
KEY | VALUE | DESC |
---|---|---|
yarn.nodemanager.resource.memory-mb | -1 | 可以分配给容器的物理内存总量(以MB为单位)。 |
yarn.scheduler.minimum-allocation-mb | 1024 | RM上每个容器请求的最小分配 |
yarn.scheduler.maximum-allocation-mb | 8192 | RM上每个容器请求的最大分配 |
核数参数默认值:
KEY | VALUE | DESC |
---|---|---|
yarn.nodemanager.resource.cpu-vcores | -1 | 可以为容器分配的vcore总数量。 |
yarn.scheduler.minimum-allocation-vcores | 1 | RM上每个容器请求的最小虚拟CPU核心分配。 |
yarn.scheduler.maximum-allocation-vcores | 4 | RM上每个容器请求的最大虚拟CPU核心分配。 |
Yarn调度器
1.FIFO 先进先出
2.Capacity 计算
有一个专门的队列来运行小任务,
但是为了小任务专门设置一个队列预先占用一定的集群资源。
这会导致大任务的执行时间落后FIFO的调度时间
3.Fair 公平
在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。如上图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
需要注意的是,在上图Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成
apache 默认计算:
yarn.resourcemanager.scheduler.class
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
CDH 默认公平:
web Fair