Hadoop - container on yarn
- hadoop 2.x版本的mapreduce任务都提交到yarn框架执行
- container
- 定义:将一定的内存和CPU,如4G内存,1个vcore抽象成一个container
- 任务都是运行在container里
- vcore:虚拟核数,一般是机器实际core的2倍
- yarn参数配置细节
假定机器配置为64G,16core
-
linux的保护机制为了防止oom,我们预留2G,剩余可分配62G
-
为了能流畅的运行(满负荷会很卡),我们再预留15~20%的内存,剩余可分配62*0.8=49.6G
- 为了任务能快速运行,我们需要把DataNode和NodeManager部署在一台机器(如果不是同一台,当任务进行时还需要去DataNode去拿数据),我们可以分配给DN 4G,NM 1G
- 剩余的留给系统
-
针对49.6G的计算资源,我们应该怎么分配container的资源呢,先看一下yarn的几个参数
参数名称 参数含义 默认值 yarn.nodemanager.resource.memory-mb nodemanger管理的资源总资源(用于计算的,也就是上面的49.6G) -1 yarn.scheduler.minimum-allocation-mb 每个container可分配的最小内存,默认1G 1024 yarn.scheduler.maximum-allocation-mb 每个container可分配的最大内存,默认8G 8192 - 假设我们使用默认配置,那么最大的container个数=49.6G/1G=49个,最少的container个数=49.6G/8G=6个,但是我们的cpu核数只有16核,所以container只能在6~16范围,所以当任务为1G时,最大才能分配16个container,使用16G,内存很浪费,需要优化
- 为了能最大利用资源,yarn引入vcore的概念。cpu划分成虚拟cpu,初衷是不同的节点的cpu性能可能不同,每个cpu具有计算能力也不一样,某一个物理cpu的计算能力可能是另一个物理cpu的2倍,当提交任务时,可为第一个cpu多配置几个虚拟cpu以弥补差异,当任务需要的资源多时,就多分配几个虚拟cpu。在引入vcore之后,我们看下yarn的另外几个参数
参数名 参数含义 参数值 yarn.nodemanager.resource.cpu-vcores 该节点上YARN可使用的虚拟CPU个数 8 yarn.scheduler.minimum-allocation-vcores 单个任务可申请的最小虚拟CPU个数,默认是1 1 yarn.scheduler.maximum-allocation-vcores 单个任务可申请的最多虚拟CPU个数,默认是32 32
引入vcore之后,我们重新来捋一捋思路
可用计算49G内存,12核(因为其他程序还要用几个核),vcores=24
先假定单个任务申请的最小虚拟cpu=2(yarn.scheduler.minimum-allocation-vcores=2)
那么最多可以申请24/2=12container,那么每个container的最小内存为49/12=4G(yarn.scheduler.minimum-allocation-mb=4G)
再有,每个任务申请的虚拟cpu个数经验值为4vcore,那么最少可以分配24vcore/4vcore=6
那么每个container最大可用内存为49/6=8G
所以可以配置参数为
yarn.scheduler.minimum-allocation-vcores=2
yarn.scheduler.minimum-allocation-mb=4G
yarn.scheduler.maximum-allocation-vcores=4
yarn.scheduler.maximum-allocation-mb=8G
-
总结:
container的内存分配,主要基于两个经验值
- 可用于计算的cpu的80%
- 每个任务的合理的最大vcore=4
新手理解,有不同的看法可以留言