Spark on YARN在Google Cloud Dataproc中Executor数量与配置不符问题
问题排查与解决方案
1. 先确认YARN集群的可用Worker节点状态
登录YARN WebUI(默认端口8088)查看Nodes列表,确认3个Worker节点是否全部处于RUNNING的健康状态,如果有1个节点处于不健康/下线状态,自然只能调度2个Executor。
2. 核对YARN NodeManager的实际资源配额
你自行计算的系统预留规则和Dataproc默认的配置规则可能存在差异,登录任意Worker节点执行以下命令查看YARN可分配的资源上限:
# 查看单节点YARN可分配内存上限,单位为MB grep yarn.nodemanager.resource.memory-mb /etc/hadoop/conf/yarn-site.xml # 查看单节点YARN可分配CPU核数上限 grep yarn.nodemanager.resource.cpu-vcores /etc/hadoop/conf/yarn-site.xml
你配置的10GB Executor内存加默认7%的内存开销,单Executor总共需要向YARN申请约10.7GB内存,如果yarn.nodemanager.resource.memory-mb的配置值低于11264MB(11GB),单Worker节点就无法容纳1个你配置的Executor,导致资源不足无法启动第3个。
对应解决方案二选一:
- 调小
spark.executor.memory为8GB,单Executor总申请约8.6GB,适配默认的YARN内存配额 - 集群创建时自定义配置项
yarn:nodemanager.resource.memory-mb为13312MB(13GB),匹配你预先计算的预留规则
3. 检查YARN队列的资源配额限制
Dataproc默认的default队列会配置最大可用资源占集群总资源的比例,若队列总可用内存仅够启动2个你配置的Executor,也会出现该问题。可在YARN WebUI的Scheduler页面查看队列资源上限,按需调整容量调度器配置提升队列可用资源占比。
4. 关闭动态资源分配的配置覆盖
Dataproc默认开启Spark动态资源分配,该特性会自动调整Executor数量,即使你配置了spark.executor.instances也可能被覆盖。添加以下配置关闭动态分配,强制使用固定数量的Executor:
.config("spark.dynamicAllocation.enabled", "false")
5. 明确Client模式的Driver资源配置
你使用client模式提交作业,若在Master节点提交作业,默认Driver会占用Master节点资源,如果未明确配置Driver参数,误将Driver调度到Worker节点的话会占用1个Worker的资源,导致无法启动第3个Executor。可添加以下配置明确Driver资源:
.config("spark.driver.memory", "2g") .config("spark.driver.cores", "1")
内容的提问来源于stack exchange,提问作者nonoDa

