Wenn Sie einen Managed Service for Apache Spark-Cluster erstellen, können Sie Initialisierungsaktionen in ausführbaren Dateien oder Skripts angeben, die Managed Service for Apache Spark sofort nach der Einrichtung des Clusters auf allen Knoten in Ihrem Managed Service for Apache Spark-Cluster ausführt. Initialisierungsaktionen richten häufig Jobabhängigkeiten ein, beispielsweise die Installation von Python-Paketen, sodass Jobs an den Cluster gesendet werden können, ohne Abhängigkeiten bei der Ausführung der Jobs zu installieren.
Beispielskripts für Initialisierungsaktionen finden Sie an den folgenden Speicherorten: Hinweis: Google bietet keinen Support für diese Beispiele.
- GitHub-Repository
- Cloud Storage: in den regionalen öffentlichen
gs://goog-dataproc-initialization-actions-REGION-Buckets
Wichtige Hinweise und Richtlinien
Erstellen Sie keine Produktionscluster, die auf Initialisierungsaktionen in den öffentlichen
gs://goog-dataproc-initialization-actions-REGION-Buckets verweisen. Diese Skripts werden als Referenzimplementierungen bereitgestellt. Sie werden mit laufenden Änderungen am GitHub-Repository synchronisiert. Aktualisierungen dieser Skripts können die Clustererstellung beeinträchtigen. Kopieren Sie stattdessen die Initialisierungsaktion aus dem öffentlichen Bucket in einen versionierten Cloud Storage-Bucket-Ordner, wie im folgenden Beispiel gezeigt: Erstellen Sie dann den Cluster, indem Sie auf die Kopie in Cloud Storage verweisen:REGION=COMPUTE_REGIONgcloud 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.shgcloud dataproc clusters create CLUSTER_NAME \ --region=${REGION} \ --initialization-actions=gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh \ ...other flags...Initialisierungsaktionen werden während der Clustererstellung nacheinander auf jedem Knoten ausgeführt. Sie werden auch auf jedem hinzugefügten Knoten ausgeführt, wenn Cluster hochskaliert oder automatisch hochskaliert werden.
Wenn Sie Initialisierungsaktionen aktualisieren, z. B. wenn Sie Ihre Cloud Storage-Initialisierungsaktionen mit Änderungen an Initialisierungsaktionen in öffentlichen Buckets oder GitHub-Repositories synchronisieren, erstellen Sie einen neuen Ordner (vorzugsweise mit Versionsnamen), um die aktualisierten Initialisierungsaktionen zu erhalten. Wenn Sie stattdessen die Initialisierungsaktion direkt aktualisieren, wird auf neuen Knoten, z. B. solchen, die vom Autoscaling hinzugefügt wurden, die direkt aktualisierte Initialisierungsaktion ausgeführt, nicht die Initialisierungsaktion der vorherigen Version, die auf vorhandenen Knoten ausgeführt wurde. Solche Unterschiede bei Initialisierungsaktionen können zu inkonsistenten oder fehlerhaften Clusterknoten führen.
Initialisierungsaktionen werden als
root-Nutzer ausgeführt. Sie müssensudonicht verwenden.Verwenden Sie in Initialisierungsaktionen absolute Pfade.
Verwenden Sie in Initialisierungsaktionen eine Shebang-Zeile, um anzugeben, wie das Skript interpretiert werden soll (z. B.
#!/bin/bashoder#!/usr/bin/python).Verwenden Sie in Initialisierungsaktionen Zeilenenden im Unix-Stil (LF). Wenn Sie Initialisierungsaktionen unter Windows erstellen, enthalten sie möglicherweise Zeilenenden im Windows-Stil (CRLF), was zu Fehlern bei der Skriptausführung führen kann.
Wenn eine Initialisierungsaktion mit einem Exit-Code ungleich null beendet wird, meldet der Vorgang der Clustererstellung den Status "ERROR" (Fehler). Wenn Sie die Initialisierungsaktion debuggen möchten, stellen Sie über SSH eine Verbindung zu den VM-Instanzen des Clusters her und prüfen Sie dann die Logs. Nachdem Sie das Problem mit der Initialisierungsaktion behoben haben, können Sie den Cluster löschen und anschließend neu erstellen.
Wenn Sie einen Managed Service for Apache Spark-Cluster mit nur internen IP-Adressen erstellen, schlagen Versuche, in einer Initialisierungsaktion über das Internet auf
github.comzuzugreifen, fehl, es sei denn, Sie haben Routen konfiguriert, um den Traffic über Cloud NAT oder ein Cloud VPN zu leiten. Wenn Sie keinen Zugriff auf das Internet haben, können Sie den privaten Google-Zugriff aktivieren und Jobabhängigkeiten in Cloud Storage platzieren. Clusterknoten können die Abhängigkeiten dann von Cloud Storage über interne IP-Adressen herunterladen.Sie können benutzerdefinierte Images für Managed Service for Apache Spark anstelle von Initialisierungsaktionen verwenden, um Jobabhängigkeiten einzurichten.
Initialisierungsverarbeitung:
- Image-Cluster vor Version 2.0:
- Master: Damit Initialisierungsaktionen, die auf Mastern ausgeführt werden, Dateien in HDFS schreiben können, werden Initialisierungsaktionen für Masterknoten erst gestartet, wenn HDFS beschreibbar ist (wenn HDFS den abgesicherten Modus verlassen hat und mindestens zwei HDFS-DataNodes beigetreten sind).
- Worker: Wenn Sie die Cluster-Property
dataproc:dataproc.worker.custom.init.actions.modeaufRUN_BEFORE_SERVICESsetzen, führt jeder Worker seine Initialisierungsaktionen aus, bevor er seine HDFS-Datanode- und YARN-Nodemanager-Daemons startet. Da Managed Service for Apache Spark Master-Initialisierungsaktionen erst ausführt, wenn HDFS beschreibbar ist, wofür zwei HDFS-Datenknoten-Daemons ausgeführt werden müssen, kann das Festlegen dieses Attributs die Clustererstellungszeit verlängern.
Image-Cluster ab Version 2.0:
- Master: Master-Initialisierungsaktionen können ausgeführt werden, bevor HDFS beschreibbar ist. Wenn Sie Initialisierungsaktionen ausführen, die Dateien in HDFS bereitstellen oder von der Verfügbarkeit von HDFS-abhängigen Diensten wie Ranger abhängen, können Sie Folgendes festlegen:
dataproc.master.custom.init.actions.modeClusterattribut inRUN_AFTER_SERVICES. Hinweis: Da diese Property-Einstellung die Clustererstellungszeit erhöhen kann, sollten Sie sie nur bei Bedarf verwenden. Weitere Informationen finden Sie in der Erläuterung zur Verzögerung der Clustererstellung für Cluster-Worker mit Images vor Version 2.0. Verwenden Sie sie nur, wenn dies erforderlich ist. Verwenden Sie im Allgemeinen die StandardeinstellungRUN_BEFORE_SERVICESfür diese Property. - Worker: Die Cluster-Property
dataproc:dataproc.worker.custom.init.actions.modeist aufRUN_BEFORE_SERVICESfestgelegt und kann nicht an den Cluster übergeben werden, wenn der Cluster erstellt wird. Sie können die Property-Einstellung nicht ändern. Jeder Worker führt seine Initialisierungsaktionen aus, bevor er seinen HDFS-Datenknoten und die YARN-Knotenmanager-Daemons startet. Da Managed Service for Apache Spark nicht darauf wartet, dass HDFS beschreibbar ist, bevor Master-Initialisierungsaktionen ausgeführt werden, werden Master- und Worker-Initialisierungsaktionen parallel ausgeführt.
- Master: Master-Initialisierungsaktionen können ausgeführt werden, bevor HDFS beschreibbar ist. Wenn Sie Initialisierungsaktionen ausführen, die Dateien in HDFS bereitstellen oder von der Verfügbarkeit von HDFS-abhängigen Diensten wie Ranger abhängen, können Sie Folgendes festlegen:
Empfehlungen:
- Ermitteln Sie über Metadaten die Rolle eines Knotens, um in Abhängigkeit Initialisierungsaktionen auf Knoten auszuführen. Weitere Informationen finden Sie unter Clustermetadaten verwenden.
- Erstellen Sie aus Gründen der Stabilität eine Kopie einer Initialisierungsaktion in einem Cloud Storage-Bucket. Weitere Informationen zur Verwendung von Initialisierungsaktionen
- Fügen Sie Wiederholungsversuche hinzu, wenn Sie aus dem Internet herunterladen, um die Initialisierungsaktion zu stabilisieren.
- Image-Cluster vor Version 2.0:
Initialisierungsaktionen verwenden
Cluster-Initialisierungsaktionen können unabhängig davon angegeben werden, mit welcher Methode der Cluster erstellt wird:
- Über die Google Cloud Console
- gcloud CLI verwenden
- Programmatisch mit der Dataproc API clusters.create (siehe NodeInitializationAction)
Google Cloud Console
gcloud-CLI
Wenn Sie einen Cluster mit dem Befehl gcloud dataproc clusters create erstellen, geben Sie mit dem Flag --initialization-actions einen oder mehrere kommagetrennte Cloud Storage-Speicherorte (URIs) der ausführbaren Initialisierungsdateien oder ‑skripts an. Hinweis: Mehrere aufeinanderfolgende "/"s in einem Cloud Storage-Standort-URI nach dem ersten "gs://", z. B. "gs://bucket/my//object//name", werden nicht unterstützt. Führen Sie gcloud dataproc clusters create --help aus, um Informationen zum Befehl zu erhalten.
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 ...
- Verwenden Sie das Flag
--initialization-action-timeout, um ein Zeitlimit für die Initialisierungsaktion anzugeben. Das standardmäßige Zeitlimit beträgt 10 Minuten. Wenn die ausführbare Datei oder das Skript für die Initialisierung nicht vor Ablauf des Zeitlimits abgeschlossen ist, bricht Managed Service for Apache Spark die Initialisierungsaktion ab. - Führen Sie mit dem Clusterattribut
dataproc:dataproc.worker.custom.init.actions.modedie Initialisierungsaktion auf primären Workern aus, bevor Sie den Knotenmanager und die Datenknoten-Daemons starten.
REST API
Geben Sie ein oder mehrere Skripts oder ausführbare Dateien in einem ClusterConfig.initializationActions-Array als Teil der API-Anfrage clusters.create an.
Beispiel
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"
}
]
}
}
Argumente an Initialisierungsaktionen übergeben
Managed Service for Apache Spark legt spezielle Metadatenwerte für die Instanzen fest, die in Ihren Clustern ausgeführt werden. Sie können Ihre eigenen benutzerdefinierten Metadaten festlegen, um Argumente an Initialisierungsaktionen zu übergeben.
gcloud dataproc clusters create cluster-name \
--region=${REGION} \
--initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
--metadata=name1=value1,name2=value2... \
... other flags ...
Metadatenwerte können auf folgende Weise in Initialisierungsaktionen gelesen werden:
var1=$(/usr/share/google/get_metadata_value attributes/name1)
Knotenauswahl
Wenn Sie Initialisierungsaktionen auf Master-, Treiber- oder Worker-Knoten beschränken möchten, können Sie Ihrer ausführbaren Datei oder Ihrem Skript eine Knotenauswahllogik hinzufügen.
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
Binärdateien bereitstellen
Ein gängiges Szenario der Cluster-Initialisierung ist das Staging von binären Jobdateien auf einem Cluster. Hierdurch wird vermieden, dass die Binärdateien bei jeder Jobausführung einem Staging-Prozess unterzogen werden. Angenommen, das folgende Initialisierungsskript ist in gs://my-bucket/download-job-jar.sh, einem Cloud Storage-Bucket-Speicherort, gespeichert:
#!/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
Der Speicherort dieses Skripts kann an den Befehl gcloud dataproc clusters create übergeben werden:
gcloud dataproc clusters create my-dataproc-cluster \
--region=${REGION} \
--initialization-actions=gs://my-bucket/download-job-jar.sh
Managed Service for Apache Spark führt dieses Script auf allen Knoten aus und lädt die JAR-Datei aufgrund der Knotenauswahllogik des Scripts auf den Masterknoten herunter. Gesendete Jobs können dann die JAR-Datei in der Vor-Staging-Phase verwenden:
gcloud dataproc jobs submit hadoop \
--cluster=my-dataproc-cluster \
--region=${REGION} \
--jar=file:///home/username/sessionalize-logs-1.0.jar
Beispiele für Initialisierungsaktionen
Häufig verwendete und andere Beispielscripts für Initialisierungsaktionen befinden sich in gs://goog-dataproc-initialization-actions-<REGION>, einem regionalen öffentlichen Cloud Storage-Bucket, und in einem GitHub-Repository.
Wenn Sie ein Skript beitragen möchten, lesen Sie das Dokument CONTRIBUTING.md und senden Sie eine Pull-Anfrage.
Logging
Die Ausgabe der einzelnen Initialisierungsaktionen wird für jede Instanz im Log /var/log/dataproc-initialization-script-X.log erfasst, wobei X der nullbasierte Index jedes nachfolgenden Skripts mit Initialisierungsaktionen ist. Wenn Ihr Cluster beispielsweise zwei Initialisierungsaktionen hat, werden die Ausgaben in /var/log/dataproc-initialization-script-0.log und /var/log/dataproc-initialization-script-1.log protokolliert.
Nächste Schritte
GitHub-Initialisierungsaktionen entdecken.