如何让AWS EMR上的Spark驱动独占主机并最大化spark.driver.memory
解决方案
前置确认
首先确保你使用的是--deploy-mode cluster提交Spark任务:client模式下driver运行在任务提交节点,不存在和EMR集群内executor共享主机的问题,只有cluster模式下driver作为YARN Application Master调度在集群节点上,才会出现共置问题。
实现driver独占主机的方案(无需手动调整内存数值适配机型)
方案1:YARN节点标签(生产环境最优,长期稳定)
该方案完全不需要适配主机机型,通过资源隔离规则实现driver节点独占:
- 在EMR控制台为一组专属节点打上
driver-only的YARN节点标签,配置该标签对应的节点仅允许分配Application Master资源,不允许分配普通executor资源 - 提交任务时添加以下Spark配置:
spark.yarn.am.nodeLabelExpression=driver-only spark.yarn.executor.nodeLabelExpression=
- 如使用指定队列提交,额外在YARN配置中给对应队列开放
driver-only标签的访问权限即可
方案2:动态分配driver占满节点全部可用资源(无需修改集群配置,仅改提交参数)
Spark原生不支持将spark.driver.memory设为0或自动识别节点内存,你可以通过提交时的动态参数计算实现,不需要提前知道主机机型:
- 提交任务前通过YARN内置命令直接获取集群节点的最大可分配资源,计算得到driver可占用的最大内存(默认减去1G作为系统预留即可)
- 提交时将计算得到的数值传入配置即可,示例提交脚本如下,可自动适配任意机型:
NODE_MAX_MEM=$(yarn getconf YARN_MAXIMUM_ALLOCATION_MB) # 预留1G内存给节点系统进程 DRIVER_MEM=$((NODE_MAX_MEM - 1024)) NODE_VCORES=$(yarn getconf YARN_MAXIMUM_ALLOCATION_VCORES) spark-submit \ --deploy-mode cluster \ --conf spark.driver.memory=${DRIVER_MEM}m \ --conf spark.driver.cores=${NODE_VCORES} \ --conf spark.driver.memoryOverhead=1024 \ # 其余你的应用配置、入口文件参数
该配置会让driver申请的资源刚好占满节点的全部可分配资源,剩余资源不足以启动任何executor,自然不会有executor调度到driver所在节点。
常见问题说明
- 直接设置
spark.driver.memory=0不生效是Spark原生限制,该配置必须传入正整数+内存单位(如16g、512m)的格式,不支持0值 - 如果使用Spark 3.2及以上版本,可搭配
spark.driver.resources.required配置进一步绑定节点的全部CPU、内存资源,实现更严格的独占
内容的提问来源于stack exchange,提问作者nit
相关产品推荐
相关产品推荐

