初始化動作

建立 Dataproc 叢集時,您可以在執行檔或指令碼中指定初始化動作,Dataproc 會在叢集設定完成後,立即在 Dataproc 叢集的所有節點上執行這些動作。初始化動作通常會設定工作依附元件 (例如安裝 Python 套件),讓您在工作執行時不必安裝依附元件,就能將該工作提交給叢集。

您可以在下列位置找到初始化動作指令碼範例: 注意:Google 不支援這些範例

重要事項與規範

  • 請勿建立參照gs://goog-dataproc-initialization-actions-REGION公開 bucket 中初始化動作的正式版叢集。這些指令碼僅供參考。這些指令碼會與進行中的 GitHub 存放區變更同步處理,因此更新這些指令碼可能會導致叢集建立作業中斷。請改為將初始化動作從公開 bucket 複製到有版本的 Cloud Storage bucket 資料夾,如下列範例所示:

    REGION=COMPUTE_REGION
    gcloud storage cp gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \
        gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh
    
    接著,參考 Cloud Storage 中的副本建立叢集:
    gcloud dataproc clusters create CLUSTER_NAME \
        --region=${REGION} \
        --initialization-actions=gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh \
        ...other flags...
    

  • 叢集建立期間,初始化動作會在每個節點上依序執行。它們也會在對叢集進行調度資源自動調度資源時,在每個新增的節點上執行。

  • 更新初始化動作時 (例如將 Cloud Storage 初始化動作同步至公開值區或 GitHub 存放區初始化動作的變更),請建立新的 (最好是命名為版本) 資料夾,以接收更新後的初始化動作。但如果您是直接更新初始化動作,新節點 (例如自動調度資源功能新增的節點) 會執行更新後的初始化動作,而不是現有節點執行的舊版初始化動作。這類初始化動作差異可能會導致叢集節點不一致或損毀。

  • 初始化動作會以 root 使用者的身分執行,您不需要使用 sudo

  • 在初始化動作中使用絕對路徑

  • 在初始化動作中使用工作行,指明指令碼的解讀方式 (例如 #!/bin/bash#!/usr/bin/python)。

  • 如果初始化動作以非零的結束代碼結尾,叢集建立作業將會回報「錯誤」狀態。如要對初始化動作進行偵錯,請使用 SSH 連線至叢集的 VM 執行個體,然後檢查記錄。修正初始化動作的問題後,請刪除叢集,然後再重新建立。

  • 如果您只使用內部 IP 位址來建立 Dataproc 叢集,就無法利用初始化動作透過網際網路存取 github.com,除非您先設定路徑來引導流量通過 Cloud NATCloud VPN。如果您無法存取網際網路,可以啟用私人 Google 存取權,並且將工作依附元件放置在 Cloud Storage 中;叢集節點可以利用內部 IP 從 Cloud Storage 下載依附元件。

  • 您可以使用 Dataproc 自訂映像檔來設定工作依附元件,而不必透過初始化動作來進行。

  • 初始化處理:

    • 2.0 前的圖片叢集:
      • 主要節點:如要允許在主要節點上執行的初始化動作將檔案寫入 HDFS,主要節點初始化動作必須等到 HDFS 可寫入時才會啟動 (也就是 HDFS 退出安全模式,且至少有兩個 HDFS DataNode 加入時)。
      • 工作站:如果您將dataproc:dataproc.worker.custom.init.actions.mode 叢集屬性設為 RUN_BEFORE_SERVICES,每個工作站都會先執行初始化動作,再啟動 HDFS datanode 和 YARN nodemanager daemon。由於 Dataproc 要等到 HDFS 可寫入時,才會執行主要初始化動作 (這需要 2 個 HDFS 資料節點精靈執行),因此設定這項屬性可能會增加叢集建立時間。
    • 2.0 以上的圖片叢集:

      • 主要:主要節點初始化動作可能會在 HDFS 可寫入之前執行。如果您執行的初始化動作會在 HDFS 中暫存檔案,或需要依附於 HDFS 的服務 (例如 Ranger),請將dataproc.master.custom.init.actions.mode 叢集屬性設為 RUN_AFTER_SERVICES。注意:由於這項屬性設定可能會增加叢集建立時間 (請參閱前 2.0 版映像檔叢集工作站的叢集建立延遲說明),因此請僅在必要時使用 (一般做法是依賴這項屬性的預設 RUN_BEFORE_SERVICES 設定)。
      • 工作人員dataproc:dataproc.worker.custom.init.actions.mode 叢集屬性設為 RUN_BEFORE_SERVICES,且無法在建立叢集時傳遞至叢集 (您無法變更屬性設定)。每個工作站都會先執行初始化動作,再啟動 HDFS datanode 和 YARN nodemanager 精靈。由於 Dataproc 不會等待 HDFS 可寫入資料,就執行主要初始化動作,因此主要和工作站初始化動作會平行執行。
    • 建議:

      • 使用中繼資料判斷節點的角色,以便在節點上有條件地執行初始化動作 (請參閱「使用叢集中繼資料」)。
      • 將初始化動作的副本分叉到 Cloud Storage bucket,確保穩定性 (請參閱初始化動作的使用方式)。
      • 從網際網路下載時新增重試機制,有助於穩定初始化動作。

使用初始化動作

無論您建立叢集的方法是下列何者,都可以指定叢集的初始化動作:

Gcloud 指令

當您利用 gcloud dataproc clusters create 指令建立叢集時,請用 --initialization-actions 標記指定一或多個以半形逗號分隔的初始化執行檔或指令碼 Cloud Storage 位置 (URI)。注意:系統不支援在初始「gs://」後,Cloud Storage 位置 URI 中出現多個連續「/」,例如「gs://bucket/my//object//name」。執行 gcloud dataproc clusters create --help 可查看指令資訊。

gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
    --initialization-action-timeout=timeout-value (default=10m) \
    ... other flags ...
注意事項:
  • 使用 --initialization-action-timeout 標記指定初始化動作的逾時期限,預設的逾時期限為 10 分鐘。如果初始化可執行檔或指令碼在逾時時間結束前未完成,Dataproc 會取消初始化動作。
  • 使用dataproc:dataproc.worker.custom.init.actions.mode 叢集屬性,在節點管理員和資料節點 Daemon 啟動之前,對主要工作站執行初始化動作。
Google Cloud

REST API

請在 ClusterConfig.initializationActions 陣列中,指定一或多個指令碼或執行檔,做為 clusters.create API 要求的一部分。

示例

POST /v1/projects/my-project-id/regions/us-central1/clusters/
{
  "projectId": "my-project-id",
  "clusterName": "example-cluster",
  "config": {
    "configBucket": "",
    "gceClusterConfig": {
      "subnetworkUri": "default",
      "zoneUri": "us-central1-b"
    },
    "masterConfig": {
      "numInstances": 1,
      "machineTypeUri": "n1-standard-4",
      "diskConfig": {
        "bootDiskSizeGb": 500,
        "numLocalSsds": 0
      }
    },
    "workerConfig": {
      "numInstances": 2,
      "machineTypeUri": "n1-standard-4",
      "diskConfig": {
        "bootDiskSizeGb": 500,
        "numLocalSsds": 0
      }
    },
    "initializationActions": [
      {
        "executableFile": "gs://cloud-example-bucket/my-init-action.sh"
      }
    ]
  }
}
Google Cloud

控制台

  • 開啟 Dataproc 的「建立叢集」頁面,然後選取「自訂叢集」面板。
  • 在「Initialization actions」(初始化動作) 專區,於「Executable file」(可執行檔) 欄位中,輸入每個初始化動作的 Cloud Storage 值區位置。按一下「Browse」(瀏覽),開啟 Google Cloud 控制台的 Cloud Storage 瀏覽器頁面,選取指令碼或可執行檔。按一下「新增初始化動作」, 新增每個檔案。
  • 將引數傳遞至初始化動作

    Dataproc 會為叢集中執行的執行個體設定特殊中繼資料值。您可以設定自己的自訂中繼資料,將引數傳遞至初始化動作。

    gcloud dataproc clusters create cluster-name \
        --region=${REGION} \
        --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
        --metadata=name1=value1,name2=value2... \
        ... other flags ...
    

    初始化動作可以讀取中繼資料值,如下所示:

    var1=$(/usr/share/google/get_metadata_value attributes/name1)
    

    節點選取

    如要將初始化動作限制在主節點、驅動程式或工作站節點,您可以在可執行檔或指令碼中加入簡單的節點選取邏輯。

    ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
    if [[ "${ROLE}" == 'Master' ]]; then
      ... master specific actions ...
    else if [[ "${ROLE}" == 'Driver' ]]; then
      ... driver specific actions ...
    else
      ... worker specific actions ...
    fi
    

    階段二進位檔

    常見的叢集初始化情況是將工作二進位檔暫存在叢集,這樣您就不必在每次提交工作時暫存二進位檔。舉例來說,假設下列初始化指令碼儲存在 Cloud Storage 值區位置 gs://my-bucket/download-job-jar.sh 中:

    #!/bin/bash
    ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
    if [[ "${ROLE}" == 'Master' ]]; then
      gcloud storage cp gs://my-bucket/jobs/sessionalize-logs-1.0.jar home/username
    fi
    

    這個指令碼的位置可以傳遞至 gcloud dataproc clusters create 指令:

    gcloud dataproc clusters create my-dataproc-cluster \
        --region=${REGION} \
        --initialization-actions=gs://my-bucket/download-job-jar.sh
    

    Dataproc 會在所有節點上執行這個指令碼,並根據指令碼的節點選取邏輯,將 JAR 檔案下載至主要節點。提交的工作隨後即可使用預先暫存的 JAR:

    gcloud dataproc jobs submit hadoop \
        --cluster=my-dataproc-cluster \
        --region=${REGION} \
        --jar=file:///home/username/sessionalize-logs-1.0.jar
    

    初始化動作範例

    您可以在區域公開的 Cloud Storage 值區 gs://goog-dataproc-initialization-actions-<REGION>,以及 GitHub 存放區中,找到常用及其他的初始化動作指令碼範例。如要分享您的指令碼,請參閱 CONTRIBUTING.md 文件,然後提出提取要求。

    記錄

    系統會記錄每個執行個體在 /var/log/dataproc-initialization-script-X.log 中執行各項初始化動作的輸出內容,其中 X 是每個後續初始化動作指令碼的從零開始索引。舉例來說,如果叢集有兩個初始化動作,輸出內容會記錄在 /var/log/dataproc-initialization-script-0.log/var/log/dataproc-initialization-script-1.log 中。

    後續步驟

    探索 GitHub 初始化動作