除非您在提交批次工作負載、建立工作階段或建立工作階段執行階段範本時指定自訂服務帳戶,否則 Serverless for Apache Spark 批次工作負載或互動式工作階段會以 Compute Engine 預設服務帳戶執行。
安全性規定:您必須具備服務帳戶 ActAs
權限,才能執行批次工作負載或互動式工作階段。「Service Account User
」角色具備這項權限。如要進一步瞭解服務帳戶權限,請參閱服務帳戶驗證的角色。
必要 Dataproc 工作站角色
批次工作負載或工作階段服務帳戶必須具備 IAM Dataproc 工作者角色。根據預設,Serverless for Apache Spark 使用的 Compute Engine 預設服務帳戶 project_number-compute@developer.gserviceaccount.com
具有這個角色。如果您在建立批次工作負載、工作階段或工作階段範本時指定其他服務帳戶,則必須將 Dataproc Worker 角色授予該服務帳戶。如要執行其他作業 (例如從 Cloud Storage 或 BigQuery 讀取及寫入資料),可能需要其他角色。
在某些專案中,系統可能會自動為批次工作負載或工作階段服務帳戶授予專案「編輯者」角色,其中包含 Dataproc 工作者角色權限,以及 Serverless for Apache Spark 不需要的其他權限。為遵循最低權限的安全性最佳做法原則,請將服務帳戶的「編輯者」角色替換為「Dataproc 工作站」角色。
排解權限相關失敗問題
如果批次工作負載或工作階段使用的服務帳戶權限不正確或不足,可能會導致批次或工作階段建立失敗,並回報「Driver compute node failed to initialize for batch in 600 seconds」(驅動程式運算節點無法在 600 秒內初始化批次) 錯誤訊息。這項錯誤表示 Spark 驅動程式無法在指定逾時時間內啟動,通常是因為缺少 Google Cloud 資源的必要存取權。
如要排解這個問題,請確認服務帳戶是否具備下列最低角色或權限:
- Dataproc Worker 角色 (
roles/dataproc.worker
):這個角色會授予 Serverless for Apache Spark 必要權限,以便管理及執行 Spark 工作負載和工作階段。 - Storage 物件檢視者 (
roles/storage.objectViewer
)、Storage 物件建立者 (roles/storage.objectCreator
) 或 Storage 物件管理員 (roles/storage.admin
):如果 Spark 應用程式會從 Cloud Storage 值區讀取或寫入資料,服務帳戶必須具備適當的權限才能存取值區。舉例來說,如果輸入資料位於 Cloud Storage 值區,則需要Storage Object Viewer
。如果應用程式將輸出內容寫入 Cloud Storage 值區,則需要Storage Object Creator
或Storage Object Admin
。 - BigQuery 資料編輯者 (
roles/bigquery.dataEditor
) 或 BigQuery 資料檢視者 (roles/bigquery.dataViewer
):如果 Spark 應用程式會與 BigQuery 互動,請確認服務帳戶具有適當的 BigQuery 角色。 - Cloud Logging 權限:服務帳戶需要權限才能將記錄寫入 Cloud Logging,以便有效偵錯。通常
Logging Writer
角色 (roles/logging.logWriter
) 就已足夠。
常見的權限或存取相關失敗
缺少
dataproc.worker
角色:如果沒有這個核心角色,Serverless for Apache Spark 基礎架構就無法正確佈建及管理驅動程式節點。Cloud Storage 權限不足:如果 Spark 應用程式嘗試從 Cloud Storage 值區讀取輸入資料或將輸出資料寫入該值區,但沒有必要的服務帳戶權限,驅動程式可能會因為無法存取重要資源而無法初始化。
網路或防火牆問題:VPC Service Controls 或防火牆規則可能會不慎封鎖服務帳戶對 Google Cloud API 或資源的存取權。
如要驗證及更新服務帳戶權限,請按照下列步驟操作:
- 在 Google Cloud 控制台中,前往「IAM & Admin」(IAM 與管理) >「IAM」(身分與存取權管理) 頁面。
- 找出用於批次工作負載或工作階段的服務帳戶。
- 確認已指派必要角色。如果沒有,請新增。
如需 Serverless for Apache Spark 角色和權限的清單,請參閱Serverless for Apache Spark 權限和 IAM 角色。
適用於 Apache Spark 3.0 以上版本的無伺服器執行階段
適用於 Apache Spark 3.0 以上版本的 Serverless 執行階段會建立 Dataproc Resource Manager 節點服務代理服務帳戶 (service-project-number@gcp-sa-dataprocrmnode.iam.gserviceaccount.com
),並在 Dataproc 使用者 Google Cloud 專案中指派 Dataproc Resource Manager 節點服務代理角色。這個服務帳戶會在工作負載建立所在的專案中,對 Serverless for Apache Spark 資源執行下列系統作業:
- Cloud Logging 和 Cloud Monitoring
- Dataproc Resource Manager 節點基本操作,例如
get
、heartbeat
和mintOAuthToken
查看及管理 IAM 服務帳戶角色
如要查看及管理授予批次工作負載或工作階段服務帳戶的角色,請按照下列步驟操作:
前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。
按一下「包含 Google 提供的角色授權」。
查看批次工作負載或工作階段服務帳戶列出的角色。 下圖顯示 Compute Engine 預設服務帳戶的必要 Dataproc 工作者角色,
project_number-compute@developer.gserviceaccount.com
,Serverless for Apache Spark 預設會將這個帳戶做為工作負載或工作階段服務帳戶。指派給 Google Cloud 控制台 IAM 區段中 Compute Engine 預設服務帳戶的 Dataproc 工作站角色。 您可以點選服務帳戶列中顯示的鉛筆圖示,授予或移除服務帳戶角色。
跨專案服務帳戶
您可以提交使用專案服務帳戶的批次工作負載,該專案與批次工作負載專案 (提交批次的專案) 不同。在本節中,服務帳戶所在的專案稱為 service account project
,而提交批次的專案則稱為 batch project
。
為什麼要使用跨專案服務帳戶執行批次工作負載?其中一個可能的原因是,其他專案中的服務帳戶已獲派 IAM 角色,可精細控管該專案中資源的存取權。
設定步驟
在服務帳戶專案中:
Enable the Dataproc API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.在服務帳戶專案中,將服務帳戶使用者角色授予您的電子郵件帳戶 (建立叢集的使用者),或在服務帳戶專案中,將該角色授予服務帳戶,以進行更精細的控制。
詳情請參閱「管理專案、資料夾和機構的存取權」一文,瞭解如何授予專案層級的角色,以及「管理服務帳戶的存取權」一文,瞭解如何授予服務帳戶層級的角色。
gcloud CLI 範例:
以下範例指令會授予使用者專案層級的服務帳戶使用者角色:
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=USER_EMAIL \ --role="roles/iam.serviceAccountUser"
注意:
USER_EMAIL
:提供使用者帳戶電子郵件地址,格式為user:user-name@example.com
。
下列範例指令會在服務帳戶層級,將服務帳戶使用者角色授予使用者:
gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \ --member=USER_EMAIL \ --role="roles/iam.serviceAccountUser"
注意:
USER_EMAIL
:請提供使用者帳戶電子郵件地址,格式為:user:user-name@example.com
。
將批次專案的「Dataproc Worker」角色授予服務帳戶。
gcloud CLI 範例:
gcloud projects add-iam-policy-binding BATCH_PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \ --role="roles/dataproc.worker"
在批次專案中:
在服務帳戶專案中,將服務帳戶使用者和服務帳戶憑證建立者角色授予Dataproc 服務代理程式服務帳戶,或在服務帳戶專案中,將這些角色授予服務帳戶,以進行更精細的控制。這樣做可讓批次專案中的 Dataproc 服務代理程式服務帳戶,為服務帳戶專案中的服務帳戶建立權杖。
詳情請參閱「管理專案、資料夾和機構的存取權」一文,瞭解如何授予專案層級的角色,以及「管理服務帳戶的存取權」一文,瞭解如何授予服務帳戶層級的角色。
gcloud CLI 範例:
下列指令會授予批次專案中的 Dataproc 服務代理人服務帳戶專案層級的「服務帳戶使用者」和「服務帳戶權杖建立者」角色:
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=serviceAccount:service-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=serviceAccount:service-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
下列範例指令會向批次專案中的 Dataproc 服務代理程式服務帳戶,授予服務帳戶層級的「服務帳戶使用者」和「服務帳戶權杖建立者」角色:
gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \ --member=serviceAccount:service-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountUser"
gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \ --member=serviceAccount:service-BATCH_PROJECT_NUMBER@dataproc-accounts.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
在批次專案中,將服務帳戶專案的服務帳戶憑證建立者角色授予Compute Engine 服務代理人服務帳戶,或在服務帳戶專案中,將該角色授予服務帳戶,以進行更精細的控制。這樣做可授予批次專案中的 Compute Agent Service Agent 服務帳戶權限,為服務帳戶專案中的服務帳戶建立權杖。
詳情請參閱「管理專案、資料夾和機構的存取權」一文,瞭解如何授予專案層級的角色,以及「管理服務帳戶的存取權」一文,瞭解如何授予服務帳戶層級的角色。
gcloud CLI 範例:
下列範例指令會在專案層級,將服務帳戶權杖建立者角色授予批次專案中的 Compute Engine 服務代理程式服務帳戶:
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=serviceAccount:service-BATCH_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
下列範例指令會授予叢集專案中的 Compute Engine 服務代理程式服務帳戶服務帳戶層級的服務帳戶權杖建立者角色:
gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \ --member=serviceAccount:service-BATCH_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \ --role="roles/iam.serviceAccountTokenCreator"
提交批次工作負載
完成設定步驟後,即可提交批次工作負載。請務必在服務帳戶專案中指定服務帳戶,做為批次工作負載使用的服務帳戶。