Spark on Yarn 内存(物理+虚拟)使用

Spark on Yarn memory(physical+virtual) usage

我很难理解内存管理如何与 Spark on Yarn 一起工作:

我的spark-submit

--executor-memory 48g
--num-executors 2

当我运行top -p <pids_of_2_yarn_containers/executors>

VIRT    RES   %MEM
51.059g 0.015t ~4    (container 1)
51.039g 0.012t ~3    (container 2)

系统总内存380g

最后,在 YARN 上,当我点击每个容器页面时,我可以看到:

Resource: 54272 Memory (container 1)
Resource: 54272 Memory (container 2)

为什么以上每个指标都不相加?我在每个 spark 执行器上请求 48g,但是 YARN 显示 54g,OS 报告使用了 15gb 物理内存(顶部的 RES 列)和使用了 51g 虚拟内存(VIRT 列)。

中纱-site.xml

yarn.scheduler.minimum-allocation-mb(此值根据集群 ram 容量而变化)- RM 上每个容器请求的最小分配,以 MB 为单位。低于此的内存请求不会生效,指定的值将以最小和类似的方式分配 Max container size

yarn.scheduler.maximum-allocation-mb(此值根据集群 ram 容量而变化)- RM 上每个容器请求的最大分配,以 MB 为单位。高于此值的内存请求将不会生效,并将上限为此值

yarn.nodemanager.resource.memory-mb - 可以为容器分配的物理内存量(以 MB 为单位)。

yarn.nodemanager.vmem-pmem-ratio - 每个Map和Reduce任务的虚拟内存(物理+分页内存)上限由每个YARN Container允许的虚拟内存比例决定。这是通过下面的配置来设置的,默认值为2.1

yarn.nodemanager.resource.cpu-vcores - 此 属性 控制每个节点上容器使用的最大内核总数。

在 mapred-site.xml

mapreduce.map.memory.mb - 每个地图任务将使用的最大内存。

mapreduce.reduce.memory.mb - 每个 reduce 任务将使用的最大内存。

mapreduce.map.java.opts - 映射任务的 JVM 堆大小。

mapreduce.reduce.java.opts - 映射任务的 JVM 堆大小。

Spark 设置

--executor-memory/spark.executor.memory 控制执行程序堆大小,但 JVM 也可以使用一些堆外内存,例如用于内部字符串和直接字节缓冲区。 spark.yarn.executor.memoryOverhead 属性 的值被添加到执行器内存中,以确定每个执行器对 YARN 的完整内存请求。它默认为 max(384, .07 * spark.executor.memory)

--num-executors 命令行标志或 spark.executor.instances 配置 属性 控制请求的执行程序数量

那么你能为上面提到的所有这些参数指定值吗?这将有助于计算您的情况下的内存分配。