什麼是自動調度資源
估算工作負載「合適」的叢集工作站 (節點) 數量並不容易,而且整個管道的單一叢集大小通常並不理想。使用者啟動的叢集資源調度部分解決了這項挑戰,但需要監控叢集使用率和手動介入。
Managed Service for Apache Spark AutoscalingPolicies API 可自動管理叢集資源,並自動調度叢集 worker VM 資源。Autoscaling Policy 是可重複使用的設定,說明採用自動調度資源政策的叢集 worker 應如何調度資源,並定義資源調度邊界、頻率和積極程度,讓您在整個叢集生命週期精細控管叢集資源。
自動調度資源的使用時機
使用自動調度資源:
,適用於在外部服務 (例如 Cloud Storage 或 BigQuery) 中儲存資料的叢集
處理大量工作的叢集
,以調度單一工作叢集的資源
,並為 Spark 批次工作啟用強化版彈性模式
不建議搭配/用於下列項目:
HDFS:自動調度資源功能不適用於調度叢集內 HDFS 的資源,原因如下:
- HDFS 使用率並非自動調度資源信號。
- HDFS 資料只會託管在主要工作站。主要工作站的數量必須足以託管所有 HDFS 資料。
- 停用 HDFS DataNodes 可能會延遲移除工作人員的時間。DataNodes 會先將 HDFS 區塊複製到其他 DataNodes,再移除工作人員。視資料大小和複寫因數而定,這個程序可能需要數小時。
YARN 節點標籤:自動調度資源功能不支援 YARN 節點標籤,也不支援
dataproc:am.primary_only屬性,因為 YARN-9088。使用節點標籤時,YARN 會錯誤回報叢集指標。Spark 結構化串流:自動調度資源功能不支援 Spark 結構化串流 (請參閱「自動調度資源和 Spark 結構化串流」)。
閒置叢集:如果叢集處於閒置狀態,不建議使用自動調度資源功能將叢集縮減至最小大小。由於建立新叢集的速度與調整叢集大小一樣快,建議您刪除閒置叢集並重新建立。下列工具支援這項「暫時性」模型:
使用 Managed Service for Apache Spark Workflows,在專屬叢集上排定一組工作,然後在工作完成時刪除叢集。如要進行更進階的自動化調度管理,請使用以 Apache Airflow 為基礎的 Cloud Composer。
對於處理臨時查詢或外部排定工作負載的叢集,請使用叢集排定刪除功能,在指定的閒置期或時間長度過後,或在特定時間刪除叢集。
不同大小的工作負載:如果叢集上同時執行小型和大型工作,系統會等待大型工作完成,再進行正常終止縮減作業。因此,如果叢集上執行時間較長的工作尚未完成,系統會延遲小型工作的資源自動調度作業。為避免這種情況,請將大小相近的小型工作歸類到同一個叢集,並將每個執行時間較長的工作隔離到個別叢集。
啟用自動調度資源
如要在叢集上啟用自動調度資源功能,請按照下列步驟操作:
請採取下列任一項做法:
建立自動調度資源政策
gcloud CLI
您可以使用 gcloud dataproc autoscaling-policies import 指令建立自動調度資源政策。這項指令會讀取定義自動調度資源政策的本機 YAML 檔案。檔案的格式和內容應符合 autoscalingPolicies REST API 定義的設定物件和欄位。
下列 YAML 範例定義了 Managed Service for Apache Spark 標準叢集的政策,其中包含所有必要欄位。此外,範例也提供主要工作站的 minInstances 和 maxInstances 值、次要 (先占) 工作站的 maxInstances 值,並指定 4 分鐘的 cooldownPeriod (預設為 2 分鐘)。workerConfig 會設定主要工作站。在本範例中,minInstances 和 maxInstances 設為相同值,避免調整主要工作站大小。
workerConfig:
minInstances: 10
maxInstances: 10
secondaryWorkerConfig:
maxInstances: 50
basicAlgorithm:
cooldownPeriod: 4m
yarnConfig:
scaleUpFactor: 0.05
scaleDownFactor: 1.0
gracefulDecommissionTimeout: 1h
以下 YAML 範例定義 Managed Service for Apache Spark 標準叢集的政策,其中包含所有必要和選用的自動調度資源政策欄位。
clusterType: STANDARD
workerConfig:
minInstances: 10
maxInstances: 10
weight: 1
secondaryWorkerConfig:
minInstances: 0
maxInstances: 100
weight: 1
basicAlgorithm:
cooldownPeriod: 2m
yarnConfig:
scaleUpFactor: 0.05
scaleDownFactor: 1.0
scaleUpMinWorkerFraction: 0.0
scaleDownMinWorkerFraction: 0.0
gracefulDecommissionTimeout: 1h
以下 YAML 範例定義了零規模叢集的政策。
如果是零規模叢集,請勿加入workerConfig。
clusterType: ZERO_SCALE
secondaryWorkerConfig:
minInstances: 0
maxInstances: 100
weight: 1
basicAlgorithm:
cooldownPeriod: 2m
yarnConfig:
scaleUpFactor: 0.05
scaleDownFactor: 1.0
scaleUpMinWorkerFraction: 0.0
scaleDownMinWorkerFraction: 0.0
gracefulDecommissionTimeout: 1h
從本機終端機或 Cloud Shell 執行下列 gcloud 指令,建立自動調度資源政策。為政策提供名稱。這個名稱會成為政策 id,您可以在後續的 gcloud 指令中使用這個名稱參照政策。使用 --source 標記指定要匯入的自動調度資源政策 YAML 檔案的本機路徑和檔案名稱。
gcloud dataproc autoscaling-policies import policy-name \ --source=filepath/filename.yaml \ --region=region
REST API
建立自動調度資源政策,方法是在 autoscalingPolicies.create 要求中定義 AutoscalingPolicy。
控制台
如要建立自動調度資源政策,請使用 Google Cloud 控制台,從 Managed Service for Apache Spark 的「Autoscaling policies」(自動調度資源政策) 頁面選取「CREATE POLICY」(建立政策)。在「建立政策」頁面,您可以選取政策建議面板,為特定工作類型或調度目標填入自動調度資源政策欄位。
建立自動調度資源叢集
建立自動調度資源政策後,請建立將使用該政策的叢集。叢集必須與自動調度資源政策位於相同區域。
gcloud CLI
從本機終端機或 Cloud Shell 執行下列 gcloud 指令,建立自動調度資源叢集。提供叢集名稱,並使用 --autoscaling-policy 旗標指定 policy ID (您建立政策時指定的政策名稱) 或政策 resource URI (resource name) (請參閱「AutoscalingPolicy id 和 name 欄位」)。
gcloud dataproc clusters create cluster-name \ --autoscaling-policy=policy id or resource URI \ --region=region
REST API
如要建立自動調度資源叢集,請在 clusters.create 要求中加入 AutoscalingConfig。
控制台
如要將現有的自動調度資源政策套用至新叢集,請前往 Google Cloud 控制台的 Managed Service for Apache Spark「建立叢集」頁面,然後在「設定叢集」面板的「自動調度資源政策」部分選取政策。
在現有叢集上啟用自動調度資源
建立自動調度資源政策後,您可以在相同區域的現有叢集上啟用該政策。
gcloud CLI
在本機終端機或 Cloud Shell 中執行下列 gcloud 指令,在現有叢集上啟用自動調度資源政策。請提供叢集名稱,並使用 --autoscaling-policy 旗標指定 policy ID (您建立政策時指定的政策名稱) 或政策 resource URI (resource name) (請參閱「AutoscalingPolicy id 和 name 欄位」)。
gcloud dataproc clusters update cluster-name \ --autoscaling-policy=policy id or resource URI \ --region=region
REST API
如要在現有叢集上啟用自動調度資源政策,請在 updateMask 的 clusters.patch 要求中,設定政策的 AutoscalingConfig.policyUri。
控制台
Google Cloud 主控台不支援在現有叢集上啟用自動調度資源政策。
多叢集政策使用情形
自動調度資源政策定義可套用至多個叢集的調度資源行為。如果叢集會共用類似的工作負載,或執行資源用量模式類似的工作,則最適合跨多個叢集套用自動調度資源政策。
您可以更新多個叢集使用的政策。更新會立即影響使用該政策的所有叢集的自動調度資源行為 (請參閱 autoscalingPolicies.update)。如果您不希望政策更新套用至使用該政策的叢集,請先停用叢集的自動調度資源,再更新政策。
gcloud CLI
在本機終端機或 Cloud Shell 中執行下列 gcloud 指令,停用叢集的自動調整功能。
gcloud dataproc clusters update cluster-name --disable-autoscaling \ --region=region
REST API
如要停用叢集的自動調度資源功能,請將 AutoscalingConfig.policyUri 設為空字串,並在 clusters.patch 要求中設定 update_mask=config.autoscaling_config.policy_uri。
控制台
Google Cloud 主控台不支援停用叢集的自動調度資源功能。
- 無法刪除一或多個叢集使用的政策 (請參閱 autoscalingPolicies.delete)。
自動調度資源的運作方式
每經過一段「冷卻」期,自動調度資源功能就會檢查叢集的 Hadoop YARN 指標,判斷是否要調度叢集資源,以及更新幅度。
YARN 待處理資源指標 (待處理記憶體或待處理核心) 值會決定是否要擴大或縮減規模。如果值大於
0,表示 YARN 工作正在等待資源,可能需要擴大規模。如果值為0,表示 YARN 有足夠資源,因此可能不需要縮減規模或其他變更。如果待處理資源 > 0:
$estimated\_worker\_count =$
\[ \Biggl \lceil AVERAGE\ during\ cooldown\ period\Big(\frac{Pending + Available + Allocated + Reserved}{Resource\ per\ worker}\Big)\Biggr \rceil \]
如果待處理的資源為 0:
$estimated\_worker\_count =$
\[ \Biggl \lceil AVERAGE\ during\ cooldown\ period\Big(\frac{Allocated + Reserved}{Resource\ per\ worker}\Big)\Biggr \rceil \]
根據預設,從 Managed Service for Apache Spark 映像檔 2.2 開始,自動調度程式會監控 YARN 記憶體和 YARN 核心,以便分別評估記憶體和核心的
estimated_worker_count,並選取較大的工作站數量。如果是先前的映像檔版本,自動調度程式只會監控 YARN 記憶體,除非您啟用以核心為準的自動調度資源。$estimated\_worker\_count =$
\[ max(estimated\_worker\_count\_by\_memory,\ estimated\_worker\_count\_by\_cores) \]
\[ estimated\ \Delta worker = estimated\_worker\_count - current\_worker\_count \]
根據工作站數量預估變更需求,自動調度資源會使用
scaleUpFactor或scaleDownFactor計算工作站數量的實際變更:if estimated Δworkers > 0: actual Δworkers = ROUND_UP(estimated Δworkers * scaleUpFactor) # examples: # ROUND_UP(estimated Δworkers=5 * scaleUpFactor=0.5) = 3 # ROUND_UP(estimated Δworkers=0.8 * scaleUpFactor=0.5) = 1 else: actual Δworkers = ROUND_DOWN(estimated Δworkers * scaleDownFactor) # examples: # ROUND_DOWN(estimated Δworkers=-5 * scaleDownFactor=0.5) = -2 # ROUND_DOWN(estimated Δworkers=-0.8 * scaleDownFactor=0.5) = 0 # ROUND_DOWN(estimated Δworkers=-1.5 * scaleDownFactor=0.5) = 0
如果 scaleUpFactor 或 scaleDownFactor 為 1.0,表示自動調度資源會進行調度,使待處理或可用資源為 0 (充分利用)。
計算完工作人員數量變更後,
scaleUpMinWorkerFraction和scaleDownMinWorkerFraction會做為門檻,判斷自動調度資源功能是否要調度叢集資源。如果分數很小,表示即使Δworkers很小,自動調度資源功能也應調度資源。如果分數很大,表示只有在Δworkers很大時,才應調度資源。 或IF (Δworkers > scaleUpMinWorkerFraction * current_worker_count) then scale up
IF (abs(Δworkers) > scaleDownMinWorkerFraction * current_worker_count), THEN scale down.
如果需要調度的 worker 執行個體數量夠多,可觸發資源調度作業,自動調度資源功能會使用
workerConfig和secondaryWorkerConfig的minInstancesmaxInstances範圍,以及weight(主要和次要 worker 執行個體的比率),判斷如何在主要和次要 worker 執行個體群組之間分配 worker 執行個體數量。這些計算的結果就是叢集在資源調度期間的最終自動調度資源變更。如果使用映像檔版本 2.0.57 以上、2.1.5 以上和更新版本建立叢集,且符合下列條件,系統會取消自動調度資源縮減要求:
- 正在進行縮減作業,且安全停用逾時值不為零,以及
有效 YARN 工作站 (「有效工作站」) 數量加上自動調度程式建議的總工作站數量變化 (
Δworkers),等於或大於DECOMMISSIONING個 YARN 工作站 (「停用工作站」),如下列公式所示:IF (active workers + Δworkers ≥ active workers + decommissioning workers) THEN cancel the scaledown operation
如需取消縮減資源作業的範例,請參閱「自動調度資源何時會取消縮減資源作業?」一文。
自動調度資源設定建議
本節提供自動調度資源設定建議。
避免調度主要工作站的資源
主要工作站會執行 HDFS Datanode,次要工作站則僅負責運算。
使用次要工作站可有效擴充運算資源,不必佈建儲存空間,因此擴充功能的速度更快。HDFS Namenode 可能有多個競爭條件,導致 HDFS 損毀,因此停用作業會無限期停滯。如要避免這個問題,請不要調度主要工作站的資源。例如:none
workerConfig:
minInstances: 10
maxInstances: 10
secondaryWorkerConfig:
minInstances: 0
maxInstances: 100
您需要對叢集建立指令進行幾項修改:
- 將
--num-workers=10設為與自動調度資源政策的主要 worker 群組大小相符。 - 設定
--secondary-worker-type=non-preemptible,將次要 worker 設為非先占型。(除非您需要先占 VM)。 - 將主要 worker 的硬體設定複製到次要 worker。舉例來說,請將
--secondary-worker-boot-disk-size=1000GB設為與--worker-boot-disk-size=1000GB相符。
使用強化版彈性模式處理 Spark 批次工作
搭配自動調度資源使用強化版彈性模式 (EFM),可達到下列目的:
在工作執行期間加快叢集縮減速度
避免叢集縮減規模導致執行中的工作中斷
盡量減少因先占次要 worker 先占而導致執行中的作業中斷
啟用 EFM 後,自動調度資源政策的正常終止逾時必須設為 0s。自動調度資源政策只能自動調度次要 worker。
選擇安全停用程序的逾時時間
從叢集中移除節點時,自動調度資源功能支援 YARN 安全停用。安全停用機制可讓應用程式完成階段間的資料重組,避免工作進度倒退。自動調度資源政策中提供的安全停用逾時是 YARN 等待執行中應用程式 (停用開始時執行的應用程式) 的時間上限,超過這個時間就會移除節點。
如果程序未在指定的正常終止逾時期間內完成,系統會強制關閉工作節點,可能導致資料遺失或服務中斷。為避免這種情況,請將正常終止逾時時間設為大於叢集將處理的最長工作。舉例來說,如果預期最長工作會執行一小時,請將逾時時間設為至少一小時 (1h)。
如果作業時間超過 1 小時,請考慮將作業遷移至專屬的暫時性叢集,以免阻礙安全停用。
設定 scaleUpFactor
scaleUpFactor 可控制自動配置器擴大叢集的積極程度。請指定介於 0.0 和 1.0 之間的數字,設定導致節點新增的 YARN 待處理資源分數值。
舉例來說,如果有 100 個待處理的容器,每個容器要求 512MB,則待處理的 YARN 記憶體為 50GB。如果 scaleUpFactor 為 0.5,自動配置器會新增足夠的節點,以新增 25GB 的 YARN 記憶體。同樣地,如果為 0.1,自動配置器會新增足夠的節點,以新增 5GB。請注意,這些值對應的是 YARN 記憶體,而非 VM 上實際可用的總記憶體。
建議您先從啟用動態分配的 MapReduce 工作和 Spark 工作著手。0.05如果是執行器數量固定的 Spark 工作和 Tez 工作,請使用 1.0。如果 scaleUpFactor 為 1.0,表示自動調度資源機制會調度資源,使待處理或可用的資源為 0 (完美利用率)。
設定 scaleDownFactor
scaleDownFactor 可控制自動配置器縮減叢集資源的積極程度。請指定介於 0.0 和 1.0 之間的數字,設定導致節點移除的 YARN 可用資源分數值。
對於需要頻繁擴充及縮減資源的多工作叢集,請將這個值設為 1.0。由於安全停用機制,縮減資源作業的速度遠慢於擴充資源作業。設定 scaleDownFactor=1.0 會設定積極的縮減資源率,盡量減少達到適當叢集大小所需的縮減資源作業次數。
如要提高叢集的穩定性,請調低 scaleDownFactor,以減緩縮減速度。
將此值設為 0.0,即可防止叢集縮減,例如使用暫時性或單一工作叢集時。
設定 scaleUpMinWorkerFraction 和 scaleDownMinWorkerFraction
scaleUpMinWorkerFraction 和 scaleDownMinWorkerFraction 會與 scaleUpFactor 或 scaleDownFactor 搭配使用,預設值為 0.0。這些值代表自動調度器擴充或縮減叢集的門檻:發出擴充或縮減要求時,叢集大小必須增加或減少的最小分數值。
舉例來說,如果 scaleUpMinWorkerFraction 小於或等於 0.05 (5%),自動配置器就不會發出更新要求,在 100 個節點的叢集中新增 5 個工作站。如果設為 0.1,自動配置器就不會發出要求,擴充叢集資源。同樣地,如果 scaleDownMinWorkerFraction 為 0.05,自動配置器就不會移除節點,除非至少要移除 5 個節點。
0.0 的預設值表示沒有門檻。
強烈建議在大型叢集 (超過 100 個節點) 上設定較高的 scaleDownMinWorkerFractionthresholds,以免發生不必要的小型擴充作業。
選擇冷卻時間
cooldownPeriod 會設定時間範圍,自動調度資源功能不會在這段期間發出變更叢集大小的要求。您可以使用這項功能,限制自動調度資源功能變更叢集大小的頻率。
最短時間和預設時間cooldownPeriod為兩分鐘。如果在政策中設定較短的 cooldownPeriod,工作負載變化會更快影響叢集大小,但叢集可能會不必要地擴大和縮減。建議您在使用較短的 cooldownPeriod 時,將政策的 scaleUpMinWorkerFraction 和 scaleDownMinWorkerFraction 設為非零值。這可確保只有在資源用量變化足以更新叢集時,叢集才會擴大或縮小。
如果工作負載對叢集大小的變化很敏感,可以增加冷卻期。舉例來說,如果您正在執行批次處理作業,可以將冷卻期設為 10 分鐘以上。嘗試不同的冷卻時間,找出最適合工作負載的值。
工作站數量界限和群組權重
每個工作站群組都有 minInstances 和 maxInstances,可設定每個群組的大小上限。
每個群組也有一個名為 weight 的參數,可設定兩個群組之間的目標平衡。請注意,這個參數只是提示,如果群組達到大小下限或上限,系統只會從另一個群組新增或移除節點。因此,weight 幾乎一律可以保留預設值 1。
使用以核心為準的自動調度資源功能
對於 CPU 密集型應用程式,最佳做法是使用主導資源計算機分配資源。從 Managed Service for Apache Spark 映像檔 2.2 版開始,這就是預設的 YARN 設定。使用較舊的映像檔版本時,除非您在建立叢集時設定下列屬性,將 YARN 設為使用 Dominant Resource Calculator,否則 Managed Service for Apache Spark 會將 YARN 設為使用記憶體指標分配資源:
capacity-scheduler:yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
自動調度資源指標和記錄檔
下列資源和工具可協助您監控自動調度資源作業,以及這些作業對叢集和作業的影響。
Cloud Monitoring
使用 Cloud Monitoring 執行下列操作:
- 查看自動調度資源使用的指標
- 查看叢集中的節點管理員數量
- 瞭解自動調度資源功能是否調度叢集資源,以及調度或未調度的原因

Cloud Logging
使用 Cloud Logging 查看 Managed Service for Apache Spark 自動調整程式的記錄。
1) 找出叢集的記錄檔。

2) 選取「dataproc.googleapis.com/autoscaler」。

3) 展開記錄訊息,查看 status 欄位。記錄採用機器可讀的 JSON 格式。

4) 展開記錄訊息,查看資源調度建議、用於資源調度決策的指標、原始叢集大小,以及新的目標叢集大小。

背景:使用 Apache Hadoop 和 Apache Spark 自動調度資源
以下各節將說明自動調度資源功能如何 (或無法) 與 Hadoop YARN 和 Hadoop MapReduce,以及 Apache Spark、Spark Streaming 和 Spark Structured Streaming 互通。
Hadoop YARN 指標
自動調度資源功能主要依據下列 Hadoop YARN 指標:
Allocated resource是指整個叢集中執行容器所佔用的 YARN 資源總量。如果有 6 個執行中的容器最多可使用 1 個資源單位,則會分配 6 個資源。Available resource是叢集中未由已分配的容器使用的 YARN 資源。如果所有節點管理員共有 10 個資源單元,且已分配 6 個,則有 4 個可用資源。如果叢集中有可用 (未使用) 的資源,自動調度資源功能可能會從叢集中移除工作站。Pending resource是待處理容器的 YARN 資源要求總和。待處理的容器正在等待 YARN 中的空間執行。只有在可用資源為零或太小,無法分配給下一個容器時,待處理資源才會大於零。如有待處理的容器,自動調度資源功能可能會在叢集中新增 worker。
您可以在 Cloud Monitoring 中查看這些指標。根據預設,YARN 記憶體為叢集總記憶體的 0.8 倍,其餘記憶體則保留給其他精靈和作業系統使用,例如頁面快取。您可以使用「yarn.nodemanager.resource.memory-mb」YARN 設定覆寫預設值 (請參閱「Apache Hadoop YARN、HDFS、Spark 和相關屬性」)。
自動調度與 Hadoop MapReduce
MapReduce 會將每個對應和縮減工作做為個別的 YARN 容器執行。工作開始時,MapReduce 會為每個對應工作提交容器要求,導致待處理的 YARN 記憶體大幅增加。隨著地圖工作完成,待處理的記憶體會減少。
當 mapreduce.job.reduce.slowstart.completedmaps 完成 (預設為 Managed Service for Apache Spark 的 95%) 時,MapReduce 會將所有縮減器排入容器要求佇列,導致待處理記憶體再次飆升。
除非對應和縮減工作需要數分鐘以上的時間,否則請勿為自動調度資源設定高值 scaleUpFactor。將工作站新增至叢集至少需要 1.5 分鐘,因此請確保有足夠的待處理工作,讓新工作站運作幾分鐘。建議先將 scaleUpFactor 設為待處理記憶體的 0.05 (5%) 或 0.1 (10%)。
自動調度資源和 Spark
Spark 會在 YARN 基礎上新增額外的排程層。具體來說,Spark Core 的動態分配功能會向 YARN 要求容器來執行 Spark 執行器,然後在這些執行器的執行緒上排程 Spark 工作。Managed Service for Apache Spark 叢集預設會啟用動態分配功能,因此系統會視需要新增及移除執行器。
Spark 一律會向 YARN 要求容器,但如果沒有動態分配功能,Spark 只會在工作開始時要求容器。動態分配功能會視需要移除容器或要求新容器。
Spark 會從少量執行器開始 (自動調度資源叢集為 2 個),並在有待處理工作時持續將執行器數量加倍。這樣可減少待處理記憶體用量遽增的情況。建議您將 Spark 工作的自動調度資源 scaleUpFactor 設為較大的數字,例如 1.0 (100%)。
停用 Spark 動態分配
如果您執行的 Spark 工作彼此獨立,且無法從 Spark 動態分配功能獲益,可以設定 spark.dynamicAllocation.enabled=false 和 spark.executor.instances,停用 Spark 動態分配功能。您仍可使用自動調度資源功能,在獨立的 Spark 工作執行期間,視需要調度叢集資源。
使用快取資料的 Spark 工作
不再需要資料集時,請設定 spark.dynamicAllocation.cachedExecutorIdleTimeout 或取消快取資料集。根據預設,Spark 不會移除已快取資料的執行器,這會導致叢集無法縮減規模。
自動調度資源和 Spark 串流
由於 Spark Streaming 有自己的動態分配版本,會使用串流專屬信號新增及移除執行器,因此請設定
spark.streaming.dynamicAllocation.enabled=true,並將spark.dynamicAllocation.enabled=false設為停用 Spark Core 的動態分配功能。請勿搭配 Spark Streaming 工作使用安全停用程序 (自動調度資源
gracefulDecommissionTimeout)。如要透過自動調度資源安全移除工作站,請設定檢查點,確保容錯能力。
如要使用 Spark Streaming,但不自動調度資源,請採取下列做法:
- 停用 Spark Core 的動態分配 (
spark.dynamicAllocation.enabled=false),然後 - 為工作設定執行者數量 (
spark.executor.instances)。請參閱叢集屬性。
自動調度資源和 Spark 結構化串流
自動調度資源功能與 Spark Structured Streaming 不相容,因為 Spark Structured Streaming 不支援動態分配 (請參閱「SPARK-24815:Structured Streaming 應支援動態分配」)。
透過分割和並行控制自動調度資源
平行處理通常是由叢集資源設定或決定 (例如,HDFS 區塊數量會控管工作數量),但自動調度資源則相反:自動調度資源會根據工作平行處理設定工作站數量。以下是設定工作平行處理的指南:
- Managed Service for Apache Spark 會根據叢集的初始大小,設定 MapReduce 減少工作的預設數量,但您可以設定
mapreduce.job.reduces來提高減少階段的平行處理。 - Spark SQL 和 DataFrame 的平行處理程序是由
spark.sql.shuffle.partitions決定,預設值為 200。 - Spark 的 RDD 函式預設為
spark.default.parallelism,會在工作啟動時設為工作站節點上的核心數量。不過,所有會建立重組的 RDD 函式都會採用分區數量的參數,這會覆寫spark.default.parallelism。
請確保資料平均分割。如果索引鍵嚴重傾斜,一或多個工作可能會比其他工作耗費更多時間,導致使用率偏低。
自動調度預設 Spark 和 Hadoop 資源的屬性設定
自動調度資源叢集具有預設叢集屬性值,可避免在移除主要工作站或先占次要工作站時發生工作失敗。建立啟用自動調度資源功能的叢集時,您可以覆寫這些預設值 (請參閱「叢集屬性」)。
預設會增加工作、應用程式主控台和階段的重試次數上限:
yarn:yarn.resourcemanager.am.max-attempts=10 mapred:mapreduce.map.maxattempts=10 mapred:mapreduce.reduce.maxattempts=10 spark:spark.task.maxFailures=10 spark:spark.stage.maxConsecutiveAttempts=10
預設為重設重試計數器 (適用於長時間執行的 Spark 串流工作):
spark:spark.yarn.am.attemptFailuresValidityInterval=1h spark:spark.yarn.executor.failuresValidityInterval=1h
預設讓 Spark 的緩慢啟動動態分配機制從小規模開始:
spark:spark.executor.instances=2
常見問題
本節包含自動調度資源常見問題與解答。
高可用性叢集和單一節點叢集可以啟用自動調度資源功能嗎?
自動調度資源功能可在高可用性叢集上啟用,但單一節點叢集不支援這項功能 (單一節點叢集不支援調整大小)。
可以手動調整自動調度叢集的大小嗎?
可以。調整自動調度資源政策時,您可能會決定手動調整叢集大小,做為暫時的應急措施。不過,這些變更只會暫時生效,自動調度資源最終會縮減叢集。
建議您不要手動調整自動調度叢集的大小,而是採取下列做法:
更新自動調度資源政策。對自動調度資源政策所做的任何變更,都會影響目前使用該政策的所有叢集 (請參閱「多叢集政策使用情況」)。
卸離政策,並手動將叢集調整為偏好大小。
取得 Managed Service for Apache Spark 支援。
Managed Service for Apache Spark 與 Dataflow 自動調度資源有何不同?
請參閱 Dataflow 水平自動調度資源和 Dataflow Prime 垂直自動調度資源。
Managed Service for Apache Spark 開發團隊是否能將叢集狀態從 ERROR 重設為 RUNNING?
一般來說,不行。這麼做需要手動驗證重設叢集狀態是否安全,而且通常需要其他手動步驟 (例如重新啟動 HDFS NameNode),才能重設叢集。
如果作業失敗,Managed Service for Apache Spark 無法判斷叢集狀態,就會將叢集狀態設為 ERROR。ERROR 中的叢集不會自動調度資源。常見原因包括:
Compute Engine API 傳回的錯誤,通常是在 Compute Engine 服務中斷期間。
HDFS 停用作業中的錯誤導致 HDFS 進入損毀狀態。
Managed Service for Apache Spark Control API 錯誤,例如「Task lease expired」。
刪除並重新建立狀態為 ERROR 的叢集。
自動調度資源功能何時會取消縮減資源作業?
下圖說明自動調度功能何時會取消縮減作業 (另請參閱「自動調度功能運作方式」)。

注意:
- 叢集已啟用自動調度資源功能,且只根據 YARN 記憶體指標 (預設值) 調整資源。
- T1 到 T9 代表自動調度器評估工作站數量時的冷卻間隔 (事件時間已簡化)。
- 堆疊長條代表有效、停用中和已停用叢集 YARN 工作站的計數。
- 自動調度器建議的工作站數量 (黑線) 是根據 YARN 記憶體指標、YARN 作用中工作站數量和自動調度資源政策設定 (請參閱「自動調度資源的運作方式」) 計算得出。
- 紅色背景區域表示縮減作業的執行期間。
- 黃色背景區域表示取消縮減資源作業的期間。
- 綠色背景區域表示擴大作業的期間。
下列作業會在指定時間執行:
T1:自動調度器啟動安全停用縮減作業,將目前叢集工作站數量縮減約一半。
T2:自動調度器會持續監控叢集指標,不會變更縮減建議,縮減作業也會繼續進行。部分工作站已停用,其他工作站也正在停用 (Managed Service for Apache Spark 會刪除停用的工作站)。
T3:自動調度器計算出工作站數量可進一步縮減,可能是因為有額外的 YARN 記憶體可用。不過,由於有效工作站數量加上建議的工作站數量變更,並未等於或大於有效工作站數量加上停用工作站數量,因此不符合取消縮減作業的條件,自動調度器不會取消縮減作業。
T4:YARN 報告待處理記憶體增加。不過,自動配置器不會變更工作站數量建議。與 T3 相同,縮減取消條件仍未達成,因此自動調整程式不會取消縮減作業。
T5:YARN 待處理記憶體增加,且自動調度器建議的工作站數量變化增加。不過,由於有效工作站數量加上建議的工作站數量變更,仍少於有效工作站數量加上停用工作站數量,因此取消條件仍未達成,縮減作業不會取消。
T6:YARN 待處理記憶體進一步增加。運作中的工作站數量加上自動調度器建議的工作站數量變化,現在大於運作中加上停用中的工作站數量。符合取消條件,自動配置器取消縮減作業。
T7:自動配置器正在等待取消縮減作業完成。在這段間隔期間,自動配置器不會評估及建議變更工作站數量。
T8:縮減資源作業取消完成。停用工作站會新增至叢集並啟用。自動調度器會偵測到取消縮減作業已完成,並等待下一個評估週期 (T9) 計算建議的工作站數量。
T9:T9 時間沒有任何進行中的作業。自動調度器會根據自動調度器政策和 YARN 指標,建議執行向上擴充作業。