资源申请问题
本文介绍MaxCompute Spark作业中资源申请的相关参数、合理设置方法以及资源等待问题的排查方案。
资源参数说明
提交Spark作业时需要关注以下几种资源:
Executor数量
Executor内存
Executor Core
Driver内存
Driver Core
本地网盘
Executor相关参数
spark.executor.instances:总共申请的Executor数目。普通任务十几个或几十个足够,处理大量数据时可以申请100~2000+。
spark.executor.cores:每个Executor的核数,即每个Executor中可同时运行的Task数目。
Spark任务的最大并行度 = Executor数目 × Executor Core数。
spark.executor.memory:Executor的堆内内存,即启动JVM进程时设置的
-Xmx参数。spark.executor.memoryOverhead:Executor的堆外内存,默认单位为MB,主要用于JVM自身、字符串、NIO Buffer等开销。
默认值为
executor.memory × 0.1,最小384 MB。如果遇到
Cannot allocate memory错误,通常是堆外内存不足,可适当增大spark.executor.memoryOverhead。单个Executor的内存总量 =spark.executor.memory+spark.executor.memoryOverhead。
Driver相关参数
spark.driver.cores:Driver的核数。spark.driver.memory:Driver的堆内内存。spark.driver.memoryOverhead:Driver的堆外内存。spark.driver.maxResultSize:默认1 GB,控制Worker送回Driver的数据大小,超出该限制时Driver会终止执行。
本地网盘参数
spark.hadoop.odps.cupid.disk.driver.device_size:本地网盘大小,默认值为20 GB。该参数必须配置在
spark-defaults.conf文件或DataWorks的配置项中,不能配置在代码中。Spark使用网盘作为本地存储,Driver和每个Executor各有一个,Shuffle数据以及BlockManager溢出的数据均存储在网盘上。
当出现
No space left on device错误时,可适当调大该值,最大支持100 GB。如果调整到100 GB仍然出现此错误,需要分析具体原因:数据倾斜,在Shuffle或Cache过程中数据集中分布在某些Block
缩小单个Executor的并发(
spark.executor.cores)增加Executor的数量(
spark.executor.instances)
合理设置资源参数
建议按照内存/CPU 1:4来申请资源,即1 Core对应4 GB内存,建议单个Worker的Core数不要超过8。
通过查看LogView中Master或Worker的Sensor获取运行时的内存和CPU使用情况。

通常需要关注
mem_rss,该指标代表Executor或Driver实际使用的内存变化曲线,可以根据该值判断是否需要增加或减少内存。
资源等待
不要在代码中设置spark.master,本地模式调试之后需要去掉代码中的spark.master=local配置项。
等待资源申请到后提交Job
申请资源是一个持续不断的过程,可能会出现拿到的资源没有达到请求数量的情况。Spark不会等到所有Executor都获取到之后再开始执行任务,可以通过以下参数来控制Spark提交任务的时机:
spark.scheduler.maxRegisteredResourcesWaitingTime:在执行前最大等待申请资源的时间,默认30秒。spark.scheduler.minRegisteredResourcesRatio:实际注册的资源数占预期需要的资源数的比例,默认0.8。
申请不到资源的可能原因
如果是预付费用户,一般是申请的资源超出了购买的资源数量。
如果是后付费用户,需要抢占资源。
申请不到资源的解决方案
调整任务资源:调整Executor总数或者单个Executor的资源数量(一般是内存)。
合理安排任务执行时间。
未申请到资源的典型现象
在Driver端会打印以下日志:
WARN YarnClusterScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources在LogView中只能看到Driver,Worker数量为0。
在Spark UI中只能看到Driver,Worker数量为0。