Las cargas de trabajo por lotes y las sesiones interactivas de Serverless para Apache Spark se ejecutan con las credenciales del usuario final o de la cuenta de servicio. Cuando se usan credenciales de cuenta de servicio, la cuenta de servicio que se usa para ejecutar cargas de trabajo por lotes o sesiones interactivas depende de la versión del tiempo de ejecución del lote o de la sesión.
Cuentas de servicio de tiempo de ejecución anteriores a la versión 3.0
Las versiones del tiempo de ejecución de Spark anteriores a 3.0 con credenciales de cuenta de servicio usan la cuenta de servicio predeterminada de Compute Engine o una cuenta de servicio personalizada especificada por el usuario para enviar una carga de trabajo por lotes o crear una sesión interactiva.
Cuentas de servicio de tiempo de ejecución 3.0 o versiones posteriores
Las versiones del tiempo de ejecución de Spark 3.0 y posteriores con credenciales de cuenta de servicio usan una cuenta de servicio personalizada especificada por el usuario para enviar una carga de trabajo por lotes o crear una sesión interactiva.
Los tiempos de ejecución de Serverless para Apache Spark 3.0 y versiones posteriores crean la cuenta de servicio Agente de servicio de nodo de Resource Manager de Dataproc, service-project-number@gcp-sa-dataprocrmnode.iam.gserviceaccount.com, con el rol Agente de servicio de nodo de Resource Manager de Dataproc en un proyecto de usuario de Dataproc Google Cloud . Esta cuenta de servicio realiza las siguientes operaciones del sistema en recursos de Serverless para Apache Spark ubicados en el proyecto en el que se crea una carga de trabajo:
- Cloud Logging y Cloud Monitoring
- Operaciones básicas de nodos de Resource Manager de Dataproc, como
get,heartbeatymintOAuthToken
Ver y gestionar roles de cuentas de servicio de gestión de identidades y accesos
Para ver y gestionar los roles concedidos a la carga de trabajo por lotes o a la cuenta de servicio de sesión, sigue estos pasos:
En la consola de Google Cloud , ve a la página Gestión de identidades y accesos.
Haz clic en Incluir concesiones de roles proporcionadas por Google.
Consulta los roles que aparecen en la carga de trabajo por lotes o en la cuenta de servicio predeterminada o personalizada de la sesión.
En la siguiente imagen se muestra el rol Trabajador de Dataproc necesario que se asigna a la cuenta de servicio predeterminada de Compute Engine,
project_number-compute@developer.gserviceaccount.com, que Serverless para Apache Spark usa de forma predeterminada como cuenta de servicio de carga de trabajo o de sesión.
El rol de trabajador de Dataproc asignado a la cuenta de servicio predeterminada de Compute Engine en la sección IAM de la consola Google Cloud . Puedes hacer clic en el icono del lápiz que aparece en la fila de la cuenta de servicio para asignar o quitar roles de la cuenta de servicio.
Cómo usar una cuenta de servicio entre proyectos
Puedes enviar una carga de trabajo por lotes que utilice una cuenta de servicio de un proyecto distinto al proyecto de la carga de trabajo por lotes (el proyecto en el que se envía el lote). En esta sección, el proyecto en el que se encuentra la cuenta de servicio se denomina service account project, y el proyecto en el que se envía el lote se denomina batch project.
¿Por qué usar una cuenta de servicio entre proyectos para ejecutar una carga de trabajo por lotes? Una posible razón es que se hayan asignado roles de gestión de identidades y accesos a la cuenta de servicio del otro proyecto, lo que le proporciona acceso detallado a los recursos de ese proyecto.
Pasos de configuración
Los ejemplos de esta sección se aplican al envío de una carga de trabajo por lotes que se ejecuta con una versión del tiempo de ejecución anterior a 3.0.
En el proyecto de la cuenta de servicio:
Habilita la vinculación de cuentas de servicio entre proyectos.
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.enablepermission. Learn how to grant roles.Asigna a tu cuenta de correo (el usuario que crea el clúster) el rol Usuario de cuenta de servicio en el proyecto de la cuenta de servicio o, para tener un control más granular, en la cuenta de servicio del proyecto de la cuenta de servicio.
Para obtener más información, consulta los artículos Gestionar acceso a proyectos, carpetas y organizaciones para asignar roles a nivel de proyecto y Gestionar acceso a cuentas de servicio para asignar roles a nivel de cuenta de servicio.
Ejemplos de la CLI de gcloud:
El siguiente comando de ejemplo asigna al usuario el rol Usuario de cuenta de servicio a nivel de proyecto:
gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \ --member=USER_EMAIL \ --role="roles/iam.serviceAccountUser"
Notas:
USER_EMAIL: proporcione la dirección de correo de su cuenta de usuario con el formatouser:user-name@example.com.
El siguiente comando de ejemplo asigna al usuario el rol Usuario de cuenta de servicio a nivel de cuenta de servicio:
gcloud iam service-accounts add-iam-policy-binding VM_SERVICE_ACCOUNT_EMAIL \ --member=USER_EMAIL \ --role="roles/iam.serviceAccountUser"
Notas:
USER_EMAIL: proporcione la dirección de correo de su cuenta de usuario con el siguiente formato:user:user-name@example.com.
Asigna a la cuenta de servicio el rol Trabajador de Dataproc en el proyecto del lote.
Ejemplo de la CLI de gcloud:
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"
En el proyecto de lote:
Asigna a la cuenta de servicio del agente de servicio de Dataproc los roles Usuario de cuenta de servicio y Creador de tokens de cuenta de servicio en el proyecto de la cuenta de servicio o, para tener un control más granular, en la cuenta de servicio del proyecto de la cuenta de servicio. De esta forma, permites que la cuenta de servicio del agente de servicio de Dataproc del proyecto de lote cree tokens para la cuenta de servicio del proyecto de cuenta de servicio.
Para obtener más información, consulta los artículos Gestionar acceso a proyectos, carpetas y organizaciones para asignar roles a nivel de proyecto y Gestionar acceso a cuentas de servicio para asignar roles a nivel de cuenta de servicio.
Ejemplos de la CLI de gcloud:
Los siguientes comandos conceden a la cuenta de servicio del agente de servicio de Dataproc en el proyecto de lote los roles Usuario de cuenta de servicio y Creador de tokens de cuenta de servicio a nivel de proyecto:
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"
Los siguientes comandos de ejemplo asignan a la cuenta de servicio del agente de servicio de Dataproc en el proyecto de lote los roles Usuario de cuenta de servicio y Creador de tokens de cuenta de servicio a nivel de cuenta de servicio:
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"
Asigna a la cuenta de servicio del agente de servicio de Compute Engine del proyecto por lotes el rol Creador de tokens de cuenta de servicio en el proyecto de la cuenta de servicio o, para tener un control más granular, en la cuenta de servicio del proyecto de la cuenta de servicio. De esta forma, concedes a la cuenta de servicio del agente de servicio de Compute Agent en el proyecto de lote la capacidad de crear tokens para la cuenta de servicio en el proyecto de cuenta de servicio.
Para obtener más información, consulta los artículos Gestionar acceso a proyectos, carpetas y organizaciones para asignar roles a nivel de proyecto y Gestionar acceso a cuentas de servicio para asignar roles a nivel de cuenta de servicio.
Ejemplos de la CLI de gcloud:
El siguiente comando de ejemplo asigna el rol Creador de tokens de cuenta de servicio a la cuenta de servicio del agente de servicio de Compute Engine en el proyecto por lotes a nivel de proyecto:
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"
El siguiente comando de ejemplo asigna el rol Creador de tokens de cuenta de servicio a la cuenta de servicio del agente de servicio de Compute Engine en el proyecto del clúster a nivel de cuenta de servicio:
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"
Enviar la carga de trabajo por lotes
Una vez que hayas completado los pasos de configuración, podrás enviar una carga de trabajo por lotes. Asegúrate de especificar la cuenta de servicio del proyecto de la cuenta de servicio como la cuenta que se va a usar en la carga de trabajo por lotes.
Solucionar problemas basados en permisos
Si la cuenta de servicio que usa tu carga de trabajo o sesión por lotes no tiene los permisos correctos o suficientes, se producirán errores al crear lotes o sesiones, y se mostrará el mensaje "Driver compute node failed to initialize for batch in 600 seconds" (No se ha podido inicializar el nodo de cálculo del controlador para el lote en 600 segundos). Este error indica que el controlador de Spark no se ha podido iniciar en el periodo de tiempo de espera asignado, a menudo debido a la falta de acceso necesario a los recursos de Google Cloud .
Para solucionar este problema, comprueba que tu cuenta de servicio tenga los siguientes roles o permisos mínimos:
- Rol Trabajador de Dataproc (
roles/dataproc.worker): este rol otorga los permisos necesarios para que Serverless para Apache Spark gestione y ejecute cargas de trabajo y sesiones de Spark. - Lector de objetos de Storage (
roles/storage.objectViewer), Creador de objetos de Storage (roles/storage.objectCreator) o Administrador de objetos de Storage (roles/storage.admin): si tu aplicación Spark lee o escribe en segmentos de Cloud Storage, la cuenta de servicio necesita los permisos adecuados para acceder a los segmentos. Por ejemplo, si los datos de entrada están en un segmento de Cloud Storage, se requiereStorage Object Viewer. Si tu aplicación escribe la salida en un segmento de Cloud Storage, se necesitaStorage Object CreatoroStorage Object Admin. - Editor de datos de BigQuery (
roles/bigquery.dataEditor) o Lector de datos de BigQuery (roles/bigquery.dataViewer): si tu aplicación Spark interactúa con BigQuery, comprueba que la cuenta de servicio tenga los roles de BigQuery adecuados. - Permisos de Cloud Logging: la cuenta de servicio necesita permisos para escribir registros en Cloud Logging y depurar de forma eficaz. Normalmente, el rol
Logging Writer(roles/logging.logWriter) es suficiente.
Errores habituales relacionados con permisos o acceso
Falta el rol
dataproc.worker: sin este rol principal, la infraestructura de Serverless para Apache Spark no puede aprovisionar ni gestionar correctamente el nodo de controlador.Permisos de Cloud Storage insuficientes: si tu aplicación Spark intenta leer datos de entrada o escribir datos de salida en un segmento de Cloud Storage sin los permisos de cuenta de servicio necesarios, el controlador no podrá inicializarse porque no tiene acceso a recursos críticos.
Problemas de red o de firewall: Controles de Servicio de VPC o las reglas de firewall pueden bloquear por error el acceso de la cuenta de servicio a las APIs o los recursos de Google Cloud .
Para verificar y actualizar los permisos de la cuenta de servicio, sigue estos pasos:
- Ve a la página IAM y administración > IAM en la Google Cloud consola.
- Busca la cuenta de servicio que se usa en tus cargas de trabajo o sesiones por lotes.
- Comprueba que se han asignado los roles necesarios. Si no es así, añádelos.
Para ver una lista de los roles y permisos de Serverless para Apache Spark, consulta Permisos y roles de IAM de Serverless para Apache Spark.