Benutzerdefinierte Container in Dataflow verwenden

Auf dieser Seite wird beschrieben, wie Sie die Laufzeitumgebung von Python-Nutzercode in Dataflow-Pipelines durch Bereitstellen eines benutzerdefiniertes Container-Images anpassen.

Wenn Dataflow Worker-VMs startet, werden Docker-Container-Images verwendet. Sie können auch ein benutzerdefiniertes Container-Image angeben, anstatt eines der Apache Beam-Standard-Images zu verwenden. Wenn Sie ein benutzerdefiniertes Container-Image angeben, startet Dataflow Worker, die das angegebene Image abrufen. Ein benutzerdefinierter Container kann beispielsweise folgende Gründe haben:

  • Pipelineabhängigkeiten vorinstallieren, um die Startzeit des Workers zu verkürzen.
  • Pipelineabhängigkeiten vorinstallieren, die in öffentlichen Repositories nicht verfügbar sind.
  • Drittanbieter-Software wird im Hintergrund ausgeführt.
  • Ausführungsumgebung anpassen.

Ausführlichere Informationen zu benutzerdefinierten Containern finden Sie im Leitfaden zu benutzerdefinierten Containern für Apache Beam.

Hinweis

Prüfen Sie, ob Sie das Apache Beam SDK in der Version 2.25.0 oder höher installiert haben. Prüfen Sie, ob diese Apache Beam SDK-Version Ihre Python-Version unterstützt. Weitere Informationen finden Sie in der Anleitung Apache Beam SDK installieren.

Installieren Sie Docker, um das Container-Image lokal zu testen. Weitere Informationen finden Sie unter Docker herunterladen.

Container-Image erstellen

In diesem Beispiel verwenden wir Python 3.8 mit der Apache Beam SDK-Version 2.25.0. Wenn Sie ein benutzerdefiniertes Container-Image erstellen möchten, geben Sie das Apache Beam-Image als übergeordnetes Image an und fügen Sie Ihre eigenen Anpassungen hinzu.

  1. Erstellen Sie eine neue Dockerfile. Legen Sie dazu apache/beam_python3.8_sdk:2.25.0 als übergeordnetes Element fest und fügen Sie ggf. Anpassungen hinzu. Weitere Informationen zum Schreiben von Dockerfiles finden Sie unter Best Practices für das Schreiben von Dockerfiles.
    FROM apache/beam_python3.8_sdk:2.25.0
    # Make your customizations here, for example:
    ENV FOO=/bar
    COPY path/to/myfile ./
  2. Erstellen Sie das untergeordnete Image und übertragen Sie dieses Image per Push in eine Container Registry.

    Cloud Build

    export PROJECT=PROJECT
    export REPO=REPO
    export TAG=TAG
    export REGISTRY_HOST=HOST
    export IMAGE_URI=$REGISTRY_HOST/$PROJECT/$REPO:$TAG
    
    gcloud builds submit --tag $IMAGE_URI

    docker

    export PROJECT=PROJECT
    export REPO=REPO
    export TAG=TAG
    export REGISTRY_HOST=HOST
    export IMAGE_URI=$REGISTRY_HOST/$PROJECT/$REPO:$TAG
    
    docker build -f Dockerfile -t $IMAGE_URI ./
    docker push $IMAGE_URI
    Ersetzen Sie Folgendes:
    • PROJECT: der Projekt- oder Nutzername.
    • REPO: der Name des Image-Repository.
    • TAG: das Image-Tag.
    • HOST: der Hostname der Image-Registry, z. B. gcr.io.

Anwendung lokal testen

Testen Sie das Container-Image lokal. Führen Sie das Apache Beam-Beispiel wordcount mit PortableRunner aus:

python -m apache_beam.examples.wordcount \
  --input=INPUT_FILE \
  --output=OUTPUT_FILE \
  --runner=PortableRunner \
  --job_endpoint=embed \
  --environment_type=DOCKER \
  --environment_config=$IMAGE_URI

Dabei gilt:

  • INPUT_FILE: eine Datei im Container-Image, die als Textdatei gelesen werden kann.
  • OUTPUT_FILE: ein Dateipfad im Container-Image zum Schreiben der Ausgabe. Nach Abschluss der Ausführung kann nicht auf die Ausgabedatei zugegriffen werden, da der Container heruntergefahren ist.
  • $IMAGE_URI: der URI des benutzerdefinierten Container-Images. Sie können die im vorherigen Schritt erstellte Shell-Variable $IMAGE_URI verwenden, wenn sich die Variable noch im Gültigkeitsbereich befindet.

Prüfen Sie anhand der Konsolenlogs, ob die Pipeline erfolgreich abgeschlossen wurde und das von $IMAGE_URI angegebene Remote-Image verwendet wurde.

Weitere Informationen finden Sie im Apache Beam-Leitfaden zum Ausführen von Pipelines mit benutzerdefinierten Container-Images.

Dataflow-Job starten

Geben Sie beim Starten der Apache Beam-Pipeline in Dataflow den Pfad zum Container-Image an. Wenn Sie eine Batch-Python-Pipeline starten, müssen Sie das Flag --experiment=use_runner_v2 festlegen. Wenn Sie eine Streaming-Python-Pipeline starten, ist die Angabe des Tests nicht erforderlich. So starten Sie beispielsweise das Batch-WordCount-Beispiel mit einem benutzerdefinierten Container-Image:

python -m apache_beam.examples.wordcount \
  --input=INPUT_FILE \
  --output=OUTPUT_FILE \
  --project=PROJECT_ID \
  --region=REGION \
  --temp_location=TEMP_LOCATION \
  --runner=DataflowRunner \
  --experiment=use_runner_v2 \
  --worker_harness_container_image=$IMAGE_URI

Dabei gilt:

  • INPUT_FILE: der Cloud Storage-Eingabedateipfad, der von Dataflow beim Ausführen des Beispiels gelesen wird.
  • OUTPUT_FILE: der Pfad der Cloud Storage-Ausgabedatei, in den die Beispielpipeline geschrieben wird. Diese enthält die Anzahl der Wörter.
  • PROJECT_ID: die ID Ihres Google Cloud-Projekts.
  • REGION: der regionale Endpunkt für die Bereitstellung Ihres Dataflow-Jobs.
  • TEMP_LOCATION: ein Cloud Storage-Pfad, den Dataflow für das Staging temporärer Jobdateien verwendet, die während der Pipelineausführung erstellt werden.
  • $IMAGE_URI: der URI des benutzerdefinierten Container-Images. Sie können die im vorherigen Schritt erstellte Shell-Variable $IMAGE_URI verwenden, wenn sich die Variable noch im Gültigkeitsbereich befindet.

Fehlerbehebung

Dieser Abschnitt enthält Anleitungen zur Behebung häufiger Probleme bei der Interaktion mit benutzerdefinierten Containern in Dataflow.

Bevor Sie sich an den Support wenden, prüfen Sie, ob Probleme mit Ihrem Container-Image behoben wurden. Führen Sie dazu die Schritte unter Lokal Testen und in den folgenden Abschnitten zur Fehlerbehebung aus.

Containerlogs suchen

Die Dataflow-Worker-Logs für Fehlermeldungen in Bezug auf Container finden Sie mit dem Log-Explorer:

  1. Wählen Sie die folgenden Lognamen aus:

    • dataflow.googleapis.com/docker
    • dataflow.googleapis.com/kubelet
    • dataflow.googleapis.com/worker
  2. Wählen Sie die Ressource Dataflow Step aus und geben Sie job_id an.

Worker starten nicht

Wenn Ihre Worker nicht starten oder das Zeitlimit für Ihren Job überschritten wird, prüfen Sie, ob Dataflow Ihr benutzerdefiniertes Container-Image abrufen kann.

Fragen Sie die Dataflow-Logs mit Logs Explorer für die Lognachricht Error Syncing pod... mit der folgenden Abfrage ab:

resource.type="dataflow_step" AND jsonPayload.message:("$IMAGE_URI") AND severity="ERROR"

Das Image muss für Dataflow-Worker zugänglich sein, damit die Worker das Image beim Start abrufen können. Wenn Sie das Container-Image mit Container Registry hosten, kann das standardmäßige Google Cloud-Dienstkonto bereits auf Images im selben Projekt zugreifen. Wenn Dataflow das Container-Image nicht abrufen kann, können die Worker nicht gestartet werden.

Weitere Informationen finden Sie unter Zugriffssteuerung konfigurieren.