排解叢集建立問題

本文說明常見的叢集建立錯誤訊息,並提供排解叢集建立問題的提示。

常見的叢集建立錯誤訊息

  • 使用者未獲授權,無法以服務帳戶的身分操作

    原因:嘗試建立 Managed Service for Apache Spark 叢集的主體,不具備使用指定服務帳戶的必要權限。Managed Service for Apache Spark 使用者必須具備服務帳戶 ActAs 權限,才能部署 Managed Service for Apache Spark 資源; 服務帳戶使用者角色 (roles/iam.serviceAccountUser) 包含這項權限 (請參閱「Managed Service for Apache Spark 角色」)。

    解決方案:找出嘗試建立 Managed Service for Apache Spark 叢集的使用者或服務帳戶。將叢集設定使用的服務帳戶 (通常是 Managed Service for Apache Spark VM 服務帳戶) 的服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予該主體。

  • 作業逾時:至少須有 2 個 datanode/Node Manager 執行,但目前只有 0 個。

    原因:控制器節點無法與 worker 節點通訊,因此無法建立叢集。

    解決方法:

  • projects/{projectId}/regions/{region}/subnetworks/{subnetwork} 所需的 compute.subnetworks.use 權限

    原因:如果您嘗試使用其他專案中的虛擬私有雲網路,設定 Managed Service for Apache Spark 叢集,但 Managed Service for Apache Spark 服務代理服務帳戶,對託管網路的 Shared VPC 專案不具備必要權限,就可能發生這項錯誤。

    解決方案:請按照「建立叢集使用其他專案的虛擬私有雲網路」一文中的步驟操作。

  • 可用區 projects/zones/{zone} 的資源不足,無法執行要求 (resource type:compute)

    原因:用於建立叢集的可用區資源不足。

    解決方法:

    • 使用 Managed Service for Apache Spark 的自動選擇可用區位置功能,在區域中任何有可用資源的可用區建立叢集。
    • 在其他可用區建立叢集。
  • 「超過配額」錯誤

    CPUS/CPUS_ALL_REGIONS 配額不足
    「DISKS_TOTAL_GB」配額不足
    「IN_USE_ADDRESSES」配額不足

    原因:CPU、磁碟或 IP 位址要求超過可用配額。

    解決方法:透過 Google Cloud 控制台要求增加配額。

  • 初始化動作失敗

    原因:建立叢集時提供的初始化動作無法安裝。

    解決方法:

  • 無法初始化節點 CLUSTER-NAME-m。... 輸出內容請見:<gs://PATH_TO_STARTUP_SCRIPT_OUTPUT>

    原因:Managed Service for Apache Spark 叢集控制器節點無法初始化。

    解決方法:

  • 無法建立叢集:IP 位址空間已用盡

    原因:無法使用佈建所要求叢集節點所需的 IP 位址空間。

    解決方法:

    • 建立 worker 節點較少,但機型較大的叢集。
    • 在其他子網路或網路上建立叢集。
    • 減少網路用量,釋出 IP 位址空間。
    • 請等待網路有足夠的 IP 空間。
  • 初始化指令碼錯誤訊息:存放區 REPO_NAME 已無版本檔案

    原因:Debian oldstable backports 存放區已清除。

    解決方法:

    在初始化指令碼中,於執行 apt-get 的程式碼之前,加入下列程式碼。

    oldstable=$(curl -s https://deb.debian.org/debian/dists/oldstable/Release | awk '/^Codename/ {print $2}');
    stable=$(curl -s https://deb.debian.org/debian/dists/stable/Release | awk '/^Codename/ {print $2}');
    
    matched_files="$(grep -rsil '\-backports' /etc/apt/sources.list*)"
    if [[ -n "$matched_files" ]]; then
      for filename in "$matched_files"; do
        grep -e "$oldstable-backports" -e "$stable-backports" "$filename" || \
          sed -i -e 's/^.*-backports.*$//' "$filename"
      done
    fi
    
  • Timeout waiting for instance DATAPROC_CLUSTER_VM_NAME to report in 或 Network is unreachable: dataproccontrol-REGION.googleapis.com

    原因:這些錯誤訊息表示 Managed Service for Apache Spark 叢集的網路設定不完整:可能缺少預設網際網路閘道的路由或防火牆規則。

    解決方法:

    如要排解這個問題,您可以建立下列連線能力測試:

    • 在兩個 Managed Service for Apache Spark 叢集 VM 之間建立連線能力測試。這項測試的結果可協助您瞭解,網路的輸入或輸出允許防火牆規則是否正確套用至叢集 VM。
    • 在 Managed Service for Apache Spark 叢集 VM 和目前的 Managed Service for Apache Spark 控制 API IP 位址之間建立 Connectivity Tests。如要取得目前的 Managed Service for Apache Spark 控制 API IP 位址,請使用下列指令:
    dig dataproccontrol-REGION.googleapis.com A
    

    使用輸出內容答案部分中的任何 IPv4 位址。

    Connectivity Tests 的結果可協助您瞭解,預設網際網路閘道的路由和輸出允許防火牆是否設定正確。

    根據 Connectivity Tests 的結果:

  • 因更新而發生錯誤

    原因:叢集接受了提交至 Managed Service for Apache Spark 服務的工作,但無法手動或透過自動調度資源功能向上或向下擴充。非標準叢集設定也可能導致這項錯誤。

    解決方法:

    • 叢集重設:提交支援單,附上診斷 tar 檔案,並要求將叢集重設為 RUNNING 狀態。

    • 新叢集:使用相同設定重新建立叢集。這個解決方案可能比支援團隊提供的重設方式更快。

叢集疑難排解提示

本節提供其他指南,說明如何排解常見問題,避免無法建立 Managed Service for Apache Spark 叢集。

Managed Service for Apache Spark 叢集佈建失敗時,通常會產生一般錯誤訊息,或在失敗前回報 PENDING 或 PROVISIONING 狀態。診斷及解決叢集故障問題的關鍵,在於檢查叢集記錄並評估常見故障點。

常見症狀

以下是叢集建立失敗的常見症狀:

  • 叢集狀態長時間維持在 PENDING 或 PROVISIONING。
  • 叢集會轉換為 ERROR 狀態。
  • 建立叢集時發生一般 API 錯誤,例如 Operation timed out。
  • 記錄或 API 回應錯誤訊息,例如:

    • RESOURCE_EXHAUSTED:與 CPU、磁碟或 IP 位址配額有關
    • Instance failed to start
    • Permission denied
    • Unable to connect to service_name.googleapis.com或Could not reach required Google APIs
    • Connection refused或network unreachable
    • 與初始化動作失敗相關的錯誤,例如指令碼執行錯誤和找不到檔案。

查看叢集記錄

診斷叢集建立失敗時,重要的第一步是查看 Cloud Logging 中提供的詳細叢集記錄。

  1. 前往記錄檔探索工具:在 Google Cloud 控制台中開啟「Logs Explorer」。
  2. 篩選 Managed Service for Apache Spark 叢集:
    • 在「Resource」(資源) 下拉式選單中,選取「Cloud Managed Service for Apache Spark Cluster」。
    • 輸入cluster_name和project_id。您也可以依 location (區域) 篩選。
  3. 查看記錄項目:
    • 找出叢集建立失敗前後出現的 ERROR 或 WARNING 級訊息。
    • 請留意 master-startup、worker-startup 和 agent 元件的記錄,深入瞭解 VM 層級或 Managed Service for Apache Spark 代理程式問題。
    • 如要深入瞭解 VM 啟動時間問題,請依 resource.type="gce_instance" 篩選記錄,並尋找與叢集節點相關聯的執行個體名稱訊息,例如 CLUSTER_NAME-m 或 CLUSTER_NAME-w-0。序列控制台記錄可顯示網路設定問題、磁碟問題,以及 VM 生命週期初期發生的指令碼失敗。

常見叢集失敗原因和疑難排解提示

本節概述 Managed Service for Apache Spark 叢集建立失敗的常見原因,並提供疑難排解提示,協助您解決叢集失敗問題。

IAM 權限不足

Managed Service for Apache Spark 叢集使用的 VM 服務帳戶必須具備適當的 IAM 角色,才能佈建 Compute Engine 執行個體、存取 Cloud Storage bucket、寫入記錄,以及與其他 Google Cloud 服務互動。

  • 必要 Worker 角色:確認 VM 服務帳戶具備 Managed Service for Apache Spark Worker 角色 (roles/dataproc.worker)。這個角色具備 Managed Service for Apache Spark 管理叢集資源所需的最低權限。
  • 資料存取權限:如果工作會讀取或寫入 Cloud Storage 或 BigQuery,服務帳戶必須具備相關角色,例如 Cloud Storage 的 Storage Object Viewer、Storage Object Creator 或 Storage Object Admin,或 BigQuery 的 BigQuery Data Viewer 或 BigQuery Editor。
  • Logging 權限:服務帳戶必須具備將記錄寫入 Cloud Logging 所需權限的角色,例如 Logging Writer 角色。

疑難排解提示:

  • 找出服務帳戶:判斷叢集設定使用的 VM 服務帳戶。如未指定,預設值為 Compute Engine 預設服務帳戶。

  • 驗證 IAM 角色:在 Google Cloud 控制台中,前往「IAM & Admin」>「IAM」頁面,找出叢集 VM 服務帳戶,然後確認該帳戶具備叢集作業所需的角色。授予任何缺少的角色。

超過資源配額

Managed Service for Apache Spark 叢集會耗用 Compute Engine 和其他 Google Cloud 服務的資源。超過專案或區域配額可能會導致叢集建立失敗。

  • 常見的 Managed Service for Apache Spark 配額檢查項目:
    • CPUs (地區)
    • DISKS_TOTAL_GB (地區)
    • IN_USE_ADDRESSES (內部 IP 為區域性,外部 IP 為全域)
    • Dataproc API 配額,例如 ClusterOperationRequestsPerMinutePerProjectPerRegion

疑難排解提示:

  • 查看配額:在 Google Cloud 控制台中,前往「IAM & Admin」>「IAM」頁面。依「服務」篩選「Compute Engine API」和「Dataproc API」。
  • 查看用量與上限:找出已達上限或接近上限的配額。
  • 如有需要,請申請提高配額。

網路設定問題

網路設定問題 (例如虛擬私有雲網路、子網路、防火牆或 DNS 設定不正確) 是叢集建立失敗的常見原因。叢集執行個體必須能彼此通訊,並與 Google API 通訊。

  • 虛擬私有雲網路和子網路:
    • 確認叢集虛擬私有雲網路和子網路存在且設定正確。
    • 確認子網路有足夠的可用 IP 位址範圍。
  • Private Google Access (PGA):如果叢集 VM 具有內部 IP 位址,且需要存取 Cloud Storage、Cloud Logging 和其他作業的 Google API,請確認子網路已啟用 Private Google Access。根據預設,使用 2.2 以上版本映像檔建立的 Managed Service for Apache Spark 叢集,會佈建僅限內部 IP 位址的 VM,並在叢集區域子網路上啟用 Private Google Access。
  • Private Service Connect (PSC):如果您使用 Private Service Connect 存取 Google API,請確認已為 Managed Service for Apache Spark 依賴的 Google API 正確設定必要的 Private Service Connect 端點,例如 dataproc.googleapis.com、storage.googleapis.com、compute.googleapis.com 和 logging.googleapis.com。API 的 DNS 項目必須解析為私人 IP 位址。請注意,使用 Private Service Connect 並不代表您不需要使用虛擬私有雲對接,與其他客戶自行管理的虛擬私有雲網路通訊。
  • 虛擬私有雲對等互連:如果叢集會與其他虛擬私有雲網路中的資源通訊,例如 Shared VPC 主機專案或其他客戶虛擬私有雲,請確認虛擬私有雲對等互連設定正確,且路由會傳播。
  • 防火牆規則:

    • 預設規則:確認預設防火牆規則 (例如 allow-internal 或 allow-ssh) 不會過於嚴格。
    • 自訂規則:如果已設定自訂防火牆規則,請確認這些規則允許必要的通訊路徑:

      • 叢集內的內部通訊 (-m 和 -w 節點之間)。
      • 從叢集 VM 傳出至 Google API 的流量,使用公開 IP 或網際網路閘道、Private Google Access 或 Private Service Connect 端點。

      • 工作所依賴的任何外部資料來源或服務的流量。

  • DNS 解析:確認叢集執行個體可以正確解析 Google API 和任何內部或外部服務的 DNS 名稱。

疑難排解提示:

  • 檢查網路設定:檢查部署叢集的虛擬私有雲網路和子網路設定。
  • 檢查防火牆規則:查看虛擬私有雲網路或 Shared VPC 主機專案中的防火牆規則。
  • 測試連線能力:在叢集子網路中啟動臨時 Compute Engine VM,然後執行下列步驟:
    • ping 或 curl 至外部 Google API 網域,例如 storage.googleapis.com。
    • nslookup,確認 DNS 解析為預期的 IP 位址 (Private Google Access 或 Private Service Connect)。
    • 執行 Google Cloud 連線能力測試,診斷從測試 VM 到相關端點的路徑。

初始化動作失敗

Managed Service for Apache Spark 初始化動作是指在建立叢集期間,於叢集 VM 上執行的指令碼。如果這些指令碼發生錯誤,叢集可能無法啟動。

疑難排解提示:

  • 檢查記錄,找出初始化動作錯誤:在 Cloud Logging 中,尋找與叢集執行個體 init-actions 或 startup-script 相關的記錄項目。
  • 檢查指令碼路徑和權限:確認初始化動作指令碼正確位於 Cloud Storage 中,且叢集 VM 服務帳戶具備讀取 Cloud Storage 指令碼所需的 Storage Object Viewer 角色。
  • 偵錯指令碼邏輯:在模擬叢集環境的獨立 Compute Engine VM 上測試指令碼邏輯,找出錯誤。在指令碼中加入詳細記錄。

區域資源可用性 (缺貨)

有時,某個區域或可用區中的機器類型或資源可能會暫時無法使用 (缺貨)。這通常會導致與專案配額問題無關的 RESOURCE_EXHAUSTED 錯誤。

疑難排解提示:

  • 嘗試其他可用區或區域:嘗試在同一區域內的其他可用區或不同區域建立叢集。
  • 使用自動選擇可用區位置功能:使用 Managed Service for Apache Spark 的自動選擇可用區位置功能,自動選取有容量的可用區。
  • 調整機型:如果使用自訂或特殊機型,請嘗試標準機型,看看能否解決問題。

與 Cloud Customer Care 團隊聯絡

如果叢集故障問題持續發生,請與 Cloud Customer Care 團隊聯絡。說明叢集故障問題和已採取的疑難排解步驟。此外,請提供下列資訊:

  • 叢集診斷資料
  • 下列指令的輸出內容:
      gcloud dataproc clusters describe CLUSTER_NAME \
          --region=REGION
      
  • 已匯出失敗叢集的記錄。

使用 gcpdiag 工具

gcpdiag 是開放原始碼工具。並非官方支援的 Google Cloud 產品。您可以使用 gcpdiag 工具,找出並修正 Google Cloud專案問題。詳情請參閱 GitHub 上的 gcpdiag 專案。

gcpdiag 工具會執行下列檢查,協助您找出 Managed Service for Apache Spark 叢集建立問題:

  • 資源用盡錯誤:評估 Logs Explorer 記錄,找出區域和可用區中的資源用盡情況。
  • 配額不足:檢查 Managed Service for Apache Spark 叢集專案中的可用配額。
  • 網路設定不完整:執行網路連線測試,包括檢查必要的防火牆規則,以及外部和內部 IP 設定。如果叢集已刪除,gcpdiag 工具就無法執行網路連線能力檢查。
  • 跨專案設定不正確:檢查跨專案服務帳戶,並查看其他角色和組織政策強制執行情況。
  • 缺少共用虛擬私有雲網路 IAM 角色:如果 Managed Service for Apache Spark 叢集使用 Shared VPC 網路,請檢查是否已新增必要的服務帳戶角色。
  • 初始化動作失敗:評估 Logs Explorer 記錄,找出初始化動作指令碼失敗和逾時。

如需 gcpdiag dataproc 步驟清單 (包括叢集建立步驟),請參閱「Managed Service for Apache Spark 步驟」。

執行 gcpdiag 指令

您可以在Google Cloud 控制台的 Cloud Shell 或 Docker 容器中執行 gcpdiag 指令。

Google Cloud 控制台

  1. 完成並複製下列指令。
  2. gcpdiag runbook managed-spark/cluster-creation \
        --parameter project_id=PROJECT_ID \
        --parameter cluster_name=CLUSTER_NAME \
        --parameter OPTIONAL_FLAGS
  3. 開啟 Google Cloud 控制台,然後啟用 Cloud Shell。
  4. 開啟 Cloud 控制台
  5. 貼上複製的指令。
  6. 執行 gcpdiag 指令,下載 gcpdiag Docker 映像檔,然後執行診斷檢查。視情況按照輸出內容中的指示修正失敗的檢查項目。

Docker

您可以使用包裝函式執行 gcpdiag,在 Docker 容器中啟動 gcpdiag。必須安裝 Docker 或 Podman。

  1. 複製下列指令,並在本機工作站執行。
    curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
  2. 執行 gcpdiag 指令。
    ./gcpdiag runbook managed-spark/cluster-creation \
        --parameter project_id=PROJECT_ID \
        --parameter cluster_name=CLUSTER_NAME \
        --parameter OPTIONAL_FLAGS

查看這個 Runbook 的可用參數。

更改下列內容:

    • PROJECT_ID:包含 資源的專案 ID
    • CLUSTER_NAME:專案中目標 Managed Service for Apache Spark 叢集的名稱
    • OPTIONAL_PARAMETERS:新增一或多個下列選用參數。如果叢集已刪除,則必須提供這些參數。
      • cluster_uuid:專案中目標 Managed Service for Apache Spark 叢集的 UUID
      • service_account:Managed Service for Apache Spark 叢集 VM 服務帳戶
      • subnetwork:Managed Service for Apache Spark 叢集子網路完整 URI 路徑
      • internal_ip_only:是非題
      • cross_project:如果 Managed Service for Apache Spark 叢集使用其他專案中的 VM 服務帳戶,則為跨專案 ID

實用旗標:

如需所有 gcpdiag 工具旗標的清單和說明,請參閱 gcpdiag 使用說明。

後續步驟