Spark on YARN无法分配容器:请求资源超过最大允许分配上限问题求助
问题根因
报错本质是Spark提交任务时请求的单容器vCore数(7核)超出了AWS YARN集群调度器允许的单容器最大vCore分配上限(4核),本地环境无异常是因为本地集群的单容器资源阈值配置更高。
优化解决方案
调整Spark资源配置参数到集群阈值范围内
不需要完全移除资源配置项,只需将单容器相关参数调整到集群允许的最大值以下即可,既保证资源可控,也不会触发调度报错:spark.executor.cores设为≤4,对应executor内存spark.executor.memory设为≤12G- 如果是cluster提交模式,
spark.driver.cores同样需≤4
参考配置后的提交命令:
spark-submit \ --executor-cores 3 \ --executor-memory 6G \ --driver-cores 2 \ --driver-memory 4G \ --packages com.databricks:spark-csv_2.11:1.2.0,com.typesafe:config:1.3.2 \ --name xyz \ --class main.layer.SparkSessionTest \ "/opt/code/ReportGenerations-1.0-SNAPSHOT.jar" \ "/opt/code/ReportGeneration.properties" \ "/opt/code/log4j.properties"调整YARN集群单容器最大资源阈值
如果任务确实需要单容器占用更高的计算资源,可以修改YARN调度器配置:- 修改
yarn.scheduler.maximum-allocation-vcores为≥7,按需同步调整yarn.scheduler.maximum-allocation-mb - 若使用AWS EMR集群,需在EMR配置组中修改参数并重启集群生效,避免直接修改节点配置重启后丢失
- 修改
优化Spark并行策略拆分单容器资源需求
无需提升单容器资源上限,将原本需要单容器承载的计算负载拆分到多个小资源容器中运行:
降低单executor的core数到3-4,通过spark.executor.instances增加executor总数量,提升整体并行度,执行效率通常比单大容器更高。开启Spark动态资源分配
配置动态资源分配参数,让YARN根据任务实时计算负载自动申请/释放资源,无需手动固定资源配置:
新增配置项spark.dynamicAllocation.enabled=true,配合设置spark.dynamicAllocation.minExecutors、spark.dynamicAllocation.maxExecutors等边界参数即可,既避免资源浪费也不会超出集群资源限制。
内容的提问来源于stack exchange,提问作者R. RamkumarYugo
相关产品推荐
相关产品推荐

