Crea una imagen personalizada del servicio administrado para Apache Spark

Puedes crear un clúster de Managed Service para Apache Spark con una imagen personalizada que incluya tus paquetes preinstalados. En esta página, se muestra cómo crear una imagen personalizada y, luego, instalarla en un clúster de Managed Service para Apache Spark.

Limitaciones y consideraciones de uso

  • Duración de la imagen personalizada: Para garantizar que los clústeres reciban las últimas actualizaciones de servicio y correcciones de errores, la creación de clústeres con una imagen personalizada se limita a 365 días desde la fecha de creación de la imagen personalizada. Ten en cuenta que los clústeres existentes creados con una imagen personalizada pueden ejecutarse de forma indefinida.

    Es posible que debas usar la automatización si deseas crear clústeres con una imagen personalizada específica por un período superior a 365 días. Para obtener más información, consulta Cómo crear un clúster con una imagen personalizada vencida.

  • Solo para Linux: Las instrucciones de este documento se aplican solo a sistemas operativos de Linux. Es posible que otros sistemas operativos sean compatibles con versiones futuras de Managed Service para Apache Spark.

  • Imágenes base compatibles: Las compilaciones de imágenes personalizadas requieren que se comience desde una imagen base de Managed Service para Apache Spark. Se admiten las siguientes imágenes base: Debian, Rocky Linux y Ubuntu.

  • Cómo usar componentes opcionales:

    Independientemente de la imagen base que se use para tu imagen personalizada, cuando crees tu clúster, debes enumerar o seleccionar los componentes opcionales.

    Ejemplo: Comando de Google Cloud CLI para crear un clúster:

    gcloud dataproc clusters create CLUSTER_NAME
        --image=CUSTOM_IMAGE_URI  \
        --optional-components=COMPONENT_NAME \
        ... other flags
    

    Si el nombre del componente no se especifica cuando creas el clúster, se borrará el componente opcional, incluidos los paquetes y las configuraciones del SO personalizados.

  • Usa imágenes personalizadas alojadas: Si usas una imagen personalizada alojada en otro proyecto, la cuenta de servicio del agente de servicios de Managed Service para Apache Spark en tu proyecto debe tener el permiso compute.images.get en la imagen del proyecto host. Para ello, otorga el rol roles/compute.imageUser en la imagen alojada a la cuenta de servicio del agente de servicio de Managed Service para Apache Spark de tu proyecto (consulta Comparte imágenes personalizadas dentro de una organización).

  • Usa secretos de MOK (clave del propietario de la máquina) de arranque seguro: Para habilitar el arranque seguro con tu imagen personalizada de Managed Service para Apache Spark, haz lo siguiente:

    1. Habilita la API de Secret Manager (secretmanager.googleapis.com). Managed Service para Apache Spark genera y administra un par de claves con el servicio de Secret Manager.

    2. Agrega la marca --service-account="SERVICE_ACCOUNT" al comando generate_custom_image.py cuando generes una imagen personalizada. Nota: Debes otorgar a la cuenta de servicio el rol de visualizador de Secret Manager (roles/secretmanager.viewer) en el proyecto y el rol de usuario con acceso a Secret Manager (roles/secretmanager.secretAccessor) en los secretos públicos y privados.

      Para obtener más información con ejemplos, consulta README.md y otros archivos en el directorio examples/secure-boot del repositorio GoogleCloudDataproc/custom-images en GitHub.

      Para inhabilitar el arranque seguro: De forma predeterminada, las secuencias de comandos de imágenes personalizadas de Managed Service para Apache Spark generan y administran un par de claves con Secret Manager cuando se ejecutan desde un clúster de Managed Service para Apache Spark. Si no quieres usar el arranque seguro con tu imagen personalizada, incluye --trusted-cert="" (valor de marca vacío) en el comando generate_custom_image.py cuando generes tu imagen personalizada.

Antes de comenzar

Asegúrate de configurar tu proyecto antes de generar tu imagen personalizada.

Configura tu proyecto

  1. Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Dataproc API, Compute Engine API, and Cloud Storage APIs.

    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 APIs

  5. Instala Google Cloud CLI.

  6. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  7. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Dataproc API, Compute Engine API, and Cloud Storage APIs.

    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 APIs

  11. Instala Google Cloud CLI.

  12. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

  13. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  14. Instala Python 3.11 o versiones posteriores
  15. Prepara una secuencia de comandos de personalización que instale paquetes personalizados o actualice la configuración, por ejemplo:
      #! /usr/bin/bash
      apt-get -y update
      apt-get install python-dev
      apt-get install python-pip
      pip install numpy
      

Crea un bucket de Cloud Storage en tu proyecto

  1. En la consola de Google Cloud , ve a la página Buckets de Cloud Storage.

    Ir a Buckets

  2. Haz clic en Crear.
  3. En la página Crear un bucket, ingresa la información de tu bucket. Para ir al paso siguiente, haz clic en Continuar.
    1. En la sección Primeros pasos, haz lo siguiente:
      • Ingresa un nombre único a nivel global que cumpla con los requisitos de nombre del bucket.
      • Para agregar una etiqueta de bucket, expande la sección Etiquetas (), haz clic en Agregar etiqueta y especifica una key y un value para tu etiqueta.
    2. En la sección Elige dónde almacenar tus datos, haz lo siguiente:
      1. Selecciona un tipo de ubicación
      2. Elige una ubicación en la que se almacenen de forma permanente los datos de tu bucket en el menú desplegable Tipo de ubicación.
        • Si seleccionas el tipo de ubicación birregional, también puedes habilitar la replicación turbo con la casilla de verificación correspondiente.
      3. Para configurar la replicación bucket buckets, selecciona Agregar replicación entre bucket a través del Servicio de transferencia de almacenamiento y sigue estos pasos:

        Configura la replicación entre buckets

        1. En el menú Bucket, selecciona un bucket.
        2. En la sección Configuración de replicación, haz clic en Configurar para configurar los parámetros del trabajo de replicación.

          Aparecerá el panel Configurar la replicación entre buckets.

          • Para filtrar los objetos que se replicarán por prefijo de nombre de objeto, ingresa un prefijo con el que quieras incluir o excluir objetos y, luego, haz clic en Agregar un prefijo.
          • Para establecer una clase de almacenamiento para los objetos replicados, selecciona una clase de almacenamiento en el menú Clase de almacenamiento. Si omites este paso, los objetos replicados usarán la clase de almacenamiento del bucket de destino de forma predeterminada.
          • Haz clic en Listo.
    3. En la sección Elige cómo almacenar tus datos, haz lo siguiente:
      1. Selecciona una clase de almacenamiento predeterminada para el bucket o Autoclass para la administración automática de clases de almacenamiento de los datos de tu bucket.
      2. Para habilitar el espacio de nombres jerárquico, en la sección Optimizar el almacenamiento para cargas de trabajo con uso intensivo de datos, selecciona Habilitar el espacio de nombres jerárquico en este bucket.
    4. En la sección Elige cómo controlar el acceso a los objetos, selecciona si tu bucket aplica o no la prevención del acceso público y elige un método de control de acceso para los objetos del bucket.
    5. En la sección Elige cómo proteger los datos de objetos, haz lo siguiente:
      • Selecciona cualquiera de las opciones de Protección de datos que desees configurar para tu bucket.
        • Para habilitar la eliminación no definitiva, haz clic en la casilla de verificación Política de eliminación no definitiva (para la recuperación de datos) y especifica la cantidad de días que deseas conservar los objetos después de la eliminación.
        • Para configurar el control de versiones de objetos, haz clic en la casilla de verificación Control de versiones de objetos (para el control de versión) y especifica la cantidad máxima de versiones por objeto y la cantidad de días después de los cuales vencen las versiones no actuales.
        • Para habilitar la política de retención en objetos y buckets, haz clic en la casilla de verificación Retención (para cumplimiento) y, luego, haz lo siguiente:
          • Para habilitar el bloqueo de retención de objetos, haz clic en la casilla de verificación Habilitar la retención de objetos.
          • Para habilitar el Bloqueo del bucket, haz clic en la casilla de verificación Establecer política de retención del bucket y elige una unidad de tiempo y una duración para tu período de retención.
      • Para elegir cómo se encriptarán los datos de tus objetos, expande la sección Encriptación de datos () y selecciona un método de encriptación de datos.
  4. Haz clic en Crear.

Genera una imagen personalizada

Usarás generate_custom_image.py, un programa de Python, para crear una imagen personalizada de Managed Service para Apache Spark.

Cómo funciona

El programa generate_custom_image.py inicia una instancia de VM de Compute Engine temporal con la imagen base especificada de Managed Service para Apache Spark y, luego, ejecuta la secuencia de comandos de personalización dentro de la instancia de VM para instalar paquetes personalizados o actualizar la configuración. Una vez que finaliza la secuencia de comandos de personalización, se cierra la instancia de VM y se crea una imagen personalizada de Managed Service para Apache Spark a partir del disco de la instancia de VM. La VM temporal se borra después de que se crea la imagen personalizada. La imagen personalizada se guarda y se puede usar para crear clústeres de Managed Service para Apache Spark.

El programa generate_custom_image.py usa gcloud CLI para ejecutar flujos de trabajo de varios pasos en Compute Engine.

Ejecuta el código

Bifurca o clona los archivos en GitHub en Imágenes personalizadas de Managed Service para Apache Spark.

Luego, ejecuta la secuencia de comandos generate_custom_image.py para que Managed Service para Apache Spark genere y guarde tu imagen personalizada.

python3 generate_custom_image.py \
    --image-name=CUSTOM_IMAGE_NAME \
    [--family=CUSTOM_IMAGE_FAMILY_NAME] \
    --dataproc-version=IMAGE_VERSION \
    --customization-script=LOCAL_PATH \
    --zone=ZONE \
    --gcs-bucket=gs://BUCKET_NAME \
    [--no-smoke-test]

Marcas necesarias

  • --image-name: Es el nombre de salida de tu imagen personalizada.

  • --dataproc-version: Es la versión de la imagen de Managed Service para Apache Spark que se usará en tu imagen personalizada. Especifica la versión en formato x.y.z-os o x.y.z-rc-os, por ejemplo, "2.0.69-debian10".

  • --customization-script: Es una ruta de acceso local a tu secuencia de comandos que la herramienta ejecutará para instalar tus paquetes personalizados o realizar otras personalizaciones. Esta secuencia de comandos se ejecuta como una secuencia de comandos de inicio de Linux solo en la VM temporal que se usa para crear la imagen personalizada. Puedes especificar una secuencia de comandos de inicialización diferente para otras acciones de inicialización que quieras realizar cuando creas un clúster con tu imagen personalizada.

    Imágenes entre proyectos: Si tu imagen personalizada se usa para crear clústeres en diferentes proyectos, puede producirse un error debido a la caché de comandos gcloud o gsutil almacenada en la imagen. Para evitar este problema, incluye el siguiente comando en tu secuencia de comandos de personalización para borrar las credenciales almacenadas en caché.

    rm -r /root/.gsutil /root/.config/gcloud
    
  • --zone: la zona de Compute Engine en la que generate_custom_image.py creará una VM temporal para usarla en la creación de tu imagen personalizada.

  • --gcs-bucket: Es un URI, en el formato gs://BUCKET_NAME, que apunta a tu bucket de Cloud Storage. generate_custom_image.py escribe archivos de registro en este bucket.

Marcas opcionales

  • --family: Es la familia de imágenes de la imagen personalizada. Las familias de imágenes se usan para agrupar imágenes similares y se pueden usar cuando se crea un clúster como un puntero a la imagen más reciente de la familia. Por ejemplo, custom-2-2-debian12
  • --no-smoke-test: Es una marca opcional que inhabilita las pruebas de humo en la imagen personalizada recién compilada. La prueba de humo crea un clúster de prueba de Managed Service para Apache Spark con la imagen recién compilada, ejecuta un trabajo pequeño y, luego, borra el clúster al final de la prueba. La prueba de humo se ejecuta de forma predeterminada para verificar que la imagen personalizada recién compilada pueda crear un clúster de Managed Service para Apache Spark funcional. Inhabilitar este paso con la marca --no-smoke-test acelera el proceso de compilación de la imagen personalizada, pero no se recomienda su uso.
  • --subnet: Es la subred que se usará para crear la VM que compila la imagen personalizada de Managed Service para Apache Spark. Si tu proyecto forma parte de una VPC compartida, debes especificar la URL completa de la subred con el siguiente formato: projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET.
  • --optional-components: Esta marca solo está disponible cuando se usan versiones de imágenes base 2.3 y posteriores. Es una lista de componentes opcionales, como SOLR, RANGER, TRINO, DOCKER, FLINK, HIVE_WEBHCAT, ZEPPELIN, HUDI, ICEBERG y PIG (PIG está disponible como componente opcional en las versiones de imagen 2.3 y posteriores), para instalar en la imagen.

    Ejemplo: Comando de Google Cloud CLI para crear un clúster:

    gcloud dataproc clusters create CLUSTER_NAME
        --image=CUSTOM_IMAGE_URI  \
        --optional-components=COMPONENT_NAME \
        ... other flags
    

Para obtener una lista de las marcas opcionales disponibles, consulta Optional Arguments en GitHub.

Si generate_custom_image.py se ejecuta correctamente, el imageURI de la imagen personalizada se mostrará en el resultado de la ventana de la terminal (el imageUri completo se muestra en negrita a continuación):

...
managedCluster:
    clusterName: verify-image-20180614213641-8308a4cd
    config:
      gceClusterConfig:
        zoneUri: ZONE
      masterConfig:
        imageUri: https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
...

INFO:__main__:Successfully built Dataproc custom image: CUSTOM_IMAGE_NAME
INFO:__main__:

#####################################################################
  WARNING: DATAPROC CUSTOM IMAGE 'CUSTOM_IMAGE_NAME'
           WILL EXPIRE ON 2018-07-14 21:35:44.133000.
#####################################################################

Etiquetas de versión de imagen personalizadas (uso avanzado)

Cuando se usa la herramienta de imagen personalizada estándar de Managed Service para Apache Spark, esta establece una etiqueta goog-dataproc-version en la imagen personalizada creada. La etiqueta refleja las capacidades y los protocolos de la función que usa Managed Service para Apache Spark para administrar el software en la imagen.

Uso avanzado: Si usas tu propio proceso para crear una imagen personalizada de Managed Service para Apache Spark, debes agregar la etiqueta goog-dataproc-version manualmente a tu imagen personalizada, de la siguiente manera:

  1. Extrae la etiqueta goog-dataproc-version de la imagen base de Managed Service para Apache Spark que se usó para crear la imagen personalizada.

    gcloud compute images describe ${BASE_DATAPROC_IMAGE} \
        --project cloud-dataproc \
        --format="value(labels.goog-dataproc-version)"
    

  2. Establece la etiqueta en la imagen personalizada.

    gcloud compute images add-labels IMAGE_NAME --labels=[KEY=VALUE,...]
    

Usar una imagen personalizada

La imagen personalizada se especifica cuando creas un clúster de Managed Service para Apache Spark. Una imagen personalizada se guarda en Imágenes de Cloud Compute y es válida para crear un clúster de Managed Service para Apache Spark por 365 días desde la fecha de su creación (consulta Cómo crear un clúster con una imagen personalizada vencida para usar una imagen personalizada después de la fecha de vencimiento de 365 días).

URI de la imagen personalizada

Pasa el imageUri de la imagen personalizada a la operación de creación de clúster. Este URI se puede especificar de alguna de las tres formas a continuación:

  1. URI completo:
    https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/`gs://`BUCKET_NAME`
  2. URI parcial: projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
  3. Nombre corto: CUSTOM_IMAGE_NAME

Las imágenes personalizadas también se pueden especificar por su URI de familia, que siempre elige la imagen más reciente dentro de la familia de imágenes.

  1. URI completo:
    https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/family/CUSTOM_IMAGE_FAMILY_NAME/var>
  2. URI parcial: projects/PROJECT_ID/global/images/family/CUSTOM_IMAGE_FAMILY_NAME

Cómo encontrar el URI de la imagen personalizada

Google Cloud CLI

Ejecuta el siguiente comando para enumerar los nombres de tus imágenes personalizadas.

gcloud compute images list

Pasa el nombre de tu imagen personalizada al siguiente comando para enumerar el URI (selfLink) de tu imagen personalizada.

gcloud compute images describe custom-image-name

Fragmento de salida:

...
name: CUSTOM_IMAGE_NAME
selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
...

Console

  1. Abre la página Compute Engine→Imágenes en la consola de Google Cloud y, luego, haz clic en el nombre de la imagen. Puedes insertar una consulta en el campo filter images para limitar la cantidad de imágenes que se muestran.
  2. Se abrirá la página Detalles de imágenes. Haz clic en Equivalent REST.
  3. La respuesta de REST enumera información adicional sobre la imagen, incluido el selfLink, que es el URI de la imagen.
    {
      ...
      "name": "my-custom-image",
      "selfLink": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME",
      "sourceDisk": ...,
      ...
    }
    

Crea un clúster con una imagen personalizada

crea un clúster con la gcloud CLI, la API de Managed Service para Apache Spark o la consola deGoogle Cloud .

gcloud CLI

Crea un clúster de Managed Service para Apache Spark con una imagen personalizada usando el comando dataproc clusters create con la marca --image.

Ejemplo:
gcloud dataproc clusters create CLUSTER-NAME \
    --image=CUSTOM_IMAGE_URI \
    --region=REGION \
    ... other flags

API de REST

Crea un clúster con una imagen personalizada especificando el URI de la imagen personalizada en el campo InstanceGroupConfig.imageUri en el objeto masterConfig, workerConfig y, si corresponde, secondaryWorkerConfig incluido en una solicitud a la API cluster.create.

Ejemplo: Solicitud REST para crear un clúster estándar de Managed Service para Apache Spark (un nodo principal y dos nodos de trabajador) con una imagen personalizada.

POST /v1/projects/PROJECT_ID/regions/REGION/clusters/
{
  "clusterName": "CLUSTER_NAME",
  "config": {
    "masterConfig": {
      "imageUri": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME"
    },
    "workerConfig": {
      "imageUri": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME"
    }
  }
}
  

Console

  1. Abre la página Crear un clúster de Managed Service para Apache Spark. Se selecciona el panel Configurar clúster.
  2. En la sección Control de versiones, haz clic en Cambiar. Selecciona la pestaña Imagen personalizada, elige la imagen personalizada que usarás para tu clúster de Managed Service para Apache Spark y, luego, haz clic en Seleccionar. Las VMs del clúster se aprovisionarán con la imagen personalizada seleccionada.

Anula las propiedades del clúster de Managed Service para Apache Spark con una imagen personalizada

Puedes usar imágenes personalizadas para anular las propiedades del clúster que se establecen durante la creación del clúster. Si creas un clúster con una imagen personalizada y la operación de creación del clúster establece propiedades con valores diferentes de los que establece tu imagen personalizada, los valores de propiedad establecidos por tu imagen personalizada tendrán prioridad.

Para establecer las propiedades del clúster con tu imagen personalizada, haz lo siguiente:

  1. En la secuencia de comandos de personalización de la imagen personalizada, crea un archivo dataproc.custom.properties en /etc/google-dataproc y, luego, establece los valores de propiedad del clúster en el archivo.

    • Archivo dataproc.custom.properties de muestra:
    dataproc.conscrypt.provider.enable=VALUE
    dataproc.logging.stackdriver.enable=VALUE
    
    • Fragmento de código de creación de archivos de secuencia de comandos de personalización de muestra para anular dos propiedades del clúster:
    cat <<EOF >/etc/google-managed-spark/dataproc.custom.properties
    dataproc.conscrypt.provider.enable=true
    dataproc.logging.stackdriver.enable=false
    EOF
    

Crea un clúster con una imagen personalizada vencida

De forma predeterminada, las imágenes personalizadas vencen 365 días después de la fecha de creación de la imagen. Puedes crear un clúster que use una imagen personalizada vencida si completas los pasos a continuación.

  1. Intenta crear un clúster de Managed Service para Apache Spark con una imagen personalizada vencida o una imagen personalizada que vencerá dentro de 10 días.

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --region=REGION \
        ... other flags
    
  2. La gcloud CLI emitirá un mensaje de error que incluye el nombre de la propiedad del clúster dataproc:dataproc.custom.image.expiration.token y el valor del token.

dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE

Copia la cadena TOKEN_VALUE en el portapapeles.

  1. Usa gcloud CLI para volver a crear el clúster de Managed Service para Apache Spark y agrega el TOKEN_VALUE copiado como una propiedad del clúster.

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --properties=dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE \
        --region=REGION \
        ... other flags
    

La creación del clúster con la imagen personalizada debería tener éxito.