Hadoop-Yarn调优
未完待续
0x01 概述
1.1 官方文档
首先给出一个Apache-Hadoop官方写的关于yarn-site.xml
的配置项说明地址:
1.2 内存和CPU的资源隔离方案
YARN对内存资源和CPU资源采用了不同的资源隔离方案:
-
对于内存资源
为了能够更灵活的控制内存使用量,默认情况YARN采用了进程监控的方案控制内存使用,即每个NodeManager会启动一个额外监控线程监控每个container内存资源使用量,一旦发现超过指定资源,则会将该子进程杀死。采用这种机制的另一个原因是Java中创建子进程采用了fork()+exec()的方案,子进程启动瞬间,它使用的内存量与父进程一致,从外面看来,一个进程使用内存量可能瞬间翻倍,然后又降下来,采用线程监控的方法可防止这种情况下导致swap操作以及误杀。而Cgroup对内存监控缺乏灵活,一旦发现任务使用内存资源超过阈值就会立刻杀死或抛出OOM异常。
-
对于CPU资源
采用了Cgroups进行资源隔离。
1.3 pull-based异步资源分配
注意, YARN的资源分配过程是异步的,即RM将资源分配给一个application后,它不会立刻push给对应的AM,而是暂存到缓冲区,等待AM通过周期性的RPC函数主动来取。也就是说,资源分配采用pull-based模型,而不是push-based模型。
0x02 内存
2.1 概述
内存是决定程序生死的资源,最为重要。
2.2 yarn-site.xml
2.2.1 NodeManager
-
yarn.nodemanager.resource.memory-mb
默认值8192MB。表示该节点可被分配给container的物理内存。注意:若该节点内存不够8GB,则需调小该值,因为YARN不会探测节点物理内存总量。
-
yarn.nodemanager.vmem-pmem-ratio
默认值2.1。设定container可使用的虚拟内存和物理内存比值。 -
yarn.nodemanager.pmem-check-enabled
默认值true。是否强制container的物理内存资源使用阈值。如果设定为true则会启动一个线程监控container的物理内存使用情况,若超出了分配值,则会被kill。 -
yarn.nodemanager.vmem-check-enabled
默认值true。是否强制container的虚拟内存资源使用阈值。如果设定为true则会启动一个线程监控container的虚拟内存使用情况,若超出了分配值,则会被kill。
2.2.2 ResourceManager
-
yarn.scheduler.minimum-allocation-mb
默认值1024(单位MB)。每个container可申请的最少物理内存量,如果申请少于该值,抛出InvalidResourceRequestException。 -
yarn.scheduler.maximum-allocation-mb
默认值8192(单位MB)。每个container可申请的最多物理内存量,如果申请多于该值,抛出InvalidResourceRequestException。
0x03 CPU
3.1 概述
CPU是决定程序快慢的资源,重要性次之。
在yarn中自己抽象了一个vcore概念,和物理cpu core并不绝对对等。因为考虑到CPU性能各不相同,所以可以自己为不同的CPU定义vcore。
3.2 yarn-site.xml
3.2.1 NodeManager
- yarn.nodemanager.resource.cpu-vcore
默认值8。该参数为RM在为container分配vcore时,本node可用的Vcores,官方建议和物理核数相同。
3.2.2 ResourceManager
- yarn.scheduler.minimum-allocation-vcores
默认值1。每个Container可向RM申请的最小vcore数,小于时抛出InvalidResourceRequestException
- yarn.scheduler.maximum-allocation-vcores
默认值32。每个Container可向RM申请的最大vcore数,超过时抛出InvalidResourceRequestException