Yarn container 资源分配 与task和Executor关系

2021年3月26日 32点热度 0条评论 来源: chenshitong96

Yarn container 资源分配 与task和Executor关系

问题: spark on yarn 或者 mapreduce on yarn 中 container 的资源 与 maptask/reducetask 或 Executor的资源分配关系?

Yarn container 的个数, 内存与CPU控制

一. YARN 机器 – 预留内存

总共保留的内存=系统内存+HBASE内存。

每台机子内存 系统需要的内存 HBase需要的内存
4GB 1GB 1GB
8GB 2GB 1GB
16GB 2GB 2GB
24GB 4GB 4GB
48GB 6GB 8GB
64GB 8GB 8GB
72GB 8GB 8GB
96GB 12GB 16GB
128GB 24GB 24GB
255GB 32GB 32GB
512GB 64GB 64GB

yarn.nodemanager.resource.memory-mb

  • 集群中某个计算节点分配给nodemanager的最大可用内存。

  • =总内存-预留

  • 默认是8G

  • 集群并不会主动检测这个可用内存,如果节点内存资源少于8G,需要将这个配置项设置成实际的资源, 否则oom

yarn.nodemanager.vmem-pmem-ratio

  • 虚拟内存 不太懂?? TODO

  • 虚拟内存的比例,默认是2.1,即每使用1G物理内存,分配2.1的虚拟内存,一般需要调大点

  • yarn.nodemanager.vmem-check-enabled=false 关闭对虚拟内存的检测

二. container 内存分配

每个CONTAINER 最小分配内存

– MIN_CONTAINER_SIZE

每台机子可用的RAM container最小值
小于4GB 256MB
4GB到8GB之间 512MB
8GB到24GB之间 1024MB
大于24GB 2048MB

yarn.scheduler.minimum-allocation-mb

  • 指定单个容器(container)可申请的最小内存资源

  • 参考值上述表

每个CONTAINER 最大分配内存

yarn.scheduler.maximum-allocation-mb

  • 单个(container)可申请的最大内存资源,应用在运行时申请的内存不能超过这个配置。

  • 可以配置成和nodemanager的可用内存( yarn.nodemanager.resource.memory-mb (nodemanager可用内存))一样即可

每台机器拥有的container计算公式

containers = min (2CORES, 1.8DISKS, (Total available RAM) / MIN_CONTAINER_SIZE)

  • CORES为机器CPU核数
  • DISKS为机器上挂载的磁盘个数
  • Total available RAM为机器总内存
  • MIN_CONTAINER_SIZE是指container最小的容量大小,这需要根据具体情况去设置,可以参考下面的表格:

每个container的平均使用内存大小计算方式为:

RAM-per-container = max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))

container 内存对 mapreduce 内存限制

mapreduce.map.memory.mb

  • MAP YARN 申请内存

  • yarn.scheduler.minimum-allocation-mb < mapreduce.map.memory.mb < yarn.scheduler.maximum-allocation-mb

  • container内存最小 < mapreduce.map.memory.mb < container内存最大

mapreduce.reduce.memory.mb

  • REDUCE YARN 申请内存

  • 同理:container内存最小 < mapreduce.reduce.memory.mb < container内存最大

  • 建议这个值是map的2倍,这个可能是要考虑到多个map后数据可能会有一个reduce处理,根据实际需要来看。

mapreduce.map.java.opts

  • MAP JVM 内存

  • 在map阶段的yarnchild进程执行jvm参数

  • 应用程序在该container上,最终运行的是yarnchlid进程,其进程内部就是执行具体的mapTask、reduceTask任务。

  • 必须小于mapreduce.map.memory.mb (MAP YARN 申请内存), 一般是 0.8 * mapreduce.map.memory.mb

mapreduce.reduce.java.opts

  • REDUCE JVM 内存

  • 在reduce阶段的yarnchild进程执行jvm参数

  • 应用程序在该container上,最终运行的是yarnchlid进程,其进程内部就是执行具体的mapTask、reduceTask任务。

  • 必须小于mapreduce.reduce.memory.mb (REDUCE YARN 申请内存), 一般是 0.8 * mapreduce.reduce.memory.mb

三. container cpu核数分配

yarn.nodemanager.resource.cpu-vcores

  • yarn可以使用的虚拟CPU个数,默认是8

  • 集群并不会主动检测物理核心数

  • 可以 将值配置与物理核心个数相同, 如果节点CPU核心不足8个,要调小这个值.

yarn.scheduler.minimum-allocation-vcores

  • container 最小可申请的虚拟核心数,默认为1

  • container 最大可申请的虚拟核心水,默认为4,如果申请资源时,超过这个配置,会抛出InvalidResourceRequestException

问题结果:

mapreduce on yarn :

Application Master 向Resource Manager申请 Container , 每个MapTask/ReduceTask 申请一个Container。

  • 每一个Task就是一个进程。也是一个Container 资源

  • 进程的名字叫做:YarnChild

  • MapTask/ReduceTask 的资源申请是Container资源范围内。

  • 那么:对于 Container 里面的task是单线程在运行的?

spark on yarn

Application Master 向Resource Manager申请 Container , 每个Executor申请一个Container。

  • 每一个Executor是一个JVM进程。也是一个Container 资源

  • 在spark on yarn 中 Executor 的进程 名字叫 CoarseGrainedExecutorBackend 类似于Hadoop MapReduce中的YarnChild, 一个CoarseGrainedExecutorBackend进程有且仅有一个executor对象,它负责将Task包装成taskRunner,并从线程池中抽取出一个空闲线程运行Task。

  • 一个Yarn的container就是一个Spark的CoarseGrainedExecutorBackend,也就是常说的Spark的Executor进程,每个executor可以并行执行多个task。CoarseGrainedExecutorBackend是Executor的RPC endpoint服务,具体执行task是CoarseGrainedExecutorBackend持有的Executor对象的launchTask方法启动.

  • Executor 的资源申请是Container资源范围内。

在 Executor 中并行执行多个 Task

把executor的jvm进程看做task执行池,每个executor最大有 spark.executor.cores / spark.task.cpus 个执行槽( solt ), 一个执行槽可以同时执行一个task。

  • – spark.task.cpus 是指每个任务需要的 CPU 核数, 大部分应用使用默认值 1
  • – spark.executor.cores 是指每个executor的核数。
    原文作者:chenshitong96
    原文地址: https://blog.csdn.net/qq_36998916/article/details/115235373
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。