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

0xFF 参考文档

1.好文推荐

2. 参考文档