我很难理解内存管理如何与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列)。
答案 0 :(得分:1)
在yarn-site.xml中
yarn.scheduler.minimum-allocation-mb(此值根据群集ram容量而变化) - RM上每个容器请求的最小分配,以MB为单位。低于此值的内存请求将不会生效,指定的值将以最小值分配,类似的最大容器大小</ p>
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配置属性控制请求的执行程序数
那么你可以指定上面提到的所有这些参数的值。在你的情况下,它将有助于计算内存分配。