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 配置 属性 控制请求的执行程序数量
那么你能为上面提到的所有这些参数指定值吗?这将有助于计算您的情况下的内存分配。
我很难理解内存管理如何与 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 配置 属性 控制请求的执行程序数量
那么你能为上面提到的所有这些参数指定值吗?这将有助于计算您的情况下的内存分配。