Google Cloud Serverless for Apache Spark 服务账号

Serverless for Apache Spark 批量工作负载和交互式会话可使用最终用户或服务账号凭据运行。使用服务账号凭据时,用于运行批处理工作负载或交互式会话的服务账号取决于批处理或会话运行时版本。

3.0 之前的运行时服务账号

使用服务账号凭据的 3.0 之前的 Spark 运行时版本使用 Compute Engine 默认服务账号或用户指定的自定义服务账号来提交批处理工作负载或创建交互式会话。

3.0 及更高版本的运行时服务账号

如果 Spark 运行时版本为 3.0 及更高版本,且具有服务账号凭据,则会使用用户指定的自定义服务账号来提交批处理工作负载或创建交互式会话。

Serverless for Apache Spark 3.0 及更高版本的运行时会在 Dataproc 用户的 Google Cloud 项目中创建具有 Dataproc Resource Manager Node Service Agent 角色的 Dataproc Resource Manager Node Service Agent 服务账号 service-project-number@gcp-sa-dataprocrmnode.iam.gserviceaccount.com。此服务账号对创建工作负载的项目中的 Serverless for Apache Spark 资源执行以下系统操作:

  • Cloud Logging 和 Cloud Monitoring
  • Dataproc Resource Manager 节点基本操作,例如 getheartbeatmintOAuthToken

查看和管理 IAM 服务账号角色

如需查看和管理向批处理工作负载或会话服务账号授予的角色,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    前往 IAM

  2. 点击包括 Google 提供的角色授权

  3. 查看为批处理工作负载或会话默认/自定义服务账号列出的角色。

    下图显示了为 Compute Engine 默认服务账号 project_number-compute@developer.gserviceaccount.com 列出的必需的 Dataproc Worker 角色,Serverless for Apache Spark 在默认情况下使用该服务账号作为工作负载或会话服务账号。

    IAM 控制台中 Compute Engine 默认服务账号的 Dataproc Worker 角色
    在 Google Cloud 控制台的 IAM 部分,分配给 Compute Engine 默认服务账号的 Dataproc Worker 角色。
  4. 您可以点击服务账号行上显示的铅笔图标,以授予或移除服务账号角色

如何使用跨项目服务账号

您可以提交使用服务账号的批处理工作负载,该服务账号来自与批处理工作负载项目(提交批处理的项目)不同的项目。在本部分中,服务账号所在的项目称为 service account project,提交批处理作业的项目称为 batch project

为何使用跨项目服务账号来运行批处理工作负载?一种可能的原因是,其他项目中的服务账号已被分配 IAM 角色,这些角色可提供对相应项目中资源的精细访问权限。

设置步骤

本部分中的示例适用于提交使用低于 3.0 的运行时版本执行的批处理工作负载。

  1. 在服务账号项目中:

    1. 允许跨项目关联服务账号

    2. 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 the serviceusage.services.enable permission. Learn how to grant roles.

      Enable the API

    3. 向您的电子邮件账号(创建集群的用户)授予适用于服务账号项目的 Service Account User 角色,或者向服务账号项目中的服务账号授予该角色,以实现更精细的控制。

      如需了解详情,请参阅管理对项目、文件夹和组织的访问权限,以便在项目级别授予角色,并参阅管理对服务账号的访问权限,以便在服务账号级别授予角色。

      gcloud CLI 示例:

      以下示例命令会在项目级别向用户授予 Service Account User 角色:

      gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
          --member=USER_EMAIL \
          --role="roles/iam.serviceAccountUser"
      

      注意:

      • USER_EMAIL:提供您的用户账号电子邮件地址,格式为:user:user-name@example.com

      以下示例命令会在服务账号级别向用户授予 Service Account User 角色:

      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
    4. 向服务账号授予批处理项目的 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"
      
  2. 在批处理项目中:

    1. Dataproc 服务代理服务账号授予适用于服务账号项目的 Service Account User 角色和 Service Account Token Creator 角色,或者向服务账号项目中的服务账号授予这些角色,以实现更精细的控制。通过执行此操作,您使批处理项目中的 Dataproc 服务代理服务账号可以为服务账号项目中的服务账号创建令牌。

      如需了解详情,请参阅管理对项目、文件夹和组织的访问权限,以便在项目级别授予角色,并参阅管理对服务账号的访问权限,以便在服务账号级别授予角色。

      gcloud CLI 示例:

      以下命令会在项目级向批处理项目中的 Dataproc 服务代理服务账号授予 Service Account User 角色和 Service Account Token Creator 角色:

      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 Service Agent 服务账号授予 Service Account User 角色和 Service Account Token Creator 角色:

      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"
      
    2. 向批处理项目中的 Compute Engine Service Agent 服务账号授予适用于服务账号项目的 Service Account Token Creator 角色,或者向服务账号项目中的服务账号授予该角色,以实现更精细的控制。通过执行此操作,您使批处理项目中的 Compute Engine Service Agent 服务账号有能力为服务账号项目中的服务账号创建令牌。

      如需了解详情,请参阅管理对项目、文件夹和组织的访问权限,以便在项目级别授予角色,并参阅管理对服务账号的访问权限,以便在服务账号级别授予角色。

      gcloud CLI 示例:

      以下示例命令会在项目级别为批处理项目中的 Compute Engine Service Agent 服务账号授予 Service Account Token Creator 角色:

      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 Service Agent 服务账号授予 Service Account Token Creator 角色:

      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"
      

提交批处理工作负载

完成设置步骤后,您可以提交批处理工作负载。请务必在服务账号项目中指定要用于批处理工作负载的服务账号。

排查基于权限的失败问题

如果您的批处理工作负载或会话所使用的服务账号的权限不正确或不足,可能会导致批处理或会话创建失败,并报告“Driver compute node failed to initialize for batch in 600 seconds”错误消息。此错误表示 Spark 驱动程序无法在分配的超时期限内启动,通常是由于缺少对 Google Cloud 资源的必要访问权限。

如需排查此问题,请验证您的服务账号是否具有以下最低角色或权限:

  • Dataproc Worker 角色 (roles/dataproc.worker):此角色授予 Serverless for Apache Spark 管理和执行 Spark 工作负载及会话所需的权限。
  • Storage Object Viewer (roles/storage.objectViewer)、Storage Object Creator (roles/storage.objectCreator) 或 Storage Object Admin (roles/storage.admin):如果您的 Spark 应用从 Cloud Storage 存储分区读取数据或向其中写入数据,则服务账号需要具有访问相应存储分区的适当权限。例如,如果您的输入数据位于 Cloud Storage 存储桶中,则需要 Storage Object Viewer。如果您的应用将输出写入 Cloud Storage 存储桶,则需要 Storage Object CreatorStorage Object Admin
  • BigQuery Data Editor (roles/bigquery.dataEditor) 或 BigQuery Data Viewer (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 或资源。

如需验证和更新服务账号权限,请执行以下操作:

  1. 前往 Google Cloud 控制台中的 IAM 和管理 > IAM 页面。
  2. 找到用于批量工作负载或会话的服务账号。
  3. 验证是否已分配必要的角色。如果没有,请添加。

如需查看 Serverless for Apache Spark 角色和权限的列表,请参阅 Serverless for Apache Spark 权限和 IAM 角色