全部產品
Search
文件中心

MaxCompute:資源申請問題

更新時間:Mar 13, 2026

本文介紹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。