Acciones de inicialización

Cuando creas un clúster de Dataproc, puedes especificar acciones de inicialización en ejecutables o secuencias de comandos que Dataproc ejecutará en todos los nodos en tu clúster de Dataproc inmediatamente después de configurar el clúster. A menudo, las acciones de inicialización configuran dependencias de trabajo, como la instalación de paquetes de Python, para que los trabajos puedan enviarse al clúster sin tener que instalar dependencias cuando se ejecutan los trabajos.

Puedes encontrar secuencias de comandos de acciones de inicialización de uso frecuente y otros ejemplos en las siguientes ubicaciones:

Consideraciones y lineamientos importantes

  • No crees clústeres de producción que hagan referencia a acciones de inicialización ubicadas en los depósitos públicos de gs://goog-dataproc-initialization-actions-REGION. Estas secuencias de comandos se proporcionan como implementaciones de referencia y se sincronizan con los cambios del repositorio de GitHub en curso. Una versión nueva de una acción de inicialización en depósitos públicos puede interrumpir la creación del clúster. En su lugar, copia la acción de inicialización de los depósitos públicos en tu depósito, como se muestra en el siguiente ejemplo:

    REGION=region
    
    gsutil cp gs://goog-dataproc-initialization-actions-${REGION}/tez/tez.sh gs://my-bucket
    
    A continuación, cree el clúster; para ello, haga referencia a la copia:
    gcloud dataproc clusters create cluster-name \
        --region=${REGION} \
        --initialization-actions=gs://my-bucket/tez.sh \
        ... other flags ...
    
    Puedes decidir cuándo sincronizar tu copia de la acción de inicialización con cualquier cambio en dicha acción que se produzca en el depósito público o en el repositorio de GitHub.

  • Las acciones de inicialización se ejecutan en cada nodo durante la creación del clúster. También se ejecutan en cada nodo recién agregado cuandoescalamiento oajuste de escala automático clústeres automáticamente.

  • Las acciones de inicialización se ejecutan como el usuario root. Esto significa que no necesitas usar sudo.

  • Debes usar rutas de acceso absolutas en las acciones de inicialización.

  • Tus acciones de inicialización deben usar una línea shebang para indicar cómo se debe interpretar la secuencia de comandos (como #!/bin/bash o #!/usr/bin/python).

  • Si una acción de inicialización termina con un código de salida que no es cero, la operación de creación del clúster presentará un estado de "ERROR". Para depurar la acción de inicialización, SSH en las instancias de VM del clúster y, luego, examina los registros. Luego de solucionar el problema de la acción de inicialización, puedes borrar y luego volver a crear el clúster.

  • Si creas un clúster de Dataproc solo con direcciones IP internas, los intentos para acceder a github.com a través de Internet en una acción de inicialización fallarán salvo que hayas configurado rutas para dirigir el tráfico a través de Cloud NAT o una Cloud VPN Sin acceso a Internet, puedes habilitar Acceso privado a Google y colocar las dependencias de trabajos en Cloud Storage; los nodos del clúster pueden descargar las dependencias de Cloud Storage desde IP internas.

  • Puedes usar imágenes personalizadas de Dataproc en vez de acciones de inicialización para configurar dependencias de trabajos.

  • Procesamiento de inicialización:

    • Clústeres de imágenes anteriores a 2.0:
      • Instancia principal: las acciones de inicialización del nodo principal no se inician hasta que HDFS pueda escribirse (hasta que HDFS salga del modo seguro y al menos dos DataData HDFS estén unidos). Esto permite que las acciones de inicialización se ejecuten en las instancias principales para escribir archivos en HDFS.
      • Worker: Si el usuario configura la propiedad del clúster dataproc:dataproc.worker.custom.init.actions.mode en RUN_BEFORE_SERVICES, cada trabajador ejecuta sus acciones de inicialización antes del inicia sus nodos de datos de HDFS y daemons de administrador de nodos YARN. Dado que Dataproc no ejecuta acciones de inicialización principales hasta que se pueda escribir en HDFS, que requiere que se ejecuten 2 daemons de nodo de datos de HDFS, esta configuración puede aumentar el tiempo de creación del clúster.
    • Clústeres de imágenes 2.0+:

      • Instancia principal: Las acciones de inicialización del nodo principal pueden ejecutarse antes de que se pueda escribir el HDFS. Si ejecutas acciones de inicialización que almacenan archivos en etapas en HDFS, debes volver a intentarlo o sondear hasta que se pueda escribir la HDFS.
      • Trabajador: La propiedad del clúster dataproc:dataproc.worker.custom.init.actions.mode se establece en RUN_BEFORE_SERVICES y no se puede pasar al clúster cuando se crea el clúster (el usuario no puede cambiarlo). Cada trabajador ejecuta sus acciones de inicialización antes de iniciar su nodo de datos HDFS y daemons de administrador de nodos YARN. Dado que Dataproc no espera a que se pueda escribir HDFS antes de ejecutar las acciones de inicialización principal, las acciones de inicialización principales y los trabajadores se ejecutan en paralelo.
    • Recomendaciones:

      • Usa metadatos para determinar la función de un nodo a fin de ejecutar una acción de inicialización en los nodos de forma condicional (consulta Usa metadatos de clúster).
      • Bifurcar una copia de una acción de inicialización a un depósito de Cloud Storage para lograr la estabilidad (consulta Cómo se usan las acciones de inicialización).
      • Agrega reintentos cuando descargas de Internet para ayudar a estabilizar la acción de inicialización.

Usa acciones de inicialización

Las acciones de inicialización del clúster se pueden especificar independientemente de cómo creas el clúster:

Comando de gcloud

Cuando creas un clúster con el comando gcloud dataproc clusters create, especifica una o más ubicaciones de Cloud Storage (URI) separadas por comas correspondientes a las secuencias de comandos o los ejecutables de inicialización con la marca --initialization-actions. Nota: Varios "/" consecutivos en un URI de ubicación de Cloud Storage después del "gs://" inicial, como "gs://bucket/my//object//name", no son compatibles.

A continuación, se muestra la sintaxis para usar esta marca, que puedes ver desde la línea de comandos si ejecutas gcloud dataproc clusters create --help.

gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
    --initialization-action-timeout=timeout-value (default=10m) \
    ... other flags ...
Notas:
  • Usa la marca --initialization-action-timeout a fin de especificar un tiempo de espera para la acción de inicialización. El tiempo de espera predeterminado es de 10 minutos. Si el ejecutable o la secuencia de comandos de inicialización no se completó al final del tiempo de espera, Dataproc cancela la acción de inicialización.
  • Usa la propiedad de clúster dataproc:dataproc.worker.custom.init.actions.mode para ejecutar la acción de inicialización en los trabajadores principales antes de que se inicien el administrador de nodos y los daemons de datanode.

API de REST

Especifica una o más secuencias de comandos o ejecutables en un arreglo ClusterConfig.initializationActions como parte de una solicitud a la API clusters.create.

Ejemplo

POST /v1/projects/my-project-id/regions/us-central1/clusters/
{
  "projectId": "my-project-id",
  "clusterName": "example-cluster",
  "config": {
    "configBucket": "",
    "gceClusterConfig": {
      "subnetworkUri": "default",
      "zoneUri": "us-central1-b"
    },
    "masterConfig": {
      "numInstances": 1,
      "machineTypeUri": "n1-standard-4",
      "diskConfig": {
        "bootDiskSizeGb": 500,
        "numLocalSsds": 0
      }
    },
    "workerConfig": {
      "numInstances": 2,
      "machineTypeUri": "n1-standard-4",
      "diskConfig": {
        "bootDiskSizeGb": 500,
        "numLocalSsds": 0
      }
    },
    "initializationActions": [
      {
        "executableFile": "gs://cloud-example-bucket/my-init-action.sh"
      }
    ]
  }
}

Console

  • Abre la página de Dataproc Crear un clúster y, luego, selecciona el panel Personalizar clúster.
  • En la sección Acciones de inicialización, ingresa las ubicaciones del depósito de Cloud Storage de cada acción de inicialización en los campos de archivo ejecutables. Haz clic en BROWSE para abrir la página del navegador de Cloud Storage en Cloud Console a fin de seleccionar una secuencia de comandos o un archivo ejecutable. Haz clic en AGREGAR SOLUCI N ADMINISTRACIINITIALN para agregar cada archivo nuevo.
  • Aplica argumentos a las acciones de inicialización

    Dataproc establece valores especiales de metadatos para las instancias que se ejecutan en tus clústeres. Puedes configurar tus propios metadatos personalizados como una forma de aplicar argumentos a las acciones de inicialización.

    gcloud dataproc clusters create cluster-name \
        --region=${REGION} \
        --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
        --metadata=name1=value1,name2=value2... \
        ... other flags ...
    

    Los valores de metadatos se pueden leer dentro de las acciones de inicialización de la siguiente manera:

    var1=$(/usr/share/google/get_metadata_value attributes/name1)
    

    Selección de nodos

    Si quieres limitar las acciones de inicialización para los nodos principales o del trabajador, puedes agregar una lógica de selección de nodos simple a tu ejecutable o secuencia de comandos.

    ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
    if [[ "${ROLE}" == 'Master' ]]; then
      ... master specific actions ...
    else
      ... worker specific actions ...
    fi
    

    Etapa de pruebas de binarios

    Una situación de inicialización del clúster común es la etapa de pruebas de los binarios de trabajo en un clúster para eliminar la necesidad de habilitar a etapa los binarios cada vez que se envía un trabajo. Por ejemplo, supongamos que la siguiente secuencia de comandos de inicialización se almacena en gs://my-bucket/download-job-jar.sh, una ubicación del depósito de Cloud Storage:

    #!/bin/bash
    ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
    if [[ "${ROLE}" == 'Master' ]]; then
      gsutil cp gs://my-bucket/jobs/sessionalize-logs-1.0.jar home/username
    fi
    

    La ubicación de esta secuencia de comandos puede pasarse al comando gcloud dataproc clusters create:

    gcloud dataproc clusters create my-dataproc-cluster \
        --region=${REGION} \
        --initialization-actions=gs://my-bucket/download-job-jar.sh
    

    Dataproc ejecutará esta secuencia de comandos en todos los nodos y, como consecuencia de la lógica de selección de nodos de la secuencia de comandos, descargará el jar al nodo principal. Por lo tanto, los trabajos enviados pueden usar el jar previo a la etapa de pruebas:

    gcloud dataproc jobs submit hadoop \
        --cluster=my-dataproc-cluster \
        --region=${REGION} \
        --jar=file:///home/username/sessionalize-logs-1.0.jar
    

    Muestras de acciones de inicialización

    Las secuencias de comandos de acciones de inicialización de uso frecuente y otros ejemplos se ubican en gs://goog-dataproc-initialization-actions-<REGION>, un depósito público regional de Cloud Storage, y en un repositorio de GitHub. Para contribuir a una secuencia de comandos, revisa el documento CONTRIBUTING.md y, a continuación, presenta una solicitud de extracción.

    Logging

    El resultado de la ejecución de cada acción de inicialización se registra para cada instancia en /var/log/dataproc-initialization-script-X.log; X es el índice basado en cero de cada secuencia de comandos de acción de inicialización sucesiva. Por ejemplo, si tu clúster tiene dos acciones de inicialización, los resultados se registrarán en /var/log/dataproc-initialization-script-0.log y /var/log/dataproc-initialization-script-1.log.

    Qué sigue

    Explora las acciones de inicialización de GitHub.