Spark内存超阈值报错:24g阈值含义及executor内存配置方法
Spark on YARN 内存阈值报错解答
24G阈值的具体含义
报错里的24576MB(24G)既不是主节点内存,也不是集群总内存,是YARN配置的单容器可申请的最大内存上限,取值为以下两个配置项的较小值:
yarn.nodemanager.resource.memory-mb:单个工作节点(EMR集群的CORE/TASK节点,非主节点)上,NodeManager服务可分配给YARN任务容器的总可用物理内存,数值为节点总物理内存扣除系统进程、节点上运行的EMR基础服务(HDFS DataNode、Spark Shuffle Service、NodeManager自身进程等)预留内存后的剩余值yarn.scheduler.maximum-allocation-mb:YARN调度器允许分配给单个容器的最大内存值,任何超过该值的容器资源申请都会被直接拦截拒绝
阈值为24G的原因
你使用的是AWS EMR服务,EMR会根据你选择的CORE/TASK节点实例规格,自动初始化上述两个YARN配置参数。你当前集群选用的工作节点规格,单节点分配给YARN的可用内存刚好为24G,因此两个配置默认都被设为24576MB,所有提交到YARN的单容器内存申请都不能超过这个值。
Spark executor内存计算规则
Spark on YARN模式下,单个executor向YARN申请的容器总内存计算公式为:
单executor总申请内存 = spark.executor.memory + spark.executor.memoryOverhead + spark.executor.pyspark.memory + spark.memory.offHeap.size
你当前配置的33G executor内存加8G overhead,总申请值为41G,远高于24G的单容器上限,因此任务在提交阶段就直接抛出参数校验错误,不会进入实际运行流程。
参数调整参考
你可以按照以下逻辑计算合理参数,避免同类报错:
- 若保持当前工作节点规格不变:单executor总申请内存必须≤24G。常规场景下不需要额外配置PySpark内存、堆外内存时,只需保证
spark.executor.memory与spark.executor.memoryOverhead之和不超过24G即可,其中overhead建议设为executor内存的10%左右(最低不小于384MB),例如配置executor内存21G、overhead 3G,总申请值刚好24G,符合阈值要求 - 若任务确实需要更大的单executor内存:更换更高内存规格的CORE/TASK节点即可,EMR会自动根据新的节点规格上调YARN单容器内存上限,无需手动修改配置。
内容的提问来源于stack exchange,提问作者Shubham Meshram
相关产品推荐
相关产品推荐

