AWS EMR YARN无法分配全部请求的Executor问题咨询
环境配置
- 主节点:4核,8GiB内存
- 核心节点(共2台):每台16核,64GiB内存
预期目标
计划启动6个Executor,每个分配5核、18GiB内存,每台核心节点部署3个Executor(占用15核),预留1核给YARN管理器,充分利用2台核心节点总计32核中的30核资源。
当前配置
Spark应用代码配置
val spark = SparkSession.builder .appName("Lab2") .config("spark.sql.files.ignoreCorruptFiles", "true") .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") .config("spark.kyro.registrationRequired", "false") .getOrCreate()
spark-submit提交参数
--num-executors 6 --executor-cores 5 --executor-memory 18g --conf spark.dynamicAllocation.enabled=false
已尝试的YARN配置
yarn.scheduler.capacity.resource-calculator: org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
问题现象
YARN日志显示YarnAllocator请求6个Executor,但仅成功分配4个,每台核心节点仅部署2个Executor,实际仅用到20核,无法达到预期的30核利用率。
核心原因:内存资源超限+节点资源配置限制
你遇到的问题本质是单节点内存不足以支撑3个18GiB的Executor容器,或是YARN节点的资源预留配置限制了容器分配数量。
1. 内存资源核算
每台核心节点总内存64GiB,YARN默认仅开放物理内存的80%左右作为可分配资源(约51.2GiB),而3个18GiB的Executor总内存需求为54GiB,已经超过节点可用内存上限,因此YARN只能分配2个Executor(总内存36GiB),剩余内存无法启动第3个容器。
2. 分步解决方案
步骤1:调整Executor内存适配节点可用资源
将每个Executor的内存下调至16GiB,3个Executor总内存为48GiB,低于51.2GiB的节点可用内存上限:
--executor-memory 16g
若要更精准,先通过YARN配置yarn.nodemanager.resource.memory-mb确认节点实际可分配内存,再按(节点可分配内存 - 2~4GiB预留内存)/3计算单Executor内存(预留内存用于节点系统进程)。
步骤2:配置YARN节点CPU可用核心数
修改YARN配置yarn.nodemanager.resource.cpu-vcores为15,明确预留1核给YARN管理器:
yarn.nodemanager.resource.cpu-vcores=15
若该值默认低于15,会直接限制单节点无法分配3个5核的Executor。
步骤3:检查YARN队列资源配额
确认应用所在队列的Capacity/Fair调度器配置,确保队列的capacity或max-capacity允许分配6个Executor的总资源(30核、约90GiB内存),避免队列配额不足导致资源分配受限。
步骤4:确保DominantResourceCalculator生效
该配置需写入YARN调度器配置文件(Capacity调度器为capacity-scheduler.xml,Fair调度器为fair-scheduler.xml),并重启YARN服务才能生效。它会同时计算CPU和内存资源占比,避免单一资源耗尽导致的分配限制。
验证方法
调整配置后,提交应用时可添加--conf spark.yarn.maxAppAttempts=1避免重试干扰,然后通过YARN ResourceManager UI(默认端口8088)查看节点资源使用情况和容器分配详情,确认每台节点的CPU、内存是否被充分利用。
内容的提问来源于stack exchange,提问作者William

