排解叢集建立問題

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

常見的叢集建立錯誤訊息

  • 使用者未獲授權以服務帳戶身分執行動作

    原因:嘗試建立 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)。

  • 作業逾時:只有 0 個資料節點/節點管理員正在執行,最少需要 2 個。

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

    解決方法:

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

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

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

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

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

    解決方法:

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

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

    原因:您的 CPU磁碟IP 位址要求超出可用配額。

    解決方法:透過Google Cloud 控制台申請更多配額。

  • 初始化動作失敗

    原因:叢集建立期間提供的初始化動作安裝失敗。

    解決方法:

  • 無法初始化節點 CLUSTER-NAME-m。... See output in: <gs://PATH_TO_STARTUP_SCRIPT_OUTPUT>

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

    解決方法:

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

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

    解決方法:

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

    原因: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
    
  • 等待執行個體 DATAPROC_CLUSTER_VM_NAME 回報逾時網路無法連線: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 位址之間進行測試。如要取得目前的 Managed Service for Apache Spark 控制 API IP 位址,請使用下列指令:
    dig dataproccontrol-REGION.googleapis.com A
    

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

    連線測試結果有助於瞭解通往預設網際網路閘道的路徑,以及輸出允許防火牆是否已正確設定。

    根據連線能力測試結果:

  • 因更新而發生錯誤

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

    解決方法:

    • 重設叢集:開啟支援單,附上診斷 TAR 檔案,並要求將叢集重設為「RUNNING」狀態。

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

叢集疑難排解提示

本節提供額外指引,協助排解可能導致無法建立 Managed Service for Apache Spark 叢集的常見問題。

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

常見症狀

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

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

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

查看叢集記錄

診斷叢集建立失敗問題時,一開始的重要步驟是查看 Cloud Logging 中的詳細叢集記錄。

  1. 前往「Logs Explorer」:在 Google Cloud 控制台中開啟「Logs Explorer」
  2. 篩選 Managed Service for Apache Spark 叢集:
    • 在「資源」下拉式選單中,選取 Cloud Managed Service for Apache Spark Cluster
    • 輸入cluster_nameproject_id。您也可以依location (區域) 篩選。
  3. 檢查記錄項目:
    • 找出叢集建立失敗時間附近的 ERRORWARNING 層級訊息。
    • 請注意 master-startupworker-startupagent 元件的記錄,深入瞭解 VM 層級或 Managed Service for Apache Spark 代理程式問題。
    • 如要深入瞭解 VM 開機時間問題,請依 resource.type="gce_instance" 篩選記錄,並尋找與叢集節點相關聯的執行個體名稱 (例如 CLUSTER_NAME-mCLUSTER_NAME-w-0) 傳送的訊息。序列埠控制台記錄可揭露 VM 生命週期早期發生的網路設定問題、磁碟問題和指令碼失敗情形。

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

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

IAM 權限不足

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

  • 必要的工作站角色:確認 VM 服務帳戶具有「Managed Service for Apache Spark 工作站」角色 (roles/dataproc.worker)。這個角色具備 Managed Service for Apache Spark 管理叢集資源所需的最低權限。
  • 資料存取權:如果作業會從 Cloud Storage 或 BigQuery 讀取/寫入資料,服務帳戶需要相關角色,例如 Cloud Storage 的 Storage Object ViewerStorage Object CreatorStorage Object Admin,或是 BigQuery 的 BigQuery Data ViewerBigQuery Editor
  • 記錄權限:服務帳戶必須具備可將記錄寫入 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 與管理員」>「IAM」頁面。依「服務」篩選「Compute Engine API」和「Dataproc API」。
  • 檢查用量與限制:找出達到或接近限制的配額。
  • 如有需要,請申請提高配額。

網路設定問題

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

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

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

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

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

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

疑難排解提示:

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

初始化動作失敗

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

疑難排解提示:

  • 檢查初始化動作錯誤的記錄:在 Cloud Logging 中,尋找與叢集執行個體相關的 init-actionsstartup-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 叢集使用共用 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 的 wrapper,在 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:True 或 False
      • cross_project:如果 Managed Service for Apache Spark 叢集使用其他專案中的 VM 服務帳戶,則為跨專案 ID

實用旗標:

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

後續步驟