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