Azioni di inizializzazione

Quando crei un cluster Managed Service for Apache Spark, puoi specificare azioni di inizializzazione in eseguibili o script che Managed Service for Apache Spark eseguirà su tutti i nodi del cluster Managed Service for Apache Spark 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 esempio per le azioni di inizializzazione 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 situate nei bucket pubblici gs://goog-dataproc-initialization-actions-REGION. Questi script vengono forniti come implementazioni di riferimento. Sono 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 quando scali o esegui 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 alle azioni di inizializzazione del bucket pubblico o del repository GitHub, crea una nuova cartella (preferibilmente con un nome di versione) per ricevere le azioni di inizializzazione aggiornate. Se invece aggiorni l'azione di inizializzazione in loco, i nuovi nodi, ad esempio quelli aggiunti dal gestore della scalabilità automatica, eseguiranno l'azione di inizializzazione aggiornata in loco, non l'azione di inizializzazione della versione precedente eseguita sui nodi esistenti. Queste differenze nelle azioni di inizializzazione possono causare nodi del cluster incoerenti o interrotti.

  • 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).

  • Utilizza i caratteri di fine riga in stile Unix (LF) nelle azioni di inizializzazione. Se crei azioni di inizializzazione su Windows, queste potrebbero contenere terminazioni di riga in stile Windows (CRLF), che possono causare errori di esecuzione degli script.

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

  • Se crei un cluster Managed Service for Apache Spark con solo indirizzi IP interni, i tentativi di accedere a github.com tramite internet in un'azione di inizializzazione non riusciranno, a meno che tu non abbia configurato route per indirizzare il traffico tramite Cloud NAT o Cloud VPN. Senza accesso a internet, puoi abilitare l'accesso privato Google e inserire le dipendenze dei job in Cloud Storage; i nodi del cluster possono scaricare le dipendenze da Cloud Storage da indirizzi IP interni.

  • Puoi utilizzare le immagini personalizzate di Managed Service for Apache Spark anziché le azioni di inizializzazione per configurare le dipendenze dei job.

  • Elaborazione dell'inizializzazione:

    • Cluster di immagini precedenti alla versione 2.0:
      • Master: per consentire alle azioni di inizializzazione eseguite sui master di scrivere file in HDFS, le azioni di inizializzazione dei nodi master non vengono avviate finché HDFS non è scrivibile (ovvero finché HDFS non è uscito dalla modalità provvisoria e non sono stati aggiunti almeno due DataNode HDFS).
      • Worker: se imposti la proprietà del cluster dataproc:dataproc.worker.custom.init.actions.mode su RUN_BEFORE_SERVICES, ogni worker esegue le proprie azioni di inizializzazione prima di avviare i daemon datanode HDFS e nodemanager YARN. Poiché Managed Service for Apache Spark non esegue le azioni di inizializzazione del master finché HDFS non è scrivibile, il che richiede l'esecuzione di due daemon datanode HDFS, l'impostazione di questa proprietà potrebbe aumentare il tempo di creazione del cluster.
    • Più di 2 cluster di immagini:

      • Master: le azioni di inizializzazione del nodo master possono essere eseguite prima che HDFS sia scrivibile. Se esegui azioni di inizializzazione che eseguono lo stage dei file in HDFS o dipendono dalla disponibilità di servizi dipendenti da HDFS, come Ranger, imposta la proprietà del cluster dataproc.master.custom.init.actions.mode su RUN_AFTER_SERVICES. Nota: poiché questa impostazione della proprietà può aumentare il tempo di creazione del cluster (consulta la spiegazione del ritardo nella creazione del cluster per i worker del cluster di immagini precedenti alla versione 2.0), utilizzala solo se necessario (come pratica generale, utilizza l'impostazione predefinita RUN_BEFORE_SERVICES per questa proprietà).
      • Worker: la proprietà del cluster dataproc:dataproc.worker.custom.init.actions.mode è impostata su RUN_BEFORE_SERVICES e non può essere passata al cluster quando viene creato (non puoi modificare l'impostazione della proprietà). Ogni worker esegue le proprie azioni di inizializzazione prima di avviare i daemon datanode HDFS e nodemanager YARN. Poiché Managed Service for Apache Spark non attende che HDFS sia scrivibile prima di eseguire le azioni di inizializzazione del master, le azioni di inizializzazione del master e dei worker vengono eseguite in parallelo.
    • Consigli:

      • Utilizza i metadati per determinare il ruolo di un nodo per eseguire in modo condizionale un'azione di inizializzazione sui nodi (consulta Utilizzo dei metadati del cluster).
      • Crea un fork di una copia di un'azione di inizializzazione in un bucket Cloud Storage per garantire la stabilità (consulta Come vengono utilizzate le azioni di inizializzazione).
      • Aggiungi nuovi tentativi quando scarichi da internet per stabilizzare l'azione di inizializzazione.

Utilizza le azioni di inizializzazione

Le azioni di inizializzazione del cluster possono essere specificate indipendentemente dal modo in cui crei un cluster:

ConsoleGoogle Cloud

  • Apri la pagina Crea cluster.
  • Fai clic su Configurazione aggiuntiva per espandere la sezione.
  • Modifica Personalizzazione e altro.
  • Nel riquadro che si apre, fai clic su Aggiungi azioni di inizializzazione, quindi inserisci o sfoglia per selezionare la posizione Cloud Storage di un'azione di inizializzazione.
  • gcloud CLI

    Quando crei un cluster con il comando gcloud dataproc clusters create, specifica una o più località (URI) di Cloud Storage 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 della località Cloud Storage dopo il prefisso "gs://", ad esempio "gs://bucket/my//object//name". Esegui gcloud dataproc clusters create --help per informazioni sul comando.

    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, Managed Service for Apache Spark annulla l'azione di inizializzazione.
    • Utilizza la proprietà del cluster dataproc:dataproc.worker.custom.init.actions.mode per eseguire l'azione di inizializzazione sui worker primari prima dell'avvio dei daemon del gestore dei nodi e del datanode.

    API REST

    Specifica uno o più script o eseguibili in un array ClusterConfig.initializationActions come parte 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"
          }
        ]
      }
    }
    

    Passa gli argomenti alle azioni di inizializzazione

    Managed Service for Apache Spark imposta valori di metadati speciali per le istanze eseguite nei cluster. Puoi impostare i tuoi metadati personalizzati 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 come segue:

    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
    

    Prepara i programmi binari

    Uno scenario comune di inizializzazione del cluster è la gestione temporanea dei file binari dei job su un cluster per eliminare la necessità di eseguire la gestione temporanea dei file binari 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, una posizione del 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
    

    Managed Service for Apache Spark 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-preparato:

    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 delle azioni di inizializzazione di esempio utilizzati di frequente e altri script 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.