自動調度 Dataproc 叢集

什麼是自動調度資源

估算工作負載「合適」的叢集工作站 (節點) 數量並不容易,而且整個管道的單一叢集大小通常並不理想。使用者啟動的叢集資源調度可部分解決這個問題,但需要監控叢集使用率並手動介入。

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

自動調度資源的使用時機

使用自動調度資源:

,適用於在外部服務 (例如 Cloud StorageBigQuery) 中儲存資料的叢集

,適用於處理大量工作的叢集

,以調度單一工作叢集的資源

,並為 Spark 批次工作啟用強化版彈性模式

建議「不要」搭配下列項目使用自動調度資源功能:

  • HDFS:自動調度資源功能不適用於調度叢集內 HDFS 的資源,原因如下:

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

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

  • 閒置叢集:如果叢集處於閒置狀態,不建議使用自動調度資源功能將叢集縮減至最小大小。由於建立新叢集的速度與調整叢集大小一樣快,建議您刪除閒置叢集並重新建立。下列工具支援這項「暫時性」模型:

    使用 Dataproc「工作流程」,在專屬叢集上排定一組工作,然後在工作完成時刪除叢集。如要進行更進階的自動化調度管理,請使用以 Apache Airflow 為基礎的 Cloud Composer

    對於處理臨時查詢或外部排定工作負載的叢集,請使用叢集排定刪除功能,在指定的閒置期或時間長度過後,或在特定時間刪除叢集。

  • 不同大小的工作負載:如果叢集上同時執行小型和大型工作,安全停用縮減資源作業會等待大型工作完成。因此,如果叢集上執行時間較長的工作尚未完成,資源自動調度功能會延後執行時間較短的工作。如要避免這種結果,請在叢集上將大小相似的小型工作分組,並在個別叢集上隔離每個長時間工作。

啟用自動調度資源

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

  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 欄位」)。

REST API

如要建立自動調度資源叢集,請在 clusters.create 要求中加入 AutoscalingConfig

控制台

如要選取現有的自動調度政策並套用至新叢集,請前往 Google Cloud 控制台的 Dataproc「建立叢集」頁面,然後在「設定叢集」面板的「自動調度政策」部分進行選取。

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

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

gcloud CLI

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

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

    從 Dataproc 映像檔 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 \]

  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. 如果需要調度的工作站數量夠多,可觸發調度作業,自動調度資源功能會使用 workerConfigsecondaryWorkerConfigminInstances maxInstances 範圍,以及 weight (主要和次要工作站的比例),判斷如何在主要和次要工作站執行個體群組之間分配工作站數量。這些計算的結果就是叢集在縮放期間的最終自動調整規模變更。

  5. 如果使用映像檔版本 2.0.57 以上、2.1.5 以上和更新版本建立叢集,且符合下列條件,系統會取消自動調度資源縮減要求:

    1. 縮減作業正在進行中,且安全停用逾時值不為零,以及
    2. 「有效工作站」的數量加上自動調度程式建議的總工作站數量變化 (Δ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

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

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

使用強化版彈性模式處理 Spark 批次工作

搭配自動調度資源使用強化版彈性模式 (EFM),可達到下列目的:

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

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

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

啟用 EFM 後,自動調度資源政策的正常終止逾時必須設為 0s。自動調度資源政策只能自動調度次要 worker。

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

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

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

如果工作時間超過 1 小時,建議將工作遷移至自己的暫時性叢集,以免阻礙正常終止作業。

設定 scaleUpFactor

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

舉例來說,如果有 100 個待處理容器,每個容器要求 512 MB,則待處理的 YARN 記憶體為 50 GB。如果 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 個工作站。如果設為 0.1,自動調度器就不會發出要求來擴大叢集。同樣地,如果 scaleDownMinWorkerFraction0.05,自動配置器不會移除節點,除非至少要移除 5 個節點。

預設值 0.0 表示沒有門檻。

強烈建議在大型叢集 (超過 100 個節點) 上設定較高的 scaleDownMinWorkerFractionthresholds,以免發生不必要的小型擴充作業。

選擇冷卻時間

cooldownPeriod 會設定時間範圍,自動調度器不會在這段期間發出變更叢集大小的要求。您可以使用這項功能,限制自動調度器變更叢集大小的頻率。

最短和預設時間為兩分鐘。cooldownPeriod如果在政策中設定較短的 cooldownPeriod,工作負載變更會更快影響叢集大小,但叢集可能會不必要地擴大和縮減。建議您在使用較短的 cooldownPeriod 時,將政策的 scaleUpMinWorkerFractionscaleDownMinWorkerFraction 設為非零值。這可確保只有在資源用量變化足以更新叢集時,叢集才會擴大或縮小。

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

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

每個工作站群組都有 minInstancesmaxInstances,可設定每個群組的大小上限。

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

使用以核心為準的自動調度資源功能

對於 CPU 密集型應用程式,最佳做法是使用主導資源計算機分配資源。從 Dataproc 映像檔版本 2.2 開始,這就是預設的 YARN 設定。使用較舊的映像檔版本時,除非您在建立叢集時設定下列屬性,將 YARN 設定為使用 Dominant Resource Calculator,否則 Dataproc 會將 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 倍,其餘記憶體則保留給其他 Daemon 和作業系統使用,例如頁面快取。您可以使用「yarn.nodemanager.resource.memory-mb」YARN 設定覆寫預設值 (請參閱「Apache Hadoop YARN、HDFS、Spark 和相關屬性」)。

自動調度與 Hadoop MapReduce

MapReduce 會將每個對應和縮減工作做為個別的 YARN 容器執行。工作開始時,MapReduce 會為每個對應工作提交容器要求,導致待處理的 YARN 記憶體大幅增加。地圖工作完成後,待處理的記憶體就會減少。

mapreduce.job.reduce.slowstart.completedmaps 完成 (Dataproc 預設為 95%) 時,MapReduce 會將所有縮減器排入容器要求佇列,導致待處理記憶體再次飆升。

除非對應和減少工作需要幾分鐘以上的時間,否則請勿為自動調整大小設定高值 scaleUpFactor。將工作站新增至叢集至少需要 1.5 分鐘,因此請確保有足夠的待處理工作,可供新工作站使用幾分鐘。建議先將 scaleUpFactor 設為待處理記憶體的 0.05 (5%) 或 0.1 (10%)。

自動調度資源和 Spark

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

Spark 一律會向 YARN 要求容器,但如果沒有動態分配功能,Spark 只會在工作開始時要求容器。動態分配功能會視需要移除容器或要求新容器。

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

停用 Spark 動態分配

如果您執行的 Spark 工作彼此獨立,且無法從 Spark 動態分配功能獲益,可以設定 spark.dynamicAllocation.enabled=falsespark.executor.instances,停用 Spark 動態分配功能。您仍可使用自動調度資源功能,在個別 Spark 工作執行期間調高或調低叢集資源配置。

使用快取資料的 Spark 工作

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

自動調度資源和 Spark 串流

  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 Structured Streaming 不支援動態分配 (請參閱 SPARK-24815: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 串流工作):

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 錯誤,例如「Task lease expired」。

刪除狀態為 ERROR 的叢集,然後重新建立。

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

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

dataproc-autoscaling-cancellation-example

注意:

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

下列作業會在指定時間執行:

  • T1:自動調度器啟動安全停用縮減作業,將目前叢集工作站數量縮減約一半。

  • T2:自動調度器會持續監控叢集指標。這不會改變縮減建議,縮減作業也會繼續進行。部分工作站已停用,其他工作站也即將停用 (Dataproc 會刪除停用的工作站)。

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

  • T4:YARN 報告待處理記憶體增加。不過,自動配置器不會變更工作站數量建議。與 T3 相同,縮減取消條件仍未達成,因此自動調整程式不會取消縮減作業。

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

  • T6:YARN 待處理記憶體進一步增加。運作中的工作站數量加上自動調度器建議的工作站數量變化,現在大於運作中加上停用中的工作站數量。符合取消條件,自動調整規模器取消縮減作業。

  • T7:自動調度器正在等待取消縮減作業完成。自動調度器不會在這個間隔評估及建議變更工作站數量。

  • T8:縮減資源作業取消完成。系統會將停用的工作站新增至叢集,並啟用這些工作站。自動調度器會偵測到取消縮減作業完成,並等待下一個評估週期 (T9) 計算建議的工作站數量。

  • T9:T9 時間沒有任何進行中的作業。自動調度器會根據自動調度器政策和 YARN 指標,建議執行擴充作業。