Azioni di inizializzazione

Quando crei un cluster Dataproc, puoi specificare azioni di inizializzazione in eseguibili o script che Dataproc eseguirà su tutti i nodi del tuo cluster Dataproc immediatamente dopo la configurazione del cluster. Le azioni di inizializzazione spesso configurano le dipendenze dei job, ad esempio l'installazione di pacchetti Python, in modo che i job possano essere inviati al cluster senza dover installare le dipendenze durante l'esecuzione dei job.

Puoi trovare script di azioni di inizializzazione di esempio nelle seguenti posizioni: Nota: Google non supporta questi esempi.

Considerazioni e linee guida importanti

  • Non creare cluster di produzione che fanno riferimento ad azioni di inizializzazione che si trovano nei bucket pubblici gs://goog-dataproc-initialization-actions-REGION. Questi script vengono forniti come implementazioni di riferimento. Vengono sincronizzati con le modifiche in corso al repository GitHub e gli aggiornamenti di questi script possono interrompere la creazione del cluster. Copia invece l'azione di inizializzazione dal bucket pubblico in una cartella del bucket Cloud Storage con controllo delle versioni, come mostrato nell'esempio seguente:

    REGION=COMPUTE_REGION
    gcloud storage cp gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \
        gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh
    
    Quindi, crea il cluster facendo riferimento alla copia in Cloud Storage:
    gcloud dataproc clusters create CLUSTER_NAME \
        --region=${REGION} \
        --initialization-actions=gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh \
        ...other flags...
    

  • Le azioni di inizializzazione vengono eseguite su ciascun nodo in serie durante la creazione del cluster. Vengono eseguiti anche su ogni nodo aggiunto durante lo scaling o la scalabilità automatica dei cluster.

  • Quando aggiorni le azioni di inizializzazione, ad esempio quando sincronizzi le azioni di inizializzazione di Cloud Storage con le modifiche apportate al bucket pubblico o alle azioni di inizializzazione del repository GitHub, crea una nuova cartella (preferibilmente con il nome della versione) per ricevere le azioni di inizializzazione aggiornate. Se invece aggiorni l'azione di inizializzazione sul posto, i nuovi nodi, ad esempio quelli aggiunti dal gestore della scalabilità automatica, eseguiranno l'azione di inizializzazione aggiornata e non l'azione di inizializzazione della versione precedente eseguita sui nodi esistenti. Queste differenze nell'azione di inizializzazione possono comportare nodi del cluster incoerenti o danneggiati.

  • Le azioni di inizializzazione vengono eseguite come utente root. Non è necessario utilizzare sudo.

  • Utilizza percorsi assoluti nelle azioni di inizializzazione.

  • Utilizza una riga shebang nelle azioni di inizializzazione per indicare come deve essere interpretato lo script (ad esempio #!/bin/bash o #!/usr/bin/python).

  • Se un'azione di inizializzazione termina con un codice di uscita diverso da zero, l'operazione di creazione del cluster restituisce lo stato "ERROR". Per eseguire il debug dell'azione di inizializzazione, utilizza SSH per connetterti alle istanze VM del cluster ed esamina i log. Dopo aver risolto il problema dell'azione di inizializzazione, puoi eliminare e ricreare il cluster.

  • Se crei un cluster Dataproc con solo indirizzi IP interni, i tentativi di accesso a github.com su internet in un'azione di inizializzazione non andranno a buon fine a meno che tu non abbia configurato route per indirizzare il traffico tramite Cloud NAT o una Cloud VPN. Senza accesso a internet, puoi attivare l'accesso privato Google e inserire le dipendenze dei job in Cloud Storage; i nodi del cluster possono scaricare le dipendenze da Cloud Storage dagli IP interni.

  • Puoi utilizzare immagini personalizzate di Dataproc anziché azioni di inizializzazione per configurare le dipendenze dei job.

  • Elaborazione dell'inizializzazione:

Utilizzare le azioni di inizializzazione

Le azioni di inizializzazione del cluster possono essere specificate indipendentemente da come crei un cluster:

Interfaccia a riga di comando gcloud

Quando crei un cluster con il comando gcloud dataproc clusters create, specifica una o più posizioni Cloud Storage (URI) separate da virgole degli eseguibili o degli script di inizializzazione con il flag --initialization-actions. Nota:non sono supportati più caratteri "/" consecutivi in un URI di località Cloud Storage dopo "gs://", ad esempio "gs://bucket/my//object//name". Esegui gcloud dataproc clusters create --help per informazioni sui comandi.

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 ...
Note:
  • Utilizza il flag --initialization-action-timeout per specificare un periodo di timeout per l'azione di inizializzazione. Il valore di timeout predefinito è 10 minuti. Se l'eseguibile o lo script di inizializzazione non è stato completato entro la fine del periodo di timeout, Dataproc annulla l'azione di inizializzazione.
  • Utilizza la dataproc:dataproc.worker.custom.init.actions.mode proprietà del cluster per eseguire l'azione di inizializzazione sui worker principali prima dell'avvio dei daemon Node Manager e Datanode.

API REST

Specifica uno o più script o eseguibili in un array ClusterConfig.initializationActions nell'ambito di una richiesta API clusters.create.

Esempio

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

  • Apri la pagina Crea un cluster di Dataproc, quindi seleziona il riquadro Personalizza cluster.
  • Nella sezione Azioni di inizializzazione, inserisci la posizione del bucket Cloud Storage di ogni azione di inizializzazione nei campi File eseguibile. Fai clic su Sfoglia per aprire la pagina del browser Cloud Storage della console Google Cloud e selezionare uno script o un file eseguibile. Fai clic su Aggiungi azione di inizializzazione per aggiungere ogni file.
  • Trasferire argomenti alle azioni di inizializzazione

    Dataproc imposta valori speciali dei metadati per le istanze in esecuzione nei cluster. Puoi impostare i tuoi metadati personalizzati come modo per passare argomenti alle azioni di inizializzazione.

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

    I valori dei metadati possono essere letti all'interno delle azioni di inizializzazione nel seguente modo:

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

    Selezione dei nodi

    Se vuoi limitare le azioni di inizializzazione ai nodi master, driver o worker, puoi aggiungere la logica di selezione dei nodi al tuo eseguibile o script.

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

    Programmi binari di staging

    Uno scenario comune di inizializzazione del cluster è la gestione temporanea dei file binari del job su un cluster per eliminare la necessità di gestirli temporaneamente ogni volta che viene inviato un job. Ad esempio, supponiamo che il seguente script di inizializzazione sia archiviato in gs://my-bucket/download-job-jar.sh, un bucket Cloud Storage:

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

    La posizione di questo script può essere passata 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 eseguirà questo script su tutti i nodi e, in base alla logica di selezione dei nodi dello script, scaricherà il file JAR sul nodo master. I job inviati possono quindi utilizzare il file JAR pre-staging:

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

    Esempi di azioni di inizializzazione

    Gli script di azioni di inizializzazione utilizzati di frequente e altri esempi si trovano in gs://goog-dataproc-initialization-actions-<REGION>, un bucket Cloud Storage pubblico regionale, e in un repository GitHub. Per contribuire con uno script, consulta il documento CONTRIBUTING.md e poi invia una richiesta di pull.

    Logging

    L'output dell'esecuzione di ogni azione di inizializzazione viene registrato per ogni istanza in /var/log/dataproc-initialization-script-X.log, dove X è l'indice in base zero di ogni script di azione di inizializzazione successivo. Ad esempio, se il tuo cluster ha due azioni di inizializzazione, gli output verranno registrati in /var/log/dataproc-initialization-script-0.log e /var/log/dataproc-initialization-script-1.log.

    Passaggi successivi

    Esplora le azioni di inizializzazione di GitHub.