Quando crei un cluster Dataproc, puoi specificare le azioni di inizializzazione negli eseguibili o negli 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.
Puoi trovare script di azioni di inizializzazione di esempio nei seguenti percorsi: Nota: Google non supporta questi esempi.
- Repository GitHub
- Cloud Storage: nei bucket pubblici
gs://goog-dataproc-initialization-actions-REGION
regionali
Considerazioni e linee guida importanti
Non creare cluster di produzione che fanno riferimento alle azioni di inizializzazione situate nei bucket pubblici
gs://goog-dataproc-initialization-actions-REGION
. Questi script vengono forniti come implementazioni di riferimento. I script vengono sincronizzati con le modifiche in corso del repository GitHub e gli aggiornamenti a 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: Quindi, crea il cluster facendo riferimento alla copia in Cloud Storage: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
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 in serie su ciascun nodo durante la creazione del cluster. Vengono inoltre eseguiti su ogni nodo aggiunto quando si esegue lo scale up 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 ai bucket pubblici 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 in situ, i nuovi nodi, come quelli aggiunti dall'autoscaler, eseguiranno l'azione di inizializzazione aggiornata in situ, non l'azione di inizializzazione della versione precedente eseguita sui nodi esistenti. Queste differenze nelle azioni di inizializzazione possono comportare nodi del cluster incoerenti o inaccessibili.
Le azioni di inizializzazione vengono eseguite come utente
root
. Non è necessario utilizzaresudo
.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 registrerà uno stato "ERROR". Per eseguire il debug dell'azione di inizializzazione, utilizza SSH per connetterti alle istanze VM del cluster e poi esamina i log. Dopo aver risolto il problema relativo all'azione di inizializzazione, puoi eliminare e ricreare il cluster.
Se crei un cluster Dataproc con solo indirizzi IP interni, i tentativi di accedere a
github.com
tramite internet in un'azione di inizializzazione non andranno a buon fine, a meno che non tu abbia configurato route per indirizzare il traffico tramite Cloud NAT o una VPN Cloud. 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 da IP interni.Puoi utilizzare le immagini personalizzate Dataproc invece delle azioni di inizializzazione per configurare le dipendenze dei job.
Elaborazione di inizializzazione:
- Cluster di immagini precedenti alla versione 2.0:
- Master: per consentire alle azioni di inizializzazione eseguite sui master di scrivere file su HDFS, le azioni di inizializzazione dei nodi master non vengono avviate finché HDFS non è in modalità di scrittura (fino a quando HDFS non è uscito dalla modalità di sicurezza e almeno due DataNode HDFS non sono stati aggiunti).
- Worker: se imposti la proprietà del cluster
dataproc:dataproc.worker.custom.init.actions.mode
suRUN_BEFORE_SERVICES
, ogni worker esegue le sue azioni di inizializzazione prima di avviare i demoni NodeManager YARN e DataNode HDFS. Poiché Dataproc non esegue azioni di inizializzazione del master finché HDFS non è scrivibile, il che richiede l'esecuzione di 2 demoni del nodo di dati HDFS, l'impostazione di questa proprietà potrebbe aumentare il tempo di creazione del cluster.
Cluster di immagini 2.0 e versioni successive:
- Master: le azioni di inizializzazione del nodo master potrebbero essere eseguite prima che HDFS sia scrivibile. Se esegui azioni di inizializzazione che eseguono il staging dei file in HDFS o dipendono dalla disponibilità di servizi dipendenti da HDFS, come Ranger, imposta la
dataproc.master.custom.init.actions.mode
proprietà cluster suRUN_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 di cluster di immagini precedenti alla versione 2.0), utilizzala solo se necessario (come regola generale, utilizza l'impostazione predefinitaRUN_BEFORE_SERVICES
per questa proprietà). - Worker: la
dataproc:dataproc.worker.custom.init.actions.mode
proprietà cluster è impostata suRUN_BEFORE_SERVICES
e non può essere passata al cluster al momento della sua creazione (non puoi modificare l'impostazione della proprietà). Ogni worker esegue le sue azioni di inizializzazione prima di avviare i demoni del datanode HDFS e del nodemanager YARN. Poiché Dataproc non attende che HDFS sia scrivibile prima di eseguire le azioni di inizializzazione del master, le azioni di inizializzazione del master e del worker vengono eseguite in parallelo.
- Master: le azioni di inizializzazione del nodo master potrebbero essere eseguite prima che HDFS sia scrivibile. Se esegui azioni di inizializzazione che eseguono il staging dei file in HDFS o dipendono dalla disponibilità di servizi dipendenti da HDFS, come Ranger, imposta la
Consigli:
- Utilizza i metadati per determinare il ruolo di un nodo in modo da eseguire condizionatamente un'azione di inizializzazione sui nodi (consulta Utilizzare i metadati del cluster).
- Esegui il fork di una copia di un'azione di inizializzazione in un bucket Cloud Storage per la stabilità (consulta Come vengono utilizzate le azioni di inizializzazione).
- Aggiungi i tentativi di nuovo quando scarichi da internet per contribuire a stabilizzare l'azione di inizializzazione.
- Cluster di immagini precedenti alla versione 2.0:
Utilizzare le azioni di inizializzazione
Le azioni di inizializzazione del cluster possono essere specificate indipendentemente dal modo in cui viene creato un cluster:
- Tramite la console Google Cloud
- Utilizzo dell'interfaccia a riga di comando gcloud
- In modo programmatico con l'API clusters.create di Dataproc (vedi NodeInitializationAction)
Comando gcloud
Quando crei un cluster con il comando
gcloud dataproc clusters create, specifica una o più posizioni (URI) Cloud Storage separate da virgola
degli script o degli eseguibili di inizializzazione con il
--initialization-actions
flag. Nota: non sono supportati più "/" consecutivi in un URI della posizione di Cloud Storage dopo "gs://" iniziale, 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 ...
- Utilizza il flag
--initialization-action-timeout
per specificare un periodo di timeout per l'azione di inizializzazione. Il valore predefinito del timeout è 10 minuti. Se lo script o l'eseguibile 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à cluster per eseguire l'azione di inizializzazione sui worker principali prima dell'avvio dei demoni node manager e datanode.
API REST
Specifica uno o più script o eseguibili in un array ClusterConfig.initializationActions come parte di una richiesta dell'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
Passaggio di argomenti alle azioni di inizializzazione
Dataproc imposta valori di metadati speciali per le istanze in esecuzione nei cluster. Puoi impostare i tuoi metadati personalizzati per trasmettere gli 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 una semplice logica di selezione dei nodi all'eseguibile o allo 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
Binari di gestione temporanea
Uno scenario di inizializzazione del cluster comune è la gestione temporanea dei file binari dei job su un cluster per eliminare la necessità di eseguire la gestione temporanea dei 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
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-staged:
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 di uso frequente e di altro tipo 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, esamina il
documento
CONTRIBUTING.md
e poi invia una richiesta 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 a partire da zero di ogni script di azione di inizializzazione successiva. 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.