Crea una imagen personalizada de Dataproc

Los clústeres de Dataproc se pueden aprovisionar con una imagen personalizada que incluya paquetes ya instalados de un usuario. En esta página, se muestra cómo crear una imagen personalizada y, luego, instalarla en un clúster de Dataproc.

Limitaciones y consideraciones de uso

  • Vida útil de la imagen personalizada: Para garantizar que los clústeres reciban las actualizaciones de servicio y correcciones de errores más recientes, 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 se pueden ejecutar 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 Linux. Es posible que otros sistemas operativos sean compatibles con versiones de Dataproc futuras.

  • Imágenes base admitidas: Las compilaciones de imágenes personalizadas requieren que se comience desde una imagen base de Dataproc. Se admiten las siguientes imágenes base: Debian, Rocky Linux y Ubuntu.

    • Disponibilidad de imágenes base: Las imágenes nuevas anunciadas en las notas de la versión de Dataproc no están disponibles para usarse como base de imágenes personalizadas hasta una semana después de su fecha de anuncio.
  • Uso de componentes opcionales: De forma predeterminada, las imágenes personalizadas heredan todos los componentes opcionales de Dataproc (paquetes y parámetros de configuración del SO) de sus imágenes base. Puedes personalizar las versiones y parámetros de configuración predeterminados del paquete del SO, pero debes especificar el nombre del componente opcional cuando crees el clúster.

    Ejemplo de comando de creación de clústeres:

    gcloud dataproc clusters create --optional-components=COMPONENT_NAME \
        --image=CUSTOM_IMAGE_URI  \
         ... 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 Dataproc 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 Dataproc de tu proyecto (consulta Cómo compartir 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 Dataproc, haz lo siguiente:

    1. Habilita la API de Secret Manager (secretmanager.googleapis.com). Dataproc 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 otorgarle a la cuenta de servicio el rol de visor de Secret Manager (roles/secretmanager.viewer) en el proyecto y el rol de descriptor de 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 dentro del directorio examples/secure-boot del repositorio GoogleCloudDataproc/custom-images en GitHub.

    Para inhabilitar el arranque seguro: De forma predeterminada, las secuencias de comandos de la imagen personalizada de Dataproc generan y administran un par de claves con Secret Manager cuando se ejecutan desde un clúster de Dataproc. Si no quieres usar el inicio seguro con tu imagen personalizada, incluye --trusted-cert="" (valor de marca vacía) 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. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

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

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

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

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Instala Python 3.11 y versiones posteriores
  13. 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. In the Google Cloud console, go to the Cloud Storage Buckets page.

    Go to Buckets page

  2. Click Create bucket.
  3. On the Create a bucket page, enter your bucket information. To go to the next step, click Continue.
    • For Name your bucket, enter a name that meets the bucket naming requirements.
    • For Choose where to store your data, do the following:
      • Select a Location type option.
      • Select a Location option.
    • For Choose a default storage class for your data, select a storage class.
    • For Choose how to control access to objects, select an Access control option.
    • For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
  4. Click Create.

Genera una imagen personalizada

Usarás generate_custom_image.py, un programa de Python, para crear una imagen personalizada de Dataproc.

Cómo funciona

El programa generate_custom_image.py inicia una instancia de VM de Compute Engine temporal con la imagen base de Dataproc especificada 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. Cuando finaliza la secuencia de comandos de personalización, se cierra la instancia de VM y se crea una imagen personalizada de Dataproc 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 Dataproc.

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 Dataproc.

Luego, ejecuta la secuencia de comandos generate_custom_image.py para que Dataproc 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. Nota: El nombre de la imagen debe coincidir con la expresión regular [a-z](?:[-a-z0-9]{0,61}[a-z0-9]) sin guiones bajos ni espacios, y tener menos de 64 caracteres.
  • --dataproc-version: La versión de la imagen de Dataproc 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: 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 solo se ejecuta 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.
  • --zone: La zona de Compute Engine en la que generate_custom_image.py creará una VM temporal que usará para crear 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: Esta es una marca opcional que inhabilita las pruebas de humo en la imagen personalizada recién creada. La prueba de humo crea un clúster de prueba de Dataproc con la imagen recién creada, 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 creada pueda crear un clúster de Dataproc 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 Dataproc. Si tu proyecto forma parte de una VPC compartida, debes especificar la URL completa de la subred en el siguiente formato: projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET.

Para obtener una lista de marcas opcionales adicionales, consulta Argumentos opcionales en GitHub.

Si generate_custom_image.py se realiza 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 usas la herramienta de imagen personalizada estándar de Dataproc, esta establece una etiqueta goog-dataproc-version en la imagen personalizada creada. La etiqueta refleja las funciones y los protocolos que usa Dataproc para administrar el software en la imagen.

Uso avanzado: Si usas tu propio proceso para crear una imagen personalizada de Dataproc, debes agregar la etiqueta goog-dataproc-version a tu imagen personalizada de forma manual, de la siguiente manera:

  1. Extrae la etiqueta goog-dataproc-version de la imagen base de Dataproc 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 Dataproc. Una imagen personalizada se guarda en Imágenes de Cloud Compute y es válida para crear un clúster de Dataproc por 365 días desde la fecha de su creación (consulta Cómo crear un clúster con una imagen personalizada vencida si quieres usar una imagen 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 obtener una lista de 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 las imágenes. Haz clic en REST equivalente.
  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 nodos principales y trabajadores que usan una imagen personalizada con gcloud CLI, la API de Dataproc o la consola de Google Cloud.

gcloud CLI

Crea un clúster de Dataproc con una imagen personalizada mediante el comando de creación de clústeres de Dataproc con la marca --image.

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

API de REST

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

Ejemplo: solicitud REST para crear un clúster de Dataproc estándar (un nodo maestro y dos trabajadores) 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 Create a cluster de Dataproc. Se selecciona el panel Configura 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 quieres usar para tu clúster de Dataproc 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 Dataproc con una imagen personalizada

Puedes usar imágenes personalizadas para reemplazar 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 que establece 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 creación de archivos de secuencia de comandos de personalización de muestra para anular dos propiedades del clúster:
    cat <<EOF >/etc/google-dataproc/dataproc.custom.properties
    dataproc.conscrypt.provider.enable=true
    dataproc.logging.stackdriver.enable=false
    EOF
    

Cómo crear un clúster con una imagen personalizada vencida

De forma predeterminada, las imágenes personalizadas se vencen a los 365 días desde 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 Dataproc 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. Gcloud CLI emitirá un mensaje de error que incluye el nombre de la propiedad dataproc:dataproc.custom.image.expiration.token del clúster 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 Dataproc 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.