资源申请问题

更新时间: 2026-03-12 17:07:24

本文介绍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使用情况。

    image

  • 通常需要关注mem_rss,该指标代表Executor或Driver实际使用的内存变化曲线,可以根据该值判断是否需要增加或减少内存。

    image

资源等待

重要

不要在代码中设置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。

上一篇: 作业运行时问题 下一篇: 引用外部文件问题
阿里云首页 云原生大数据计算服务 MaxCompute 相关技术圈