Initialisierungsaktionen

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.

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:

    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
    
    Erstellen Sie dann den Cluster, indem Sie auf die Kopie in Cloud Storage verweisen:
    gcloud 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üssen sudo nicht 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/bash oder #!/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.com zuzugreifen, 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.mode auf RUN_BEFORE_SERVICES setzen, 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.mode Clusterattribut in RUN_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 Standardeinstellung RUN_BEFORE_SERVICES für diese Property.
      • Worker: Die Cluster-Property dataproc:dataproc.worker.custom.init.actions.mode ist auf RUN_BEFORE_SERVICES festgelegt 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.
    • 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.

Initialisierungsaktionen verwenden

Cluster-Initialisierungsaktionen können unabhängig davon angegeben werden, mit welcher Methode der Cluster erstellt wird:

Google Cloud Console

  • Öffnen Sie die Seite Cluster erstellen.
  • Klicken Sie auf Zusätzliche Konfiguration, um den Bereich zu maximieren.
  • Bearbeiten Sie Anpassung und Sonstiges.
  • Klicken Sie im geöffneten Steuerfeld auf Initialisierungsaktionen hinzufügen und geben Sie den Cloud Storage-Speicherort einer Initialisierungsaktion ein oder suchen Sie danach.
  • 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 ...
    
    Hinweise:
    • 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.mode die 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.