自動調度 Dataproc 叢集

什麼是自動調度資源功能?

要預估工作負載的「正確」叢集工作站 (節點) 數量相當困難,而整個管道使用單一叢集的做法通常不理想。使用者啟動的叢集調度功能可部分解決這個問題,但需要監控叢集使用率並手動介入。

Dataproc 的 AutoscalingPolicies API 提供自動化叢集資源管理機制,並可讓叢集工作站 VM 自動調度資源。Autoscaling Policy 是可重複使用的設定,當中說明採用自動調度資源政策的叢集 worker 應如何調度資源,並定義資源調度界限、頻率和積極程度,讓您可在整個叢集生命週期中精細控管叢集資源。

使用自動調整資源調度功能的時機

使用自動調度資源功能:

在外部服務中儲存資料的叢集,例如 Cloud StorageBigQuery

在處理多項工作的叢集中

擴充單一工作叢集

使用 Spark 批次工作專用的強化版彈性模式

以下情況不建議使用自動調度資源功能:

  • HDFS:自動調度資源不適用於叢集內 HDFS,因為:

    1. HDFS 使用率並非自動調度資源信號。
    2. HDFS 資料只會託管在主要工作站上。主要工作站的數量必須足以託管所有 HDFS 資料。
    3. 停用 HDFS DataNode 可能會延遲移除 worker。在移除 worker 之前,DataNodes 會將 HDFS 區塊複製到其他 DataNodes。視資料大小和複製因子而定,這項程序可能需要數小時才能完成。
  • YARN 節點標籤:由於 YARN-9088,自動調度資源功能不支援 YARN 節點標籤,也不支援 dataproc:am.primary_only 屬性。使用節點標籤時,YARN 會錯誤回報叢集指標。

  • Spark 結構化串流:自動調度資源不支援 Spark 結構化串流 (請參閱「自動調度資源和 Spark 結構化串流」)。

  • 閒置叢集:我們不建議在叢集閒置時,為了縮減叢集大小而使用自動調度功能。建立新叢集的速度與調整叢集大小一樣快,因此建議您刪除閒置的叢集,然後重新建立。以下工具支援這種「暫時性」模式:

    使用 Dataproc 工作流程來排定專屬叢集中的工作組合,然後在工作完成後刪除叢集。如需更進階的調度管理功能,請使用 Cloud Composer,這是以 Apache Airflow 為基礎。

    如果叢集會處理臨時查詢或外部排定的作業負載,請使用叢集排定刪除作業功能,在指定的閒置期或時間範圍過後,或在特定時間點刪除叢集。

  • 不同大小的工作負載:當叢集中執行小型和大型工作時,優雅停機縮減功能會等待大型工作完成。因此,長時間執行的工作會延遲叢集中小型工作資源的自動調度,直到長時間執行的工作完成為止。為避免發生這種情況,請在叢集中將大小相近的小型工作分組,並將每個長時間的工作區隔在不同的叢集中。

啟用自動調度資源功能

如要在叢集中啟用自動調度資源功能,請按照下列步驟操作:

  1. 建立自動調度資源政策

  2. 請採取下列任一做法:

    1. 建立自動調度資源叢集,或
    2. 在現有叢集上啟用自動調度資源

建立自動調度資源政策

gcloud CLI

您可以使用 gcloud dataproc autoscaling-policies import 指令建立自動調度資源政策。這項服務會讀取定義自動調度資源政策的本機 YAML 檔案。檔案的格式和內容應符合 autoscalingPolicies REST API 定義的設定物件和欄位。

以下 YAML 範例會定義 Dataproc 標準叢集的政策,並包含所有必要欄位。它也為主要工作站提供 minInstancesmaxInstances 值,為次要 (先占) 工作站提供 maxInstances 值,並指定 4 分鐘的 cooldownPeriod (預設為 2 分鐘)。workerConfig 會設定主要工作站。在這個範例中,minInstancesmaxInstances 都設為相同的值,以避免調整主要工作站

workerConfig:
  minInstances: 10
  maxInstances: 10
secondaryWorkerConfig:
  maxInstances: 50
basicAlgorithm:
  cooldownPeriod: 4m
  yarnConfig:
    scaleUpFactor: 0.05
    scaleDownFactor: 1.0
    gracefulDecommissionTimeout: 1h

以下 YAML 範例會為 Dataproc 標準叢集定義政策,其中包含所有必要和選用的自動調度資源政策欄位。

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

建立自動調度資源政策,方法是定義 AutoscalingPolicy 做為 autoscalingPolicies.create 要求的一部分。

控制台

如要建立自動調度資源政策,請使用 Google Cloud 控制台,從 Dataproc「自動調度資源政策頁面選取「建立政策」。在「建立政策」頁面上,您可以選取政策最佳化建議面板,為特定工作類型或縮放目標填入自動調度資源政策欄位。

建立自動調度資源叢集

建立自動調度資源政策後,請建立要使用自動調度資源政策的叢集。叢集必須與自動調度資源政策位於相同的區域

gcloud CLI

在本機終端機或 Cloud Shell 中執行下列 gcloud 指令,建立可自動調整大小的叢集。請為叢集提供名稱,並使用 --autoscaling-policy 標記指定 policy ID (您在建立政策時指定的政策名稱) 或政策 resource URI (resource name) (請參閱 AutoscalingPolicy idname 欄位)。

gcloud dataproc clusters create cluster-name \
    --autoscaling-policy=policy id or resource URI \
    --region=region

REST API

建立自動調度資源叢集,方法是將 AutoscalingConfig 納入 clusters.create 要求。

控制台

您可以從 Google Cloud 控制台的 Dataproc「Create a cluster」頁面「Set up cluster」面板的「Autoscaling policy」部分,選取要套用至新叢集的現有自動調度資源政策。

在現有叢集上啟用自動調度資源

建立自動調度資源政策後,您可以在同一個地區的現有叢集上啟用這項政策。

gcloud CLI

在本機終端機或 Cloud Shell 中執行下列 gcloud 指令,即可在現有叢集中啟用自動調度資源政策。提供叢集名稱,並使用 --autoscaling-policy 標記指定 policy ID (您在建立政策時指定的政策名稱) 或政策 resource URI (resource name) (請參閱 AutoscalingPolicy idname 欄位)。

gcloud dataproc clusters update cluster-name \
    --autoscaling-policy=policy id or resource URI \
    --region=region

REST API

如要在現有叢集上啟用自動調度資源政策,請在 clusters.patch 要求的 updateMask 中設定政策的 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 主控台不支援在叢集中停用自動調度資源功能。

自動調整大小的運作方式

自動調度資源會在每個「冷卻」期間過後檢查叢集 Hadoop YARN 指標,以決定是否要調整叢集,以及調整的幅度。

  1. 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 \]

    根據預設,自動配置器會監控 YARN 記憶體資源。如果您啟用以核心為依據的自動調整大小功能,系統會同時監控 YARN 記憶體和 YARN 核心:estimated_worker_count 會分別評估記憶體和核心,並選取較大的 worker 數量。

    $estimated\_worker\_count =$

    \[ max(estimated\_worker\_count\_by\_memory,\ estimated\_worker\_count\_by\_cores) \]

    \[ estimated\ \Delta worker = estimated\_worker\_count - current\_worker\_count \]

  2. 自動調度資源會根據工作站數量預估變更,使用 scaleUpFactorscaleDownFactor 計算工作站數量的實際變更:

    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 (完全使用)。

  3. 計算工作站數量變更後,scaleUpMinWorkerFractionscaleDownMinWorkerFraction 會做為閾值,用於判斷自動調度資源功能是否會調整叢集。小數字表示即使 Δworkers 很小,自動調度資源也應進行調度。較大的分數表示只有在 Δworkers 偏大時才會進行縮放。

    IF (Δworkers >  scaleUpMinWorkerFraction * current_worker_count) then scale up
    
    IF (abs(Δworkers) >  scaleDownMinWorkerFraction * current_worker_count),
    THEN scale down.
    

  4. 如果要調整的工作站數量足以觸發調整規模,自動調度資源會使用 workerConfigminInstances maxInstances 邊界,以及 secondaryWorkerConfigweight (主要與次要工作站的比率),判斷如何在主要和次要工作站執行個體群組中分配工作站數量。這些計算的結果,就是叢集在調整期間的最終自動調整變更。

  5. 在使用 2.0.57 以上、2.1.5 以上和後續映像檔版本建立的叢集中,如果發生下列情況,系統就會取消自動調度資源縮減要求:

    1. 縮減作業正在進行中,且安全停用逾時值不為零。
    2. 當「正在執行的 YARN 工作站」數量 (「正在執行的工作站」) 加上自動調度器建議的工作站總數變動量 (Δworkers) 等於或大於 DECOMMISSIONING YARN 工作站 (「停用的 worker」),如以下公式所示:

      IF (active workers + Δworkers ≥ active workers + decommissioning workers)
      THEN cancel the scaledown operation
      

    如需縮減取消的範例,請參閱「自動調度資源何時會取消縮減作業?」。

自動調度資源設定建議

本節提供建議,協助您設定自動調度資源。

避免調度主要工作站的資源

主要工作站會執行 HDFS 資料節點,而次要工作站則只會執行運算。使用次要工作者可讓您有效地調整運算資源,無須佈建儲存空間,因此可加快調整能力。HDFS 名稱節點可能會有多個競爭條件,導致 HDFS 發生損毀,進而導致停用作業無限期卡住。為避免這個問題,請勿調度主要工作站的資源。例如:none workerConfig: minInstances: 10 maxInstances: 10 secondaryWorkerConfig: minInstances: 0 maxInstances: 100

您需要對叢集建立指令進行幾項修改:

  1. --num-workers=10 設為與自動調度資源政策的主要工作站群組大小相符。
  2. 設定 --secondary-worker-type=non-preemptible,將次要工作站設為非先占。(除非您需要先占 VM)。
  3. 將硬體設定從主要工作站複製到次要工作站。例如,將 --secondary-worker-boot-disk-size=1000GB 設為與 --worker-boot-disk-size=1000GB 相符。

使用強化版彈性模式執行 Spark 批次工作

搭配使用強化版彈性模式 (EFM) 和自動調度資源,即可:

在工作執行期間加快叢集縮減速度

避免叢集縮減導致執行中工作中斷

盡量減少因可先占的次要工作站先占而導致執行中工作中斷的情況

啟用 EFM 後,自動調度資源政策的平穩停用逾時時間必須設為 0s。自動調度資源政策只能自動調度次要 worker。

選擇安全停用程序的逾時時間

從叢集中移除節點時,自動調度資源功能支援 YARN 安全停用程序。安全停用功能可讓應用程式在各階段之間完成資料重組,避免工作進度倒退。自調整政策中提供的⁠安全停用逾時是 YARN 在移除節點前,等待執行中應用程式 (在停用作業開始時正在執行的應用程式) 的時間上限。

如果程序未在指定的優雅停用逾時期限內完成,系統會強制關閉 worker 節點,這可能導致資料遺失或服務中斷。為避免這種情況發生,請將優雅停用逾時時間設為 比叢集處理時間最長的工作還要長。舉例來說,如果您預期最長的工作執行時間為一小時,請將逾時時間設為至少一小時 (1h)。

建議您將耗時超過 1 小時的工作遷移至專屬的暫時叢集,以免阻斷平穩停用作業。

設定 scaleUpFactor

scaleUpFactor 可控制自動配置器調高叢集的積極程度。請指定介於 0.01.0 之間的數字,設定導致節點增加的 YARN 待處理資源的部分值。

舉例來說,如果有 100 個待處理容器,每個要求 512 MB,則有 50 GB 的待處理 YARN 記憶體。如果 scaleUpFactor 為 0.5,自動配置器會新增足夠的節點,以便增加 25 GB 的 YARN 記憶體。同樣地,如果是 0.1,自動配置器會新增足夠的節點來處理 5 GB。請注意,這些值對應的是 YARN 記憶體,而非 VM 實際可用的記憶體總量。

對於啟用動態分配功能的 MapReduce 工作和 Spark 工作,0.05 是一個不錯的起點。針對固定執行緒數量的 Spark 工作和 Tez 工作,請使用 1.0。scaleUpFactor 為 1.0 表示自動調度資源會調整,使待處理或可用的資源為 0 (完全使用)。

設定 scaleDownFactor

scaleDownFactor 會控制自動配置器縮減叢集資源的積極程度。請指定介於 0.01.0 之間的數字,設定導致節點移除的 YARN 可用資源的部分值。

對於需要經常擴充或縮減的多工作叢集,請將這個值保留為 1.0。由於安全停用功能,縮減作業的速度會比擴充作業慢上許多。設定 scaleDownFactor=1.0 會設定積極的縮減率,盡可能減少達到適當叢集大小所需的縮減作業次數。

如果叢集需要更高的穩定性,請設定較低的 scaleDownFactor,以便以較慢的縮減率進行縮減。

將這個值設為 0.0 可防止縮減叢集,例如在使用暫時性或單一工作叢集時。

設定 scaleUpMinWorkerFractionscaleDownMinWorkerFraction

scaleUpMinWorkerFractionscaleDownMinWorkerFraction 會與 scaleUpFactorscaleDownFactor 搭配使用,且預設值為 0.0。這些值代表自動配置器會調升或調降叢集的閾值:發出擴充或縮減要求時,叢集大小必須增加或減少的最低分數值。

範例:除非 scaleUpMinWorkerFraction 小於或等於 0.05 (5%),否則自動配置器不會發出更新要求,以便在 100 個節點的叢集中新增 5 個 worker。如果設為 0.1,自動配置器就不會發出叢集擴充要求。同樣地,如果 scaleDownMinWorkerFraction0.05,自動配置器就不會移除至少 5 個節點。

預設值 0.0 表示沒有門檻。

我們強烈建議在大型叢集 (超過 100 個節點) 上設定較高的 scaleDownMinWorkerFractionthresholds,以避免不必要的小型調整作業。

選擇等待期

cooldownPeriod 會設定一段時間,在該時間內,自動配置器不會發出變更叢集大小的要求。您可以使用此值限制自動配置器變更叢集大小的頻率。

最短的 cooldownPeriod 為兩分鐘。如果在政策中設定較短的 cooldownPeriod,工作負載變更會更快影響叢集大小,但叢集可能會不必要地縮放。建議做法是在使用較短的 cooldownPeriod 時,將政策的 scaleUpMinWorkerFractionscaleDownMinWorkerFraction 設為非零值。這樣一來,叢集只會在資源使用率變更足以保證叢集更新時,才會向上或向下調整。

如果工作負載對叢集大小的變更敏感,您可以延長冷卻期。舉例來說,如果您要執行批次處理工作,可以將冷卻時間設為 10 分鐘以上。嘗試不同的冷卻期,找出最適合工作負載的值。

工作站數量邊界和群組權重

每個工作群組都有 minInstancesmaxInstances,可設定各群組的硬性限制。

每個群組也都有一個名為 weight 的參數,用於設定兩個群組之間的目標平衡。請注意,這個參數只是提示,如果群組達到最小或最大大小,節點只會從其他群組新增或移除。因此,weight 幾乎可以一律保留預設的 1

啟用以核心數為依據的自動調度資源

根據預設,YARN 會使用記憶體指標來分配資源。對於 CPU 密集型應用程式,最佳做法是將 YARN 設定為使用主要資源計算器。如要這麼做,請在建立叢集時設定下列屬性:

capacity-scheduler:yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator

自動調度資源指標和記錄檔

您可以使用下列資源和工具監控自動調度資源作業,以及這些作業對叢集和工作造成的影響。

Cloud Monitoring

使用 Cloud Monitoring 可執行下列操作:

  • 查看自動調度資源使用的指標
  • 查看叢集中的節點管理員數量
  • 瞭解自動調度資源為何調度或未調度叢集資源 autoscaling-stackdriver1 autoscaling-stackdriver2 autoscaling-stackdriver3

Cloud Logging

使用 Cloud Logging 查看 Dataproc 自動調整器的記錄。

1) 找出叢集的記錄。

autoscaling-logs-for-cluster

2) 選取 dataproc.googleapis.com/autoscaler

autoscaling-log-file

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

autoscaling-three-logs autoscaling-update-operation

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

autoscaling-recommendation-message

背景資訊:使用 Apache Hadoop 和 Apache Spark 進行自動調整

下文將說明自動調整大小功能是否與 Hadoop YARN 和 Hadoop Mapreduce 互通,以及與 Apache Spark、Spark Streaming 和 Spark Structured Streaming 互通。

Hadoop YARN 指標

自動調度資源以下列 Hadoop YARN 指標為主:

  1. Allocated resource 是指整個叢集中執行中的容器所占用的 YARN 資源總量。如果有 6 個執行中的容器,最多可使用 1 個資源單位,則會分配 6 個資源。

  2. Available resource 是叢集中的 YARN 資源,未由已分配的容器使用。如果所有節點管理員共有 10 個資源單位,其中 6 個已分配,則有 4 個可用資源。如果叢集中有可用 (未使用的) 資源,自動調度功能可能會從叢集中移除工作站。

  3. Pending resource 是待處理容器的 YARN 資源要求總和。待處理容器正在等待在 YARN 中執行的空間。只有在可用資源為零或太小,無法分配給下一個容器時,待處理資源才會大於零。如果有待處理的容器,自動調度資源功能可能會在叢集中新增 worker。

您可以在 Cloud Monitoring 中查看這些指標。根據預設,YARN 記憶體會是叢集的 0.8 * 記憶體總量,其餘記憶體則會預留給其他守護程式和作業系統使用,例如頁面快取。您可以使用「yarn.nodemanager.resource.memory-mb」YARN 設定覆寫預設值 (請參閱 Apache Hadoop YARN、HDFS、Spark 和相關屬性)。

自動調整和 Hadoop MapReduce

MapReduce 會將每個 Map 和 Reduce 工作分別做為 YARN 容器執行。工作開始時,MapReduce 會為每個對應工作提交容器要求,導致待處理的 YARN 記憶體大量增加。隨著對應工作完成,待處理記憶體會減少。

mapreduce.job.reduce.slowstart.completedmaps 完成 (Dataproc 上的預設值為 95%) 後,MapReduce 會為所有 reducer 排入容器要求,導致待處理記憶體再次激增。

除非您的對應和縮減工作需要花費數分鐘或更長的時間,否則請勿為自動調度 scaleUpFactor 設定過高的值。將工作站新增至叢集至少需要 1.5 分鐘,因此請確保有足夠的待處理工作,可在幾分鐘內使用新工作站。建議一開始將 scaleUpFactor 設為待處理記憶體的 0.05 (5%) 或 0.1 (10%)。

自動調度資源和 Spark

Spark 會在 YARN 上再增加一層排程。具體來說,Spark Core 的動態配置會向 YARN 提出要求,讓容器執行 Spark 執行緒,然後在這些執行緒的執行緒上排程 Spark 工作。Dataproc 叢集預設會啟用動態分配功能,因此會視需要新增及移除執行緒。

Spark 一律會向 YARN 要求容器,但如果沒有動態分配,它只會在工作開始時要求容器。使用動態配置時,系統會視需要移除容器或要求新的容器。

Spark 會從少數執行緒開始 (在自動調度資源叢集中為 2 個),並在有積壓工作時,繼續將執行緒數量加倍。這麼做可平滑處理待處理記憶體 (減少待處理記憶體的尖峰)。建議您將 Spark 工作的自動調度資源 scaleUpFactor 設為較大的數字,例如 1.0 (100%)。

停用 Spark 動態分配

如果您執行的 Spark 工作不受 Spark 動態分配功能的益,可以設定 spark.dynamicAllocation.enabled=falsespark.executor.instances 來停用 Spark 動態分配功能。在個別 Spark 工作執行時,您仍可使用自動調度資源功能來調整叢集的資源配置。

含有快取資料的 Spark 工作

當不再需要時,請設定 spark.dynamicAllocation.cachedExecutorIdleTimeout 或取消快取資料集。根據預設,Spark 不會移除已快取資料的執行緒,這會導致無法縮減叢集。

自動調度資源和 Spark Streaming

  1. 由於 Spark Streaming 有自己的動態分配版本,會使用串流專屬信號新增及移除執行緒,因此請設定 spark.streaming.dynamicAllocation.enabled=true,並透過設定 spark.dynamicAllocation.enabled=false 停用 Spark Core 的動態分配功能。

  2. 請勿在 Spark Streaming 工作中使用安全停用 (自動調度資源 gracefulDecommissionTimeout)。如要透過自動調度資源安全地移除工作站,請設定檢查點,以便容錯。

或者,如要在不使用自動調度資源功能的情況下使用 Spark Streaming,請按照下列步驟操作:

  1. 停用 Spark Core 的動態分配 (spark.dynamicAllocation.enabled=false),並
  2. 設定工作執行者的數量 (spark.executor.instances)。請參閱「叢集屬性」。

自動調度資源和 Spark 結構化串流

由於 Spark Structured Streaming 不支援動態分配 (請參閱 SPARK-24815:Structured Streaming 應支援動態分配),因此自動調整功能與 Spark Structured Streaming 不相容。

透過分割和平行處理控管自動調度資源

平行處理通常由叢集資源設定或決定 (例如,HDFS 區塊數量會根據工作數量控制),但在自動調度資源中,則是相反的情況:自動調度資源會根據工作平行處理量設定工作站數量。以下指南可協助您設定工作並行處理:

  • 雖然 Dataproc 會根據叢集的初始叢集大小設定 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 Streaming 工作):

spark:spark.yarn.am.attemptFailuresValidityInterval=1h
spark:spark.yarn.executor.failuresValidityInterval=1h

預設會讓 Spark 的慢啟動動態分配機制從小型開始:

spark:spark.executor.instances=2

常見問題 (FAQ)

本節包含自動調整大小功能的常見問題與解答。

是否可以在高可用性叢集和單一節點叢集中啟用自動調度資源功能?

您可以在高可用性叢集上啟用自動調度資源功能,但無法在單一節點叢集上啟用 (單一節點叢集不支援調整大小)。

您可以手動調整自動調整資源配置叢集的大小嗎?

可以。在調整自動調度資源政策時,您可以決定以手動調整叢集大小做為暫時性措施。不過,這些變更只會暫時生效,自動調度資源功能最終會將叢集縮減。

請勿手動調整自動調度資源叢集的大小,而是考慮下列做法:

更新自動調度資源政策。對自動調度資源政策所做的任何變更都會影響目前使用該政策的所有叢集 (請參閱「多叢集政策使用方式」)。

卸離政策,並手動將叢集調整為偏好的大小。

取得 Dataproc 支援

Dataproc 與 Dataflow 自動調度資源有何不同?

請參閱「Dataflow 水平自動調度資源」和「Dataflow Prime 垂直自動調度資源」。

Dataproc 開發團隊可以將叢集狀態從 ERROR 重設為 RUNNING 嗎?

一般來說,不行。因為這麼做需要手動驗證是否能安全地重設叢集狀態,而且通常叢集無法在沒有其他手動步驟 (例如重新啟動 HDFS NameNode) 的情況下重設。

在作業失敗後,如果 Dataproc 無法判斷叢集的狀態,就會將叢集狀態設為 ERRORERROR 中的叢集不會自動調度資源。常見的原因包括:

  • 從 Compute Engine API 傳回的錯誤,通常發生在 Compute Engine 服務中斷期間。

  • HDFS 因 HDFS 停用功能中的錯誤而進入損毀狀態。

  • Dataproc Control API 錯誤,例如「工作租約已過期」。

刪除並重新建立狀態為 ERROR 的叢集。

自動調度資源何時會取消縮減作業?

下圖說明自動調度功能會在何時取消縮減作業 (另請參閱「自動調度功能的運作方式」)。

dataproc-autoscaling-cancellation-example

注意:

  • 叢集已啟用自動調度資源功能,且只根據 YARN 記憶體指標 (預設) 進行調度。
  • T1 到 T9 代表自動配置器評估 worker 數量時的冷卻間隔 (事件時間已簡化)。
  • 堆疊長條代表叢集 YARN worker 的數量,包括目前、停用和已停用的。
  • 自動配置器建議的工作站數量 (黑線) 是根據 YARN 記憶體指標、YARN 活動工作站數量和自動調度資源政策設定而定 (請參閱「自動調度資源的運作方式」)。
  • 紅色背景區域表示縮減作業執行的期間。
  • 黃色背景區域表示縮減作業取消的期間。
  • 綠色背景區域代表擴大運算作業的期間。

下列作業會在以下時間執行:

  • T1:自動配置器會啟動優雅的停用縮減作業,以便縮減目前叢集工作站數量的一半。

  • T2:自動配置器會繼續監控叢集指標。系統不會變更縮減建議,縮減作業會繼續進行。部分 worker 已停用,其他 worker 則正在停用中 (Dataproc 會刪除已停用的 worker)。

  • T3:自動調度器計算出可進一步縮減的工作站數量,可能是因為有額外的 YARN 記憶體可用。不過,由於有效工作站數加上建議的工作站數量變更並未等於或大於有效工作站數加上停用的工站數,因此不符合縮減作業取消的條件,自動調度資源功能也不會取消縮減作業。

  • T4:YARN 回報待處理記憶體增加。不過,自動配置器不會變更 worker 數量的建議值。如同 T3,縮減取消條件仍未達標,且自動調整器不會取消縮減作業。

  • T5:YARN 待處理記憶體增加,自動調度器建議的工作站數量也會增加。不過,由於有效工作站數量加上建議變更的工作站數量,小於有效工作站數量加上停用的工人數量,因此取消條件仍未達標,縮減作業不會取消。

  • T6:YARN 待處理記憶體進一步增加。運作中工作站數量加上自動調度器建議的變動工作站數量,現在已超過運作中工作站數量加上停用的數量。符合取消條件,自動配置器會取消縮減作業。

  • T7:自動調整器正在等待縮減作業的取消作業完成。自動配置器不會在這個時間間隔內評估及建議變更 worker 數量。

  • T8:縮減作業的取消程序已完成。停用的 worker 會新增至叢集並變成活動狀態。自動調度器會偵測縮減作業取消的完成情形,並等待下一個評估期間 (T9) 來計算建議的工作站數量。

  • T9:在 T9 時間點上,沒有任何有效的作業。自動配置器會根據自動配置器政策和 YARN 指標,建議執行擴充作業。