Flexible Vorlagen zum Verpacken einer Dataflow-Pipeline für die Bereitstellung verwenden

Auf dieser Seite wird beschrieben, wie Sie eine flexible Vorlage für eine Dataflow-Pipeline erstellen. Mit flexiblen Vorlagen können Sie Ihren Apache Beam-Pipelinecode so verpacken, dass Sie die Pipeline ohne Entwicklungsumgebung ausführen können. Wenn Sie eine Flex-Vorlage erstellen, kann jeder Nutzer mit den entsprechenden Berechtigungen Ihre Pipeline als Dataflow-Job ausführen.

Eine End-to-End-Anleitung zum Erstellen und Ausführen einer Flex-Vorlage finden Sie unter Beispiel für eine Flex-Vorlage erstellen und ausführen.

Übersicht

Eine flexible Vorlage besteht aus folgenden Komponenten:

  • Ein in Artifact Registry gespeichertes Container-Image. Der Container ist für das Starten des Dataflow-Jobs zuständig.

  • Eine JSON-Spezifikationsdatei, die in Cloud Storage gespeichert ist. Diese Datei enthält einen Verweis auf das Container-Image und andere Metadaten.

Bevor Sie eine flexible Vorlage erstellen, müssen Sie den Pipelinecode mit dem Apache Beam SDK schreiben. Weitere Informationen finden Sie unter Apache Beam zum Erstellen von Pipelines verwenden.

Das Programm, das die Pipeline erstellt, muss nach dem Aufruf von run beendet werden, damit die Pipeline gestartet werden kann. Rufen Sie waitUntilFinish (Java) oder wait_until_finish (Python) nicht auf, da diese Funktionen blockieren und verhindern, dass die Flex-Vorlage ausgeführt wird.

Erforderliche Berechtigungen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für das Projekt zuzuweisen, damit Sie die nötigen Berechtigungen zum Erstellen einer flexiblen Vorlage haben:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Metadaten der Vorlage

Optional können Sie zusätzliche Metadaten für Ihre Vorlage angeben, darunter:

  • Pipelineparameter: Deklarieren Sie alle benutzerdefinierten Pipelineoptionen, die von Ihrer Pipeline verwendet werden. Dataflow validiert die Parameter, wenn Sie den Flex-Vorlagenjob senden. Wenn Sie die Vorlage über dieGoogle Cloud Console ausführen, enthält das Dialogfeld Job aus Vorlage erstellen die in den Metadaten deklarierten Pipelineparameter.

  • Streamingunterstützung: Sie können angeben, ob die Pipeline Streaming unterstützt und, falls ja, ob sie den „Genau einmal“-Modus oder den „Mindestens einmal“-Modus unterstützt. Anhand dieser Metadaten kann in der Google Cloud Console die relevanten Pipelineoptionen angezeigt werden, wenn Sie die Vorlage ausführen.

Wenn Sie zusätzliche Metadaten einfügen möchten, erstellen Sie eine JSON-Datei mit den Metadatenparametern. Geben Sie diese Datei im Flag --metadata-file des Befehls gcloud dataflow flex-template build an. Der Inhalt der Metadatendatei wird in die Vorlagenspezifikationsdatei eingefügt. Weitere Informationen finden Sie unter Flex-Vorlage erstellen.

Metadatenparameter

Parameterschlüssel Erforderlich Beschreibung des Werts
name Ja Der Name Ihrer Vorlage.
description Nein Ein kurzer Textabschnitt, der die Vorlage beschreibt.
streaming Nein Wenn true, unterstützt diese Vorlage das Streaming. Der Standardwert ist false.
supportsAtLeastOnce Nein Wenn true, unterstützt diese Vorlage die mindestens einmalige Verarbeitung. Der Standardwert ist false. Setzen Sie diesen Parameter auf true, wenn die Vorlage für den "Mindestens einmal"-Streamingmodus ausgelegt ist.
supportsExactlyOnce Nein Bei true unterstützt diese Vorlage die genau einmalige Verarbeitung. Der Standardwert ist true.
defaultStreamingMode Nein Den Standard-Streamingmodus für Vorlagen, die sowohl den "Mindestens einmal"-Modus als auch den "Genau einmal"-Modus unterstützen. Verwenden Sie einen der folgenden Werte: "AT_LEAST_ONCE", "EXACTLY_ONCE". Wenn keine Angabe gemacht wird, wird der Standard-Streamingmodus "genau einmal" verwendet.
parameters Nein Ein Array von zusätzlichen Parametern, die die Vorlage verwendet. Ein leeres Array wird standardmäßig verwendet.
name Ja Der Name des Parameters, der in Ihrer Vorlage verwendet wird.
label Ja Ein für Menschen lesbarer String, der in der Google Cloud Console verwendet wird, um den Parameter mit einem Label zu versehen.
helpText Ja Ein kurzer Textabschnitt, der den Parameter beschreibt.
isOptional Nein false, wenn der Parameter erforderlich ist, und true, wenn der Parameter optional ist. Sofern kein Wert festgelegt ist, wird für isOptional standardmäßig der Wert false verwendet. Wenn Sie diesen Parameterschlüssel nicht für Ihre Metadaten angeben, werden die Metadaten zu einem erforderlichen Parameter.
regexes Nein Ein Array von regulären POSIX-egrep-Ausdrücken in Stringform, die verwendet werden, um den Wert des Parameters zu validieren. Beispiel: ["^[a-zA-Z][a-zA-Z0-9]+"] ist ein einzelner regulärer Ausdruck, der validiert, dass der Wert mit einem Buchstaben beginnt und dann ein oder mehrere Zeichen enthält. Ein leerer Array wird standardmäßig verwendet.

Beispiel-Metadatendatei

Java

{
  "name": "Streaming Beam SQL",
  "description": "An Apache Beam streaming pipeline that reads JSON encoded messages from Pub/Sub, uses Beam SQL to transform the message data, and writes the results to a BigQuery",
  "parameters": [
    {
      "name": "inputSubscription",
      "label": "Pub/Sub input subscription.",
      "helpText": "Pub/Sub subscription to read from.",
      "regexes": [
        "[a-zA-Z][-_.~+%a-zA-Z0-9]{2,}"
      ]
    },
    {
      "name": "outputTable",
      "label": "BigQuery output table",
      "helpText": "BigQuery table spec to write to, in the form 'project:dataset.table'.",
      "isOptional": true,
      "regexes": [
        "[^:]+:[^.]+[.].+"
      ]
    }
  ]
}

Python

{
  "name": "Streaming beam Python flex template",
  "description": "Streaming beam example for python flex template.",
  "parameters": [
    {
      "name": "input_subscription",
      "label": "Input PubSub subscription.",
      "helpText": "Name of the input PubSub subscription to consume from.",
      "regexes": [
        "projects/[^/]+/subscriptions/[a-zA-Z][-_.~+%a-zA-Z0-9]{2,}"
      ]
    },
    {
      "name": "output_table",
      "label": "BigQuery output table name.",
      "helpText": "Name of the BigQuery output table name.",
      "isOptional": true,
      "regexes": [
        "([^:]+:)?[^.]+[.].+"
      ]
    }
  ]
}

Sie können Metadatendateien für die von Google bereitgestellten Vorlagen aus dem Vorlagenverzeichnis von Dataflow herunterladen.

Umgebungsvariablen

Wenn Sie eine flexible Vorlage erstellen, geben Sie die folgenden Umgebungsvariablen im Flag --env des Befehls gcloud dataflow flex-template build an. Wenn Sie ein benutzerdefiniertes Image verwenden, legen Sie diese Umgebungsvariablen in Ihrem Dockerfile fest.

Java

ENV Beschreibung Erforderlich
FLEX_TEMPLATE_JAVA_MAIN_CLASS Gibt an, welche Java-Klasse zum Starten der Flex-Vorlage ausgeführt wird. JA
FLEX_TEMPLATE_JAVA_CLASSPATH Gibt den Speicherort der Klassendateien an. JA
FLEX_TEMPLATE_JAVA_OPTIONS Gibt die Java-Optionen an, die beim Starten der Flex-Vorlage übergeben werden sollen. NEIN

Geben Sie FLEX_TEMPLATE_JAVA_MAIN_CLASS und FLEX_TEMPLATE_JAVA_CLASSPATH im Dockerfile an.

Python

ENV Beschreibung Erforderlich
FLEX_TEMPLATE_PYTHON_PY_FILE Gibt an, welche Python-Datei zum Starten der Flex-Vorlage ausgeführt werden soll. JA
FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE Gibt die Anforderungsdatei mit Pipeline-Abhängigkeiten an. Weitere Informationen finden Sie unter PyPI-Abhängigkeiten in der Apache Beam-Dokumentation. NEIN
FLEX_TEMPLATE_PYTHON_SETUP_FILE Gibt den Pfad zur Datei „setup.py“ des Pipelinepakets an. Weitere Informationen finden Sie in der Apache Beam-Dokumentation unter Mehrere Dateiabhängigkeiten. NEIN
FLEX_TEMPLATE_PYTHON_EXTRA_PACKAGES

Gibt die Pakete an, die nicht öffentlich verfügbar sind. Weitere Informationen zur Verwendung zusätzlicher Pakete finden Sie unter Lokale oder Nicht-PyPI-Abhängigkeiten.

NEIN
FLEX_TEMPLATE_PYTHON_PY_OPTIONS Gibt die Python-Optionen an, die beim Starten der Flex-Vorlage übergeben werden sollen. NEIN

Geben Sie FLEX_TEMPLATE_PYTHON_PY_FILE im Dockerfile an.

Legen Sie zum Verwalten von Pipelineabhängigkeiten Variablen in Ihrem Dockerfile fest, z. B.:

  • FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE
  • FLEX_TEMPLATE_PYTHON_PY_OPTIONS
  • FLEX_TEMPLATE_PYTHON_SETUP_FILE
  • FLEX_TEMPLATE_PYTHON_EXTRA_PACKAGES

Die folgenden Umgebungsvariablen werden beispielsweise in der Anleitung zum Streaming in einer Python-Flex-Vorlage in GitHub festgelegt:

ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="${WORKDIR}/requirements.txt"
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="${WORKDIR}/streaming_beam.py"

Go

ENV Beschreibung Erforderlich
FLEX_TEMPLATE_GO_BINARY Gibt die auszuführende binäre Go-Datei an. JA

Geben Sie FLEX_TEMPLATE_GO_BINARY im Dockerfile an.

Images für flexible Vorlagen

Eine Flex-Vorlage enthält ein Container-Image, mit dem die Dataflow-Pipeline gestartet wird. Wenn Sie einen Flex-Vorlagenjob ausführen, lädt der Dataflow-Dienst das Container-Image aus Artifact Registry herunter und startet den Container. Der Container ist für das Starten des Dataflow-Jobs verantwortlich.

Google verwaltet eine Reihe von Basis-Images für Flex-Vorlagen, die Sie verwenden können. Wenn für Ihre Pipeline jedoch ein benutzerdefiniertes Container-Image erforderlich ist, empfehlen wir, dass Sie dasselbe Image für die Flex-Vorlage verwenden. So enthält der Launcher der Flex-Vorlage dieselben Abhängigkeiten wie der Laufzeitcontainer der Pipeline.

Benutzerdefinierte Container-Images

Wenn Sie ein benutzerdefiniertes Flex-Vorlagen-Image erstellen möchten, fügen Sie Ihrem Dockerfile die folgenden Schritte hinzu:

  • Kopieren Sie die Launcher-Binärdatei der Flex-Vorlage aus einem der von Google bereitgestellten Basis-Images in Ihr Image. Das Launcher-Binärprogramm befindet sich unter folgendem Pfad:

    Java

    /opt/google/dataflow/java_template_launcher

    Python

    /opt/google/dataflow/python_template_launcher

    Go

    /opt/google/dataflow/go_template_launcher

  • Kopieren Sie die Artefakte, die zum Starten des Pipeline-Jobs erforderlich sind, z. B. Python-Dateien, JAR-Dateien oder Go-Binärdateien.

  • Legen Sie die in Umgebungsvariablen aufgeführten Umgebungsvariablen fest.

Das folgende Beispiel zeigt ein Dockerfile für eine Python-Pipeline:

# Flex Template base image. Used here to get the launcher binary.
FROM gcr.io/dataflow-templates-base/IMAGE_NAME:TAG as template_launcher

# Apache Beam SDK image. This is the base image for the pipeline job.
FROM apache/beam_python3.10_sdk:2.69.0

# Customize the image for your pipeline.
# [...]

# Configure the Flex Template.
COPY --from=template_launcher /opt/google/dataflow/python_template_launcher /opt/google/dataflow/python_template_launcher
COPY my_pipeline.py /template/
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="/template/my_pipeline.py"

Ersetzen Sie Folgendes:

  • IMAGE_NAME: Ein von Google bereitgestelltes Basis-Image Beispiel: python311-template-launcher-base.
  • TAG: Versions-Tag für das Basis-Image, das unter Basis-Images für Flex-Vorlagen aufgeführt ist. Zur Gewährleistung der Stabilität und zur Fehlerbehebung sollten Sie latest nicht verwenden. Nutzen Sie stattdessen ein konkretes Versions-Tag.

Eine Anleitung für diesen Ansatz finden Sie unter Flex-Vorlage für eine Pipeline mit Abhängigkeiten und einem benutzerdefinierten Container-Image.

Flexible Vorlage erstellen

Verwenden Sie zum Erstellen einer flexiblen Vorlage den Befehl gcloud dataflow flex-template build. Mit diesem Befehl werden die folgenden Artefakte erstellt:

  • Die Vorlagenspezifikationsdatei, die in Cloud Storage gespeichert ist
  • Das Launcher-Container-Image, das in Artifact Registry gespeichert ist

Von Google bereitgestelltes Basis-Image verwenden

Führen Sie den folgenden Befehl aus, um eine flexible Vorlage mit einem von Google bereitgestellten Basis-Image auszuführen:

Java

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG" \
  --sdk-language "JAVA" \
  --flex-template-base-image "BASE_IMAGE" \
  --metadata-file "METADATA_FILE" \
  --jar "JAR_FILE" \
  --env "FLEX_TEMPLATE_JAVA_MAIN_CLASS=JAVA_MAIN_CLASS"

Ersetzen Sie Folgendes:

  • BUCKET_NAME: der Name eines Cloud Storage-Bucket zum Speichern der Vorlagenspezifikationsdatei
  • TEMPLATE_FILE_NAME: Der Name der zu erstellenden Vorlagenspezifikationsdatei. Beispiel: my_template.json
  • LOCATION: der Speicherort Ihres Artifact Registry-Repositorys
  • PROJECT_ID: die Google Cloud Projekt-ID
  • REPOSITORY: der Name Ihres Artifact Registry-Repositorys
  • IMAGE: der Name des Container-Images der Flex-Vorlage
  • TAG: Das Tag für das Container-Image der Flex-Vorlage
  • <pBASE_IMAGE: the base image to use. Specify one of the following:

    • A predefined label, such as "JAVA17". For more information, see the documentation for the --flex-template-base-image flag.
    • The full gcr.io path to a specific container version, in the following format: gcr.io/dataflow-templates-base/IMAGE:TAG.
  • METADATA_FILE: der lokale Pfad zu einer Metafile-Datei. Weitere Informationen finden Sie unter Vorlagenmetadaten.
  • JAR_FILE: Der lokale Pfad zur JAR-Datei für Ihren Pipelinecode. Wenn es mehrere JAR-Dateien gibt, formatieren Sie sie als kommagetrennte Liste oder geben Sie sie in separaten --jar-Flags an.
  • JAVA_MAIN_CLASS: Der Name der auszuführenden Java-Klasse. Weitere Informationen finden Sie unter Umgebungsvariablen.

Python

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG" \
  --sdk-language "PYTHON" \
  --flex-template-base-image "BASE_IMAGE" \
  --metadata-file "METADATA_FILE" \
  --py-path "PYTHON_FILE_PATH" \
  --env "FLEX_TEMPLATE_PYTHON_PY_FILE=PYTHON_FILE"

Ersetzen Sie Folgendes:

  • BUCKET_NAME: der Name eines Cloud Storage-Bucket zum Speichern der Vorlagenspezifikationsdatei
  • TEMPLATE_FILE_NAME: Der Name der zu erstellenden Vorlagenspezifikationsdatei. Beispiel: my_template.json
  • LOCATION: der Speicherort Ihres Artifact Registry-Repositorys
  • PROJECT_ID: die Google Cloud Projekt-ID
  • REPOSITORY: der Name Ihres Artifact Registry-Repositorys
  • IMAGE: der Name des Container-Images der Flex-Vorlage
  • TAG: Das Tag für das Container-Image der Flex-Vorlage
  • <pBASE_IMAGE: the base image to use. Specify one of the following:

    • A predefined label, such as "PYTHON3". For more information, see the documentation for the --flex-template-base-image flag.
    • The full gcr.io path to a specific container version, in the following format: gcr.io/dataflow-templates-base/IMAGE:TAG.
  • METADATA_FILE: der lokale Pfad zu einer Metafile-Datei. Weitere Informationen finden Sie unter Vorlagenmetadaten.
  • PYTHON_FILE_PATH: Der lokale Pfad zu den Python-Dateien für Ihre Pipeline und allen zugehörigen Dateien. Sie können mehrere Pfade als durch Kommas getrennte Liste oder als separate --py-path-Flags angeben.
  • PYTHON_FILE: Die auszuführende Python-Datei. Weitere Informationen finden Sie unter Umgebungsvariablen.

Go

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG" \
  --sdk-language "GO" \
  --flex-template-base-image "BASE_IMAGE" \
  --metadata-file "METADATA_FILE" \
  --go-binary-path="GO_FILE_PATH" \
  --env "FLEX_TEMPLATE_GO_BINARY=GO_BINARY"

Ersetzen Sie Folgendes:

  • BUCKET_NAME: der Name eines Cloud Storage-Bucket zum Speichern der Vorlagenspezifikationsdatei
  • TEMPLATE_FILE_NAME: Der Name der zu erstellenden Vorlagenspezifikationsdatei. Beispiel: my_template.json
  • LOCATION: der Speicherort Ihres Artifact Registry-Repositorys
  • PROJECT_ID: die Google Cloud Projekt-ID
  • REPOSITORY: der Name Ihres Artifact Registry-Repositorys
  • IMAGE: der Name des Container-Images der Flex-Vorlage
  • TAG: Das Tag für das Container-Image der Flex-Vorlage
  • <pBASE_IMAGE: the base image to use. Specify one of the following:

    • A predefined label, such as "GO". For more information, see the documentation for the --flex-template-base-image flag.
    • The full gcr.io path to a specific container version, in the following format: gcr.io/dataflow-templates-base/IMAGE:TAG.
  • METADATA_FILE: der lokale Pfad zu einer Metafile-Datei. Weitere Informationen finden Sie unter Vorlagenmetadaten.
  • GO_FILE_PATH: der lokale Pfad zur kompilierten Go-Binärdatei für die Pipeline
  • GO_BINARY: Das auszuführende Go-Binärprogramm. Weitere Informationen finden Sie unter Umgebungsvariablen.

Benutzerdefiniertes Image verwenden

Führen Sie den folgenden Befehl aus, um eine flexible Vorlage mit einem benutzerdefinierten Container-Image auszuführen:

Java

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image "CUSTOM_IMAGE" \
  --sdk-language "JAVA" \
  --metadata-file "METADATA_FILE"

Python

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image "CUSTOM_IMAGE" \
  --sdk-language "PYTHON" \
  --metadata-file "METADATA_FILE"

Go

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image "CUSTOM_IMAGE" \
  --sdk-language "GO" \
  --metadata-file "METADATA_FILE"

Ersetzen Sie Folgendes:

  • BUCKET_NAME: Der Name eines Cloud Storage-Buckets zum Speichern der Vorlagenspezifikationsdatei.

  • TEMPLATE_FILE_NAME: Der Name der Vorlagenspezifikationsdatei. Beispiel: my_template.json.

  • CUSTOM_IMAGE: Der Speicherort des benutzerdefinierten Images in der Image-Registry.

  • METADATA_FILE: der lokale Pfad zu einer Metafile-Datei.

Paketabhängigkeiten für Python

Wenn eine Dataflow-Python-Pipeline zusätzliche Abhängigkeiten verwendet, müssen Sie möglicherweise die Flex-Vorlage so konfigurieren, dass zusätzliche Abhängigkeiten auf Dataflow-Worker-VMs installiert werden.

Wenn Sie einen Python-Dataflow-Job ausführen, der Flex-Vorlagen in einer Umgebung verwendet, die den Zugriff auf das Internet einschränkt, müssen Sie die Abhängigkeiten beim Erstellen der Vorlage vorab verpacken.

Verwenden Sie eine der folgenden Optionen, um die Python-Abhängigkeiten vorab zu verpacken.

Eine Anleitung zum Verwalten von Pipelineabhängigkeiten in Java- und Go-Pipelines finden Sie unter Pipelineabhängigkeiten in Dataflow verwalten.

Anforderungsdatei verwenden und Abhängigkeiten mit der Vorlage vorab verpacken

Wenn Sie ein eigenes Dockerfile zum Definieren des Flex-Vorlagen-Images verwenden, führen Sie die folgenden Schritte aus:

  1. Erstellen Sie eine requirements.txt-Datei, in der Ihre Pipelineabhängigkeiten aufgelistet sind.

    COPY requirements.txt /template/
    ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="/template/requirements.txt"
    
  2. Installieren Sie die Abhängigkeiten im Flex-Vorlagen-Image.

    RUN pip install --no-cache-dir -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE
    
  3. Laden Sie die Abhängigkeiten in den lokalen Anforderungs-Cache herunter, der den Dataflow-Workern beim Start der Vorlage bereitgestellt wird.

    RUN pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE
    

Bei diesem Ansatz werden Abhängigkeiten aus der requirements.txt-Datei zur Laufzeit auf Dataflow-Workern installiert. Auf dem Tab „Empfehlungen“ der Google Cloud Console Google Cloud wird möglicherweise auf dieses Verhalten hingewiesen. Wenn Sie die Installation von Abhängigkeiten zur Laufzeit vermeiden möchten, verwenden Sie ein benutzerdefiniertes Container-Image.

Im Folgenden finden Sie ein Codebeispiel, in dem eine Datei mit Anforderungen im flexiblen Template verwendet wird.

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

FROM gcr.io/dataflow-templates-base/python3-template-launcher-base

# Configure the Template to launch the pipeline with a --requirements_file option.
# See: https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/#pypi-dependencies
ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="/template/requirements.txt"
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="/template/streaming_beam.py"

COPY . /template

RUN apt-get update \
    # Install any apt packages if required by your template pipeline.
    && apt-get install -y libffi-dev git \
    && rm -rf /var/lib/apt/lists/* \
    # Upgrade pip and install the requirements.
    && pip install --no-cache-dir --upgrade pip \
    # Install dependencies from requirements file in the launch environment.
    && pip install --no-cache-dir -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE \
    # When FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE  option is used,
    # then during Template launch Beam downloads dependencies
    # into a local requirements cache folder and stages the cache to workers.
    # To speed up Flex Template launch, pre-download the requirements cache
    # when creating the Template.
    && pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE

# Set this if using Beam 2.37.0 or earlier SDK to speed up job submission.
ENV PIP_NO_DEPS=True

ENTRYPOINT ["/opt/google/dataflow/python_template_launcher"]

Pipeline als Paket strukturieren und lokale Pakete verwenden

Wenn Sie mehrere lokale Python-Dateien oder -Module verwenden, strukturieren Sie Ihre Pipeline als Paket. Die Dateistruktur könnte so aussehen:

main.py
pyproject.toml
setup.py
src/
  my_package/
    __init__.py
    my_custom_dofns_and_transforms.py
    my_pipeline_launcher.py
    other_utils_and_helpers.py
  1. Platzieren Sie den Einstiegspunkt der obersten Ebene, z. B. die Datei main.py, im Stammverzeichnis. Speichern Sie die restlichen Dateien in einem separaten Ordner im Verzeichnis src, z. B. my_package.

  2. Fügen Sie dem Stammverzeichnis die Paketkonfigurationsdateien mit den Paketdetails und ‑anforderungen hinzu.

    pyproject.toml

    [project]
    name = "my_package"
    version = "package_version"
    dependencies = [
      # Add list of packages (and versions) that my_package depends on.
      # Example:
      "apache-beam[gcp]==2.54.0",
    ]
    

    setup.py

      """An optional setuptools configuration stub for the pipeline package.
    
      Use pyproject.toml to define the package. Add this file only if you must
      use the --setup_file pipeline option or the
      FLEX_TEMPLATE_PYTHON_SETUP_FILE configuration option.
      """
    
      import setuptools
      setuptools.setup()
    

    Weitere Informationen zum Konfigurieren Ihres lokalen Pakets finden Sie unter Python-Projekte verpacken.

  3. Wenn Sie lokale Module oder Dateien für Ihre Pipeline importieren, verwenden Sie den Paketnamen my_package als Importpfad.

    from my_package import word_count_transform
    
  4. Installieren Sie das Pipelinepaket im Image für flexible Vorlagen. Ihr Dockerfile für flexible Vorlagen kann Inhalte enthalten, die dem folgenden Beispiel ähneln:

    Dockerfile

    ENV FLEX_TEMPLATE_PYTHON_PY_FILE="${WORKDIR}/main.py"
    ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="${WORKDIR}/setup.py"
    
    # Copy pipeline, packages and requirements.
    WORKDIR ${WORKDIR}
    COPY main.py .
    COPY pyproject.toml .
    COPY setup.py .
    COPY src src
    
    # Install local package.
    RUN pip install -e .
    

Bei diesem Ansatz werden Abhängigkeiten aus der requirements.txt-Datei zur Laufzeit auf Dataflow-Workern installiert. Auf dem Tab „Empfehlungen“ der Google Cloud Console Google Cloud wird möglicherweise auf dieses Verhalten hingewiesen. Um die Installation von Abhängigkeiten zur Laufzeit zu vermeiden, verwenden Sie ein benutzerdefiniertes Container-Image.

Ein Beispiel für diesen Ansatz finden Sie in der Anleitung Flexible Vorlage für eine Pipeline mit Abhängigkeiten und einem benutzerdefinierten Container-Image in GitHub.

Benutzerdefinierten Container verwenden, der alle Abhängigkeiten vorinstalliert

Verwenden Sie benutzerdefinierte Container, um die Installation von Abhängigkeiten zur Laufzeit zu vermeiden. Diese Option wird für Pipelines bevorzugt, die in Umgebungen ohne Internetzugriff ausgeführt werden.

So verwenden Sie einen benutzerdefinierten Container:

  1. Erstellen Sie ein Image für benutzerdefinierte Container, der erforderliche Abhängigkeiten vorinstalliert.

  2. Installieren Sie dieselben Abhängigkeiten im Dockerfile der Flex-Vorlage.

    Wenn Sie die Installation von Abhängigkeiten zur Laufzeit verhindern möchten, verwenden Sie die Optionen FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE oder FLEX_TEMPLATE_PYTHON_SETUP_FILE nicht in Ihrer Flex-Vorlagenkonfiguration.

    Eine geänderte flexible Vorlage Dockerfile könnte so aussehen wie in folgendem Beispiel:

    FROM gcr.io/dataflow-templates-base/python3-template-launcher-base
    ENV FLEX_TEMPLATE_PYTHON_PY_FILE="/template/main.py"
    COPY . /template
    # If you use a requirements file, pre-install the requirements.txt.
    RUN pip install --no-cache-dir -r /template/requirements.txt
    # If you supply the pipeline in a package, pre-install the local package and its dependencies.
    RUN pip install -e /template
    

    Wenn Sie diesen Ansatz verwenden, gehen Sie so vor:

    • Image für flexible Vorlagen erstellen
    • Benutzerdefiniertes SDK-Container-Image erstellen
    • In beiden Images dieselben Abhängigkeiten installieren

    Alternativ können Sie Ihr benutzerdefiniertes Container-Image als Basis-Image für die flexible Vorlage verwenden, um die Anzahl der zu verwaltenden Images zu reduzieren.

  3. Wenn Sie das Apache Beam SDK in Version 2.49.0 oder niedriger verwenden, fügen Sie die Pipelineoption --sdk_location=container in Ihrem Pipeline-Launcher hinzu. Mit dieser Option wird Ihre Pipeline angewiesen, das SDK aus dem benutzerdefinierten Container zu verwenden, anstatt das SDK herunterzuladen.

    options = PipelineOptions(beam_args, save_main_session=True, streaming=True, sdk_location="container")
    
  4. Legen Sie im Befehl flex-template run den Parameter sdk_container_image fest. Beispiel:

    gcloud dataflow flex-template run $JOB_NAME \
       --region=$REGION \
       --template-file-gcs-location=$TEMPLATE_PATH \
       --parameters=sdk_container_image=$CUSTOM_CONTAINER_IMAGE \
       --additional-experiments=use_runner_v2
    

    Weitere Informationen finden Sie unter Benutzerdefinierte Container in Dataflow verwenden.

Private Docker-Registry mit flexiblen Vorlagen verwenden

Sie können ein Flex-Vorlagen-Image erstellen, das in einer privaten Docker-Registry gespeichert ist, wenn die private Registry HTTPS verwendet und ein gültiges Zertifikat hat.

Wenn Sie ein Image aus einer privaten Registry verwenden möchten, geben Sie den Pfad zum Image sowie einen Nutzernamen und ein Passwort für die Registry an. Der Nutzername und das Passwort müssen im Secret Manager gespeichert werden. Sie können das Secret in einem der folgenden Formate angeben:

  • projects/{project}/secrets/{secret}/versions/{secret_version}
  • projects/{project}/secrets/{secret}

Wenn Sie das zweite Format nutzen, verwendet Dataflow die neueste Version, da es keine Version festlegt.

Wenn die Registry ein selbst signiertes Zertifikat verwendet, müssen Sie auch den Pfad zum selbst signierten Zertifikat in Cloud Storage angeben.

In der folgenden Tabelle werden die Optionen der gcloud-Befehlszeile erläutert, mit denen Sie eine private Registry konfigurieren können.

Parameter Beschreibung
image Die Adresse der Registry. Beispiel: gcp.repository.example.com:9082/registry/example/image:latest.
image-repository-username-secret-id Die geheime Secret Manager-ID für den Nutzernamen zur Authentifizierung bei der privaten Registry. Beispiel: projects/example-project/secrets/username-secret.
image-repository-password-secret-id Die geheime ID des Secret Managers für das Passwort zur Authentifizierung bei der privaten Registry. Beispiel: projects/example-project/secrets/password-secret/versions/latest.
image-repository-cert-path Die vollständige Cloud Storage-URL für ein selbst signiertes Zertifikat für die private Registry. Dies ist nur erforderlich, wenn die Registry ein selbst signiertes Zertifikat verwendet. Beispiel: gs://example-bucket/self-signed.crt.

Hier sehen Sie ein Beispiel für einen Google Cloud CLI-Befehl, der eine Flex-Vorlage mit einem Image in einer privaten Registry mit einem selbst signierten Zertifikat erstellt.

gcloud dataflow flex-template build gs://example-bucket/custom-pipeline-private-repo.json
--sdk-language=JAVA
--image="gcp.repository.example.com:9082/registry/example/image:latest"
--image-repository-username-secret-id="projects/example-project/secrets/username-secret"
--image-repository-password-secret-id="projects/example-project/secrets/password-secret/versions/latest"
--image-repository-cert-path="gs://example-bucket/self-signed.crt"
--metadata-file=metadata.json

Zum Erstellen einer eigenen Flex-Vorlage müssen Sie die Beispielwerte ersetzen und möglicherweise andere oder zusätzliche Optionen angeben.

Nächste Schritte