Crear una imagen personalizada de Dataproc

Puedes crear un clúster de Dataproc con una imagen personalizada que incluya tus paquetes preinstalados. En esta página se explica cómo crear una imagen personalizada e instalarla en un clúster de Dataproc.

Consideraciones y limitaciones de uso

  • Tiempo de vida de las imágenes personalizadas: para asegurarnos de 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 a partir de la fecha de creación de la imagen personalizada. Ten en cuenta que los clústeres creados con una imagen personalizada pueden ejecutarse indefinidamente.

    Puede que tengas que usar la automatización si quieres crear clústeres con una imagen personalizada específica durante un periodo superior a 365 días. Para obtener más información, consulta Crear un clúster con una imagen personalizada caducada.

  • Solo Linux: las instrucciones de este documento se aplican únicamente a los sistemas operativos Linux. Es posible que se admitan otros sistemas operativos en futuras versiones de Dataproc.

  • Imágenes base admitidas: para crear una imagen personalizada, debes empezar con una imagen base de Dataproc. Se admiten las siguientes imágenes base: Debian, Rocky Linux y Ubuntu.

    • Disponibilidad de imágenes base: las nuevas imágenes anunciadas en las notas de la versión de Dataproc no se pueden usar como base para imágenes personalizadas hasta una semana después de su fecha de anuncio.
  • Usar componentes opcionales:

    • Imágenes base 2.2 y anteriores: de forma predeterminada, todos los componentes opcionales de Dataproc (paquetes y configuraciones del SO) se instalan en la imagen personalizada. Puede personalizar las versiones y las configuraciones de los paquetes del SO.

    • 2.3 y versiones posteriores: solo se instalan los componentes opcionales seleccionados en la imagen personalizada (consulta la marca generate_custom_image.py--optional-components).

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

    Ejemplo: comando de creación de clústeres de Google Cloud CLI:

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

    Si no se especifica el nombre del componente al crear el clúster, se eliminará el componente opcional, incluidos los paquetes y las configuraciones del SO personalizados.

  • Usar imágenes personalizadas alojadas: si usas una imagen personalizada alojada en otro proyecto, la cuenta de servicio del agente de servicio de Dataproc de tu proyecto debe tener el permiso compute.images.get en la imagen del proyecto host. Para conceder este permiso, 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 la sección sobre cómo compartir imágenes personalizadas en una organización).

  • Usar 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 Secret Manager (secretmanager.googleapis.com). Dataproc genera y gestiona un par de claves con el servicio Secret Manager.

    2. Añade la marca --service-account="SERVICE_ACCOUNT" al comando generate_custom_image.py cuando generes una imagen personalizada. Nota: Debes asignar a la cuenta de servicio el rol Lector de Secret Manager (roles/secretmanager.viewer) en el proyecto y el rol Accesor de 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 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 gestionan un par de claves mediante Secret Manager cuando se ejecutan desde un clúster de Dataproc. 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 empezar

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

Configurar el 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.

    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 (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. Install the Google Cloud CLI.

  6. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud 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 (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. Install the Google Cloud CLI.

  12. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

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

    gcloud init
  14. Instalar Python 3.11 o una versión posterior
  15. Prepara una secuencia de comandos de personalización que instale paquetes personalizados o actualice configuraciones. Por ejemplo:
      #! /usr/bin/bash
      apt-get -y update
      apt-get install python-dev
      apt-get install python-pip
      pip install numpy
      
  16. Crea un segmento de Cloud Storage en tu proyecto

    1. In the Google Cloud console, go to the Cloud Storage Buckets page.

      Go to Buckets

    2. Click Create.
    3. On the Create a bucket page, enter your bucket information. To go to the next step, click Continue.
      1. In the Get started section, do the following:
        • Enter a globally unique name that meets the bucket naming requirements.
        • To add a bucket label, expand the Labels section (), click Add label, and specify a key and a value for your label.
      2. In the Choose where to store your data section, do the following:
        1. Select a Location type.
        2. Choose a location where your bucket's data is permanently stored from the Location type drop-down menu.
        3. To set up cross-bucket replication, select Add cross-bucket replication via Storage Transfer Service and follow these steps:

          Set up cross-bucket replication

          1. In the Bucket menu, select a bucket.
          2. In the Replication settings section, click Configure to configure settings for the replication job.

            The Configure cross-bucket replication pane appears.

            • To filter objects to replicate by object name prefix, enter a prefix that you want to include or exclude objects from, then click Add a prefix.
            • To set a storage class for the replicated objects, select a storage class from the Storage class menu. If you skip this step, the replicated objects will use the destination bucket's storage class by default.
            • Click Done.
      3. In the Choose how to store your data section, do the following:
        1. Select a default storage class for the bucket or Autoclass for automatic storage class management of your bucket's data.
        2. To enable hierarchical namespace, in the Optimize storage for data-intensive workloads section, select Enable hierarchical namespace on this bucket.
      4. In the Choose how to control access to objects section, select whether or not your bucket enforces public access prevention, and select an access control method for your bucket's objects.
      5. In the Choose how to protect object data section, do the following:
        • Select any of the options under Data protection that you want to set for your bucket.
          • To enable soft delete, click the Soft delete policy (For data recovery) checkbox, and specify the number of days you want to retain objects after deletion.
          • To set Object Versioning, click the Object versioning (For version control) checkbox, and specify the maximum number of versions per object and the number of days after which the noncurrent versions expire.
          • To enable the retention policy on objects and buckets, click the Retention (For compliance) checkbox, and then do the following:
            • To enable Object Retention Lock, click the Enable object retention checkbox.
            • To enable Bucket Lock, click the Set bucket retention policy checkbox, and choose a unit of time and a length of time for your retention period.
        • To choose how your object data will be encrypted, expand the Data encryption section (), and select a Data encryption method.
    4. Click Create.

    Generar una imagen personalizada

    Usa 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, a continuación, ejecuta la secuencia de comandos de personalización en la instancia de VM para instalar paquetes personalizados o actualizar configuraciones. Cuando finalice la secuencia de comandos de personalización, se apagará la instancia de VM y se creará una imagen personalizada de Dataproc a partir del disco de la instancia de VM. La VM temporal se elimina después de crear 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 la CLI de gcloud para ejecutar flujos de trabajo de varios pasos en Compute Engine.

    .

    Ejecutar el código

    Crea una bifurcación o clona los archivos en GitHub en Imágenes personalizadas de Dataproc.

    A continuación, 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 obligatorias

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

    • --dataproc-version: la versión de la imagen de Dataproc que se va a 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 local a la secuencia de comandos que ejecutará la herramienta 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 crees 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 crear tu imagen personalizada.

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

    Marcas opcionales

    • --family: 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 al crear un clúster como 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 la prueba de humo de la imagen personalizada recién creada. La prueba de humo crea un clúster de prueba de Dataproc con la imagen recién compilada, ejecuta un trabajo pequeño y, a continuación, elimina 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 puede crear un clúster de Dataproc funcional. Si inhabilitas este paso con la marca --no-smoke-test, se acelera el proceso de creación de imágenes personalizadas, pero no se recomienda usarla.
    • --subnet: la subred que se usará para crear la VM que compila la imagen de Dataproc personalizada. 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 imagen base 2.3 y posteriores. 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), que se instalarán en la imagen.

      Ejemplo: comando de creación de clústeres de Google Cloud CLI:

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

    Para ver una lista de las marcas opcionales disponibles, consulta Argumentos opcionales en GitHub.

    Si generate_custom_image.py se realiza correctamente, el imageURI de la imagen personalizada se muestra en la salida 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.
    #####################################################################
    
    
    de la consola.

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

    Cuando se usa la herramienta de imagen personalizada estándar de Dataproc, esta herramienta asigna una etiqueta goog-dataproc-version a la imagen personalizada creada. La etiqueta refleja las funciones y los protocolos que usa Dataproc para gestionar el software de la imagen.

    Uso avanzado: si utilizas tu propio proceso para crear una imagen de Dataproc personalizada, debes añadir 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 Dataproc que se ha usado para crear la imagen personalizada.

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

    2. Define la etiqueta de la imagen personalizada.

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

    Usar una imagen personalizada

    Especifica la imagen personalizada al crear un clúster de Dataproc. Una imagen personalizada se guarda en Imágenes de Cloud Compute y se puede usar para crear un clúster de Dataproc durante 365 días a partir de su fecha de creación (consulta Crear un clúster con una imagen personalizada caducada para usar una imagen personalizada después de su fecha de caducidad, que es de 365 días).

    URI de imagen personalizada

    Debes pasar el imageUri de la imagen personalizada a la operación de creación del clúster. Este URI se puede especificar de tres formas:

    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 abreviado: CUSTOM_IMAGE_NAME

    Las imágenes personalizadas también se pueden especificar mediante su URI de familia, que siempre elige la imagen más reciente 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

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

    Consola

    1. Abre la página Compute Engine > Imágenes en la consola Google Cloud y, a continuación, haz clic en el nombre de la imagen. Puedes insertar una consulta en el campo filter images para limitar el número 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 REST incluye información adicional sobre la imagen, como el selfLink, que es el URI de la imagen.
      {
        ...
        "name": "my-custom-image",
        "selfLink": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME",
        "sourceDisk": ...,
        ...
      }
      

    Crear un clúster con una imagen personalizada

    crear un clúster con la CLI de gcloud, la API de Dataproc o la Google Cloud consola.

    CLI de gcloud

    Crea un clúster de Dataproc con una imagen personalizada mediante 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 REST

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

    Ejemplo: solicitud REST para crear un clúster de Dataproc estándar (un nodo maestro 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"
        }
      }
    }
      

    Consola

    1. Abre la página de Dataproc Crear un clúster. El panel Configurar clúster está seleccionado.
    2. En la sección Control de versiones, haz clic en Cambiar. Seleccione la pestaña Imagen personalizada, elija la imagen personalizada que quiera usar en su clúster de Dataproc y, a continuación, haga clic en Seleccionar. Las VMs del clúster se aprovisionarán con la imagen personalizada seleccionada.

    Anular las propiedades de un clúster de Dataproc con una imagen personalizada

    Puedes usar imágenes personalizadas para sobrescribir las propiedades del clúster que se definen 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 define propiedades con valores distintos de los que define tu imagen personalizada, los valores de las propiedades definidos por tu imagen personalizada tendrán prioridad.

    Para definir las propiedades del clúster con tu imagen personalizada, sigue estos pasos:

    1. En tu script de personalización de la imagen personalizada, crea un archivo dataproc.custom.properties en /etc/google-dataproc y, a continuación, define los valores de las propiedades del clúster en el archivo.

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

    Crear un clúster con una imagen personalizada caducada

    De forma predeterminada, las imágenes personalizadas caducan 365 días después de la fecha de creación de la imagen. Para crear un clúster que use una imagen personalizada caducada, siga estos pasos.

    1. Intenta crear un clúster de Dataproc con una imagen personalizada caducada o una imagen personalizada que caducará en un plazo de 10 días.

      gcloud dataproc clusters create CLUSTER-NAME \
          --image=CUSTOM-IMAGE-NAME \
          --region=REGION \
          ... other flags
      
    2. La CLI de gcloud 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 la CLI de gcloud para volver a crear el clúster de Dataproc y añade el TOKEN_VALUE copiado como 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 completarse correctamente.