調整 Dataproc 叢集

建立 Dataproc 叢集後,您可以藉由增加或減少叢集中主要或次要工作站節點數 (水平資源調度),調整叢集 (為叢集進行資源調度)。您隨時都能為 Dataproc 叢集進行資源調度,即使叢集上有正在執行的工作也沒問題。您無法變更現有叢集的機器類型 (垂直調整)。如要進行垂直擴充,請使用支援的機器類型建立叢集,然後將工作遷移至新叢集。

為何要為 Dataproc 叢集進行資源調度?

  1. 增加工作站數量,以提升工作執行速度
  2. 減少工作站數量,以節省成本 (請參閱安全停用一節,讓您在縮減叢集規模時,能將該功能列為避免失去進行中工作的選項)。
  3. 增加節點數量,以擴充可用的 Hadoop 分散式檔案系統 (HDFS) 儲存空間

您可以為叢集進行多次資源調度,因此您可能這次想要擴充/縮減叢集的規模,下次又想要縮減/擴充叢集的規模。

使用資源調度

您可以透過三種方式調整 Dataproc 叢集的資源:

  1. 使用 gcloud CLI 中的 gcloud 指令列工具。
  2. Google Cloud 控制台中編輯叢集設定。
  3. 使用 REST API

新增至叢集的工作站將會使用與現有工作站相同的機器類型。舉例來說,如果叢集中的工作站是使用 n1-standard-8 機器類型建立的,那麼新的工作站也會使用 n1-standard-8 機器類型。

您可以調整主要工作站及/或次要 (先佔) 工作站的數量。舉例來說,如果您只調整了先佔工作站的數量,主要工作站的數量會維持不變。

gcloud

如要使用 gcloud dataproc clusters update 來調度叢集的資源,請執行以下指令:
gcloud dataproc clusters update cluster-name \
    --region=region \
    [--num-workers and/or --num-secondary-workers]=new-number-of-workers
其中 cluster-name 是更新叢集的名稱,new-number-of-workers 是主要和/或次要工作站節點的更新數量。例如,如果要替名為「dataproc-1」的叢集調度資源,讓它使用五個主要工作站節點,請執行以下指令。
gcloud dataproc clusters update dataproc-1 \
    --region=region \
    --num-workers=5
...
Waiting on operation [operations/projects/project-id/operations/...].
Waiting for cluster update operation...done.
Updated [https://dataproc.googleapis.com/...].
clusterName: my-test-cluster
...
  masterDiskConfiguration:
    bootDiskSizeGb: 500
  masterName: dataproc-1-m
  numWorkers: 5
  ...
  workers:
  - my-test-cluster-w-0
  - my-test-cluster-w-1
  - my-test-cluster-w-2
  - my-test-cluster-w-3
  - my-test-cluster-w-4
...

REST API

請參閱 clusters.patch 的說明。

示例

PATCH /v1/projects/project-id/regions/us-central1/clusters/example-cluster?updateMask=config.worker_config.num_instances,config.secondary_worker_config.num_instances
{
  "config": {
    "workerConfig": {
      "numInstances": 4
    },
    "secondaryWorkerConfig": {
      "numInstances": 2
    }
  },
  "labels": null
}

控制台

建立叢集之後,您可以前往 Google Cloud 主控台的「Clusters」(叢集) 頁面,開啟該叢集的「Cluster details」(叢集詳細資料) 頁面,然後按一下「Configuration」(設定) 分頁上的「Edit」(編輯) 按鈕,即可為叢集進行資源調度。
為「Worker nodes」和/或「Preemptible worker nodes」 數量輸入新的值 (在下方的螢幕截圖中,數量分別更新為「5」和「2」)。
按一下「儲存」即可更新叢集。

Dataproc 如何選取要移除的叢集節點

在使用 1.5.83+2.0.57+2.1.5+建立的叢集中,當縮減叢集時,Dataproc 會先移除不活躍、不健康和閒置的節點,然後再移除執行 YARN 應用程式主程式和執行中容器最少的節點,盡可能減少移除節點對執行中 YARN 應用程式造成的影響。

安全停用

當您縮減叢集資源時,正在進行的工作可能會在完成之前停止。如果您使用的是 Dataproc 1.2 或更新的版本,可以使用包含 YARN 節點安全停用的安全停用功能來完成工作站上執行中的工作,避免讓 Cloud Dataproc 叢集中的這些工作遭到移除。

安全停用與次要工作站

先佔 (次要) 工作站群組會持續佈建或刪除工作站,以達到其預期的規模,即使為叢集調度資源的作業標示為已完成。如果您嘗試安全停用次要工作站,將會收到類似以下的錯誤訊息:

"Secondary worker group cannot be modified outside of Dataproc. If you recently created or updated this cluster, wait a few minutes before gracefully decommissioning to allow all secondary instances to join or leave the cluster. Expected secondary worker group size: x, actual size: y"

請稍候幾分鐘,然後再重複安全停用要求。

同時請注意下列事項:

  • 您可以隨時強制停用先佔工作站。
  • 您可以隨時安全停用主要工作站。

使用安全停用

Dataproc 安全停用內含的 YARN 節點安全停用功能可完成工作站上正在進行的工作,以免這些工作從 Cloud Dataproc 叢集移除。安全停用功能預設為停用。如要啟用此功能,請在更新叢集時設定一個逾時值,以從叢集移除一或多個工作站。

gcloud

當您更新叢集來移除一或多個工作站時,請使用 gcloud dataproc clusters update 指令並搭配 --graceful-decommission-timeout 標記。逾時 (字串) 值可以是「0s」(預設值;強制非安全停用) 或相對於目前時間的正時間值 (例如「3s」)。最長時間為 1 天。
gcloud dataproc clusters update cluster-name \
    --region=region \
    --graceful-decommission-timeout="timeout-value" \
    [--num-workers and/or --num-secondary-workers]=decreased-number-of-workers \
    ... other args ...

REST API

請參閱 clusters.patch.gracefulDecommissionTimeout 的說明。逾時 (字串) 值可以是「0」(預設值;強制非安全停用) 或單位為秒的時間值 (例如「3s」)。最大時間值是 1 天。

控制台

當您建立叢集之後,可以選取該叢集的安全停用功能,方法是前往 Google Cloud 主控台的「Clusters」(叢集) 頁面,然後開啟該叢集的「Cluster details」(叢集詳細資料) 頁面,再按一下「Configuration」(設定) 分頁上的「Edit」(編輯) 按鈕。
在「Graceful Decommissioning」(安全停用) 部分,勾選「Use graceful decommissioning」(使用安全停用) 核取方塊,然後選取逾時值。
按一下「儲存」即可更新叢集。

如何取消安全停用縮減作業

在使用 2.0.57+2.1.5+建立的 Dataproc 叢集中,您可以執行 gcloud dataproc operations cancel 指令或發出 Dataproc API operations.cancel 要求,取消平穩停用的縮減作業。

取消安全停用縮減作業時:

  • 處於 DECOMMISSIONING 狀態的工作者會在作業取消完成後重新啟用,並變成 ACTIVE

  • 如果縮減作業包含標籤更新,更新可能不會生效。

如要確認取消要求的狀態,您可以執行 gcloud dataproc operations describe 指令,或發出 Dataproc API operations.get 要求。如果取消作業成功,內部作業狀態會標示為「已取消」。