Airflow-DAGs schreiben

Managed Airflow (Gen 3) | Managed Airflow (Gen 2) | Managed Airflow (Legacy Gen 1)

In dieser Anleitung erfahren Sie, wie Sie einen gerichteten azyklischen Graphen (Directed Acyclic Graph, DAG) in Apache Airflow für die Ausführung in einer Managed Service for Apache Airflow-Umgebung schreiben.

Da Apache Airflow keine strikte DAG- und Aufgabenisolation bietet, empfehlen wir, separate Produktions- und Testumgebungen einzurichten, um DAG-Interferenzen zu vermeiden. Weitere Informationen finden Sie unter DAGs testen.

Airflow-DAG strukturieren

Ein Airflow-DAG wird in einer Python-Datei definiert und besteht aus den folgenden Komponenten:

  • DAG-Definition
  • Airflow-Operatoren
  • Operatorbeziehungen

Die folgenden Code-Snippets zeigen Beispiele für die einzelnen Komponenten ohne Kontext.

Eine DAG-Definition

Das folgende Beispiel zeigt eine Airflow-DAG-Definition:

Airflow 2

import datetime

from airflow import models

default_dag_args = {
    # The start_date describes when a DAG is valid / can be run. Set this to a
    # fixed point in time rather than dynamically, since it is evaluated every
    # time a DAG is parsed. See:
    # https://airflow.apache.org/faq.html#what-s-the-deal-with-start-date
    "start_date": datetime.datetime(2018, 1, 1),
}

# Define a DAG (directed acyclic graph) of tasks.
# Any task you create within the context manager is automatically added to the
# DAG object.
with models.DAG(
    "composer_sample_simple_greeting",
    schedule_interval=datetime.timedelta(days=1),
    default_args=default_dag_args,
) as dag:

Airflow 1

import datetime

from airflow import models

default_dag_args = {
    # The start_date describes when a DAG is valid / can be run. Set this to a
    # fixed point in time rather than dynamically, since it is evaluated every
    # time a DAG is parsed. See:
    # https://airflow.apache.org/faq.html#what-s-the-deal-with-start-date
    "start_date": datetime.datetime(2018, 1, 1),
}

# Define a DAG (directed acyclic graph) of tasks.
# Any task you create within the context manager is automatically added to the
# DAG object.
with models.DAG(
    "composer_sample_simple_greeting",
    schedule_interval=datetime.timedelta(days=1),
    default_args=default_dag_args,
) as dag:

Operatoren und Aufgaben

Airflow-Operatoren beschreiben die auszuführende Arbeit. Eine Aufgabe ist eine bestimmte Instanz eines Operators.

Airflow 2

from airflow.operators.bash import BashOperator
from airflow.operators.python import PythonOperator

    def greeting():
        import logging

        logging.info("Hello World!")

    # An instance of an operator is called a task. In this case, the
    # hello_python task calls the "greeting" Python function.
    hello_python = PythonOperator(task_id="hello", python_callable=greeting)

    # Likewise, the goodbye_bash task calls a Bash script.
    goodbye_bash = BashOperator(task_id="bye", bash_command="echo Goodbye.")

Airflow 1

from airflow.operators import bash_operator
from airflow.operators import python_operator

    def greeting():
        import logging

        logging.info("Hello World!")

    # An instance of an operator is called a task. In this case, the
    # hello_python task calls the "greeting" Python function.
    hello_python = python_operator.PythonOperator(
        task_id="hello", python_callable=greeting
    )

    # Likewise, the goodbye_bash task calls a Bash script.
    goodbye_bash = bash_operator.BashOperator(
        task_id="bye", bash_command="echo Goodbye."
    )

Aufgabenbeziehungen

Aufgabenbeziehungen beschreiben die Reihenfolge, in der die Arbeit erledigt werden muss.

Airflow 2

# Define the order in which the tasks complete by using the >> and <<
# operators. In this example, hello_python executes before goodbye_bash.
hello_python >> goodbye_bash

Airflow 1

# Define the order in which the tasks complete by using the >> and <<
# operators. In this example, hello_python executes before goodbye_bash.
hello_python >> goodbye_bash

Vollständiges Beispiel für einen DAG-Workflow in Python

Der folgende Workflow ist eine vollständige Arbeits-DAG-Vorlage, die aus zwei Aufgaben besteht: hello_python und goodbye_bash:

Airflow 2


import datetime

from airflow import models

from airflow.operators.bash import BashOperator
from airflow.operators.python import PythonOperator



default_dag_args = {
    # The start_date describes when a DAG is valid / can be run. Set this to a
    # fixed point in time rather than dynamically, since it is evaluated every
    # time a DAG is parsed. See:
    # https://airflow.apache.org/faq.html#what-s-the-deal-with-start-date
    "start_date": datetime.datetime(2018, 1, 1),
}

# Define a DAG (directed acyclic graph) of tasks.
# Any task you create within the context manager is automatically added to the
# DAG object.
with models.DAG(
    "composer_sample_simple_greeting",
    schedule_interval=datetime.timedelta(days=1),
    default_args=default_dag_args,
) as dag:
    def greeting():
        import logging

        logging.info("Hello World!")

    # An instance of an operator is called a task. In this case, the
    # hello_python task calls the "greeting" Python function.
    hello_python = PythonOperator(task_id="hello", python_callable=greeting)

    # Likewise, the goodbye_bash task calls a Bash script.
    goodbye_bash = BashOperator(task_id="bye", bash_command="echo Goodbye.")

    # Define the order in which the tasks complete by using the >> and <<
    # operators. In this example, hello_python executes before goodbye_bash.
    hello_python >> goodbye_bash

Airflow 1


import datetime

from airflow import models

from airflow.operators import bash_operator
from airflow.operators import python_operator



default_dag_args = {
    # The start_date describes when a DAG is valid / can be run. Set this to a
    # fixed point in time rather than dynamically, since it is evaluated every
    # time a DAG is parsed. See:
    # https://airflow.apache.org/faq.html#what-s-the-deal-with-start-date
    "start_date": datetime.datetime(2018, 1, 1),
}

# Define a DAG (directed acyclic graph) of tasks.
# Any task you create within the context manager is automatically added to the
# DAG object.
with models.DAG(
    "composer_sample_simple_greeting",
    schedule_interval=datetime.timedelta(days=1),
    default_args=default_dag_args,
) as dag:
    def greeting():
        import logging

        logging.info("Hello World!")

    # An instance of an operator is called a task. In this case, the
    # hello_python task calls the "greeting" Python function.
    hello_python = python_operator.PythonOperator(
        task_id="hello", python_callable=greeting
    )

    # Likewise, the goodbye_bash task calls a Bash script.
    goodbye_bash = bash_operator.BashOperator(
        task_id="bye", bash_command="echo Goodbye."
    )

    # Define the order in which the tasks complete by using the >> and <<
    # operators. In this example, hello_python executes before goodbye_bash.
    hello_python >> goodbye_bash

Weitere Informationen zum Definieren von Airflow-DAGs finden Sie in der Airflow-Anleitung und in den Airflow-Konzepten.

Airflow-Operatoren

Die folgenden Beispiele enthalten einige beliebte Airflow-Operatoren. Eine verbindliche Referenz zu den Airflow-Operatoren finden Sie in der Referenz zu Operatoren und Hooks und im Anbieterindex.

BashOperator

Mit dem BashOperator können Sie Befehlszeilenprogramme ausführen.

Airflow 2

from airflow.operators import bash

    # Create BigQuery output dataset.
    make_bq_dataset = bash.BashOperator(
        task_id="make_bq_dataset",
        # Executing 'bq' command requires Google Cloud SDK which comes
        # preinstalled in Cloud Composer.
        bash_command=f"bq ls {bq_dataset_name} || bq mk {bq_dataset_name}",
    )

Airflow 1

from airflow.operators import bash_operator

    # Create BigQuery output dataset.
    make_bq_dataset = bash_operator.BashOperator(
        task_id="make_bq_dataset",
        # Executing 'bq' command requires Google Cloud SDK which comes
        # preinstalled in Cloud Composer.
        bash_command=f"bq ls {bq_dataset_name} || bq mk {bq_dataset_name}",
    )

Managed Airflow führt die bereitgestellten Befehle in einem Bash-Skript auf einem Airflow-Worker aus. Der Worker ist ein Docker-Container auf Basis von Debian und enthält mehrere Pakete.

PythonOperator

Verwenden Sie den PythonOperator, um beliebigen Python-Code auszuführen.

Managed Airflow führt den Python-Code in einem Container aus, der Pakete für die in Ihrer Umgebung verwendete Managed Airflow-Image-Version enthält.

Informationen zum Installieren weiterer Python-Pakete finden Sie unter Python-Abhängigkeiten installieren.

Google Cloud Operatoren

Verwenden Sie dieGoogle Cloud Airflow-Operatoren, um Aufgaben auszuführen, die Google Cloud -Produkte nutzen. BigQuery-Operatoren fragen Daten in BigQuery ab und verarbeiten sie.

Es gibt noch viele weitere Airflow-Operatoren für Google Cloud und einzelne Dienste von Google Cloud. Eine vollständige Liste finden Sie unter Google Cloud Operatoren.

Airflow 2

from airflow.providers.google.cloud.operators import bigquery
from airflow.providers.google.cloud.transfers import bigquery_to_gcs

    bq_recent_questions_query = bigquery.BigQueryInsertJobOperator(
        task_id="bq_recent_questions_query",
        configuration={
            "query": {
                "query": RECENT_QUESTIONS_QUERY,
                "useLegacySql": False,
                "destinationTable": {
                    "projectId": project_id,
                    "datasetId": bq_dataset_name,
                    "tableId": bq_recent_questions_table_id,
                },
            }
        },
        location=location,
    )

Airflow 1

from airflow.contrib.operators import bigquery_operator

    # Query recent StackOverflow questions.
    bq_recent_questions_query = bigquery_operator.BigQueryOperator(
        task_id="bq_recent_questions_query",
        sql="""
        SELECT owner_display_name, title, view_count
        FROM `bigquery-public-data.stackoverflow.posts_questions`
        WHERE creation_date < CAST('{max_date}' AS TIMESTAMP)
            AND creation_date >= CAST('{min_date}' AS TIMESTAMP)
        ORDER BY view_count DESC
        LIMIT 100
        """.format(
            max_date=max_query_date, min_date=min_query_date
        ),
        use_legacy_sql=False,
        destination_dataset_table=bq_recent_questions_table_id,
    )

EmailOperator

Verwenden Sie den EmailOperator, um E-Mails von einem DAG zu senden. Wenn Sie E-Mails aus einer Managed Airflow-Umgebung senden möchten, müssen Sie die Verwendung von SendGrid in der Umgebung konfigurieren.

Airflow 2

from airflow.operators import email

    # Send email confirmation (you will need to set up the email operator
    # See https://cloud.google.com/composer/docs/how-to/managing/creating#notification
    # for more info on configuring the email operator in Cloud Composer)
    email_summary = email.EmailOperator(
        task_id="email_summary",
        to="{{var.value.email}}",
        subject="Sample BigQuery notify data ready",
        html_content="""
        Analyzed Stack Overflow posts data from {min_date} 12AM to {max_date}
        12AM. The most popular question was '{question_title}' with
        {view_count} views. Top 100 questions asked are now available at:
        {export_location}.
        """.format(
            min_date=min_query_date,
            max_date=max_query_date,
            question_title=(
                "{{ ti.xcom_pull(task_ids='bq_read_most_popular', "
                "key='return_value')[0][0] }}"
            ),
            view_count=(
                "{{ ti.xcom_pull(task_ids='bq_read_most_popular', "
                "key='return_value')[0][1] }}"
            ),
            export_location=output_file,
        ),
    )

Airflow 1

from airflow.operators import email_operator

    # Send email confirmation
    email_summary = email_operator.EmailOperator(
        task_id="email_summary",
        to="{{var.value.email}}",
        subject="Sample BigQuery notify data ready",
        html_content="""
        Analyzed Stack Overflow posts data from {min_date} 12AM to {max_date}
        12AM. The most popular question was '{question_title}' with
        {view_count} views. Top 100 questions asked are now available at:
        {export_location}.
        """.format(
            min_date=min_query_date,
            max_date=max_query_date,
            question_title=(
                "{{ ti.xcom_pull(task_ids='bq_read_most_popular', "
                "key='return_value')[0][0] }}"
            ),
            view_count=(
                "{{ ti.xcom_pull(task_ids='bq_read_most_popular', "
                "key='return_value')[0][1] }}"
            ),
            export_location=output_file,
        ),
    )

Benachrichtigungen bei Fehlern des Mobilfunkanbieters

Zum Senden einer E-Mail-Benachrichtigung, wenn ein Operator im DAG fehlerhaft ist, legen Sie für email_on_failure den Wert True fest. Zum Senden von E-Mail-Benachrichtigungen aus einer Managed Airflow-Umgebung müssen Sie Ihre Umgebung für die Verwendung von SendGrid konfigurieren.

Airflow 2

from airflow import models

default_dag_args = {
    "start_date": yesterday,
    # Email whenever an Operator in the DAG fails.
    "email": "{{var.value.email}}",
    "email_on_failure": True,
    "email_on_retry": False,
    "retries": 1,
    "retry_delay": datetime.timedelta(minutes=5),
    "project_id": project_id,
}

with models.DAG(
    "composer_sample_bq_notify",
    schedule_interval=datetime.timedelta(weeks=4),
    default_args=default_dag_args,
) as dag:

Airflow 1

from airflow import models

default_dag_args = {
    "start_date": yesterday,
    # Email whenever an Operator in the DAG fails.
    "email": "{{var.value.email}}",
    "email_on_failure": True,
    "email_on_retry": False,
    "retries": 1,
    "retry_delay": datetime.timedelta(minutes=5),
    "project_id": "{{var.value.gcp_project}}",
}

with models.DAG(
    "composer_sample_bq_notify",
    schedule_interval=datetime.timedelta(weeks=4),
    default_args=default_dag_args,
) as dag:

Richtlinien für DAG-Workflows

  • Platzieren Sie benutzerdefinierte Python-Bibliotheken im ZIP-Archiv eines DAG in einem verschachtelten Verzeichnis. Platzieren Sie Bibliotheken nicht auf der obersten Ebene des DAG-Verzeichnisses.

    Wenn Airflow den Ordner dags/ durchsucht, prüft Airflow nur nach DAGs in Python-Modulen, die sich auf der obersten Ebene des Ordners „DAGs“ und auf der obersten Ebene eines ZIP-Archivs befinden, das sich ebenfalls im Ordner dags/ auf oberster Ebene befindet. Wenn Airflow in einem ZIP-Archiv ein Python-Modul ermittelt, das weder airflow- noch DAG-Teilstrings enthält, beendet Airflow die Verarbeitung des ZIP-Archivs. Airflow gibt nur die DAGs zurück, die bis zu diesem Zeitpunkt gefunden wurden.

  • Verwenden Sie Airflow 2 anstelle von Airflow 1.

    Die Airflow-Community veröffentlicht keine neuen Neben- oder Patchreleases für Airflow 1 mehr.

  • Achten Sie aus Gründen der Fehlertoleranz darauf, nicht mehrere DAG-Objekte im gleichen Python-Modul zu definieren.

  • Verwenden Sie keine SubDAGs. Stattdessen sollten Sie Aufgaben in DAGs gruppieren.

  • Platzieren Sie Dateien, die zum Zeitpunkt des DAG-Parsens erforderlich sind, im Ordner dags/ und nicht im Ordner data/.

  • Einheitentests für Ihre DAGs implementieren

  • Testen Sie entwickelte oder geänderte DAGs wie in der Anleitung zum Testen von DAGs empfohlen.

  • Prüfen Sie, ob die entwickelten DAGs die DAG-Parsing-Zeiten zu stark erhöhen.

  • Airflow-Aufgaben können aus verschiedenen Gründen fehlschlagen. Damit nicht der gesamte DAG-Lauf fehlschlägt, empfehlen wir, Wiederholungsversuche für Aufgaben zu aktivieren. Wenn Sie die maximale Anzahl von Wiederholungsversuchen auf 0 festlegen, werden keine Wiederholungsversuche ausgeführt.

    Wir empfehlen, die Option default_task_retries mit einem anderen Wert als 0 für die Wiederholungsversuche der Aufgabe zu überschreiben. Außerdem können Sie den Parameter retries auf Aufgabenebene festlegen.

  • Wenn Sie GPUs in Ihren Airflow-Aufgaben verwenden möchten, erstellen Sie einen separaten GKE-Cluster, der auf Knoten basiert, die Maschinen mit GPUs verwenden. Verwenden Sie den GKEStartPodOperator, um Ihre Aufgaben auszuführen.

  • Vermeiden Sie die Ausführung von CPU- und arbeitsspeicherintensiven Aufgaben im Knotenpool des Clusters, in dem andere Airflow-Komponenten (Planer, Worker, Webserver) ausgeführt werden. Verwenden Sie stattdessen KubernetesPodOperator oder GKEStartPodOperator.

  • Wenn Sie DAGs in einer Umgebung bereitstellen, laden Sie nur die Dateien, die zum Interpretieren und Ausführen von DAGs unbedingt erforderlich sind, in den Ordner /dags hoch.

  • Beschränken Sie die Anzahl der DAG-Dateien im Ordner /dags.

    Airflow parst kontinuierlich DAGs im Ordner /dags. Beim Parsing wird der DAG-Ordner durchlaufen. Die Anzahl der Dateien, die geladen werden müssen (mit ihren Abhängigkeiten), wirkt sich auf die Leistung des DAG-Parsings und der Aufgabenplanung aus. Es ist viel effizienter, 100 Dateien mit jeweils 100 DAGs zu verwenden, als 10.000 Dateien mit jeweils einem DAG. Eine solche Optimierung wird daher empfohlen. Diese Optimierung ist ein Kompromiss zwischen Parsing-Zeit und Effizienz der DAG-Erstellung und ‑Verwaltung.

    Wenn Sie beispielsweise 10.000 DAG-Dateien bereitstellen möchten, können Sie 100 ZIP-Dateien erstellen, die jeweils 100 DAG-Dateien enthalten.

    Wenn Sie mehr als 10.000 DAG-Dateien haben, kann es sinnvoll sein, DAGs programmatisch zu generieren. Sie können beispielsweise eine einzelne Python-DAG-Datei implementieren, die eine bestimmte Anzahl von DAG-Objekten generiert (z. B. 20 oder 100).

  • Verwenden Sie keine veralteten Airflow-Operatoren. Verwenden Sie stattdessen die aktuellen Alternativen.

  • Vermeiden Sie die Verwendung von CloudLoggingHandler für die Verarbeitung von Logging. Dieser Logging-Handler führt zu einer Überlastung der Datenbank der Umgebung und zu nachfolgenden DAG-Fehlern mit den Fehlern „server closed the connection unexpectedly“ (Server hat die Verbindung unerwartet geschlossen).

FAQs zum Schreiben von DAGs

Wie minimiere ich Codewiederholungen, wenn ich die gleichen oder ähnliche Aufgaben in mehreren DAGs ausführen möchte?

Wir empfehlen das Definieren von Bibliotheken und Wrappern, um Codewiederholungen zu minimieren.

Wie kann ich Code in mehreren DAG-Dateien wiederverwenden?

Binden Sie Hilfsfunktionen in eine lokale Python-Bibliothek ein und importieren Sie die Funktionen. Sie können in allen DAGs, die sich im dags/-Ordner Ihres Buckets befinden, auf die Funktionen verweisen.

Wie minimiere ich das Risiko unterschiedlicher Definitionen?

Angenommen, es gibt zwei Teams, die Rohdaten zu Umsatzkennzahlen zusammenfassen möchten. Die Teams schreiben zwei geringfügig unterschiedliche Aufgaben für den gleichen Sachverhalt. Definieren Sie Bibliotheken für die Arbeit mit den Umsatzdaten, sodass diejenigen, die DAGs implementieren, die Definition des zusammengefassten Umsatzes eindeutig festlegen müssen.

Wie lege ich Abhängigkeiten zwischen DAGs fest?

Das hängt davon ab, wie Sie die Abhängigkeit definieren möchten.

Wenn Sie zwei DAGs haben (DAG A und DAG B) und DAG B nach DAG A ausgelöst werden soll, können Sie einen TriggerDagRunOperator am Ende von DAG A platzieren.

Wenn DAG B nur von einem von DAG A generierten Artefakt abhängt (z. B. eine Pub/Sub-Meldung), ist ein Sensor möglicherweise besser geeignet.

Wenn DAG B eng mit DAG A integriert ist, können Sie die beiden DAGs möglicherweise in einen DAG zusammenführen.

Wie übergebe ich eindeutige Ausführungs-IDs an einen DAG und die zugehörigen Aufgaben?

Angenommen, es sollen Dataproc-Clusternamen und -Dateipfade übergeben werden.

In diesem Fall können Sie eine zufällige eindeutige ID generieren und dafür str(uuid.uuid4()) in einem PythonOperator zurückgeben. Dadurch wird die ID in XComs abgelegt, sodass Sie in anderen Operatoren über Vorlagenfelder darauf verweisen können.

Prüfen Sie vor dem Generieren einer uuid, ob eine DagRun-spezifische ID sinnvoller wäre. Sie können auf diese IDs in Jinja-Substitutionen auch mit Makros verweisen.

Wie trenne ich Aufgaben in einem DAG?

Eine Aufgabe sollte eine idempotente Arbeitseinheit sein. Vermeiden Sie es deshalb, einen aus mehreren Schritten bestehenden Workflow in eine einzelne Aufgabe aufzunehmen, z. B. in ein komplexes Programm, das in einem PythonOperator ausgeführt wird.

Soll ich mehrere Aufgaben in einem einzelnen DAG definieren, um Daten aus mehreren Quellen zusammenzufassen?

Angenommen, ich habe mehrere Tabellen mit Rohdaten und möchte tägliche Zusammenfassungen für jede einzelne Tabelle erstellen. Die Aufgaben sind nicht voneinander abhängig. Soll ich eine Aufgabe und einen DAG für jede Tabelle oder einen allgemeinen DAG erstellen?

Wenn es für Sie kein Problem ist, dass jede Aufgabe die gleichen Attribute auf DAG-Ebene verwendet (z. B. schedule), ist es sinnvoll, mehrere Aufgaben in einem einzigen DAG zu definieren. Andernfalls können zur Minimierung der Codewiederholung mehrere DAGs aus einem einzigen Python-Modul generiert werden. Dazu platzieren Sie diese in den globalen globals() des Moduls.

Wie beschränke ich die Anzahl gleichzeitiger Aufgaben, die in einem DAG ausgeführt werden?

Ich möchte z. B. vermeiden, dass API-Nutzungslimits und -kontingente überschritten oder zu viele Prozesse gleichzeitig ausgeführt werden.

Sie können dazu Airflow-Pools in der Airflow-Weboberfläche definieren und in Ihren DAGs Aufgaben mit vorhandenen Pools verknüpfen.

FAQs zur Verwendung von Operatoren

Soll ich den DockerOperator verwenden?

Wir raten von der Verwendung des DockerOperator ab, es sei denn, er wird zum Starten von Containern in einer Remote-Docker-Installation verwendet (nicht im Cluster einer Umgebung). In einer Managed Airflow-Umgebung hat der Operator keinen Zugriff auf Docker-Daemons.

Verwenden Sie stattdessen KubernetesPodOperator oder GKEStartPodOperator. Diese Operatoren starten Kubernetes-Pods in Kubernetes- bzw. GKE-Clustern. Es ist nicht empfehlenswert, Pods im Cluster einer Umgebung zu starten, da dies zu Konkurrenz um Ressourcen führen kann.

Soll ich den SubDagOperator verwenden?

Die Verwendung von SubDagOperator wird nicht empfohlen.

Verwenden Sie Alternativen, wie unter Aufgaben gruppieren beschrieben.

Soll ich Python-Code nur in PythonOperators ausführen, um Python-Operatoren vollständig zu trennen?

Abhängig von Ihrem Ziel haben Sie mehrere Optionen.

Falls Ihr einziges Ziel ist, separate Python-Abhängigkeiten beizubehalten, können Sie PythonVirtualenvOperator verwenden.

Erwägen Sie, den KubernetesPodOperator zu verwenden. Mit diesem Operator können Sie Kubernetes-Pods definieren und die Pods in anderen Clustern ausführen.

Wie füge ich benutzerdefinierte binäre oder Nicht-PyPI-Pakete hinzu?

Sie können dazu Pakete installieren, die in privaten Paket-Repositories gehostet werden,

Wie übergebe ich Argumente einheitlich an einen DAG und die zugehörigen Aufgaben?

Sie können die integrierte Airflow-Unterstützung für Jinja-Vorlagen nutzen, um Argumente zu übergeben, die in Vorlagenfeldern verwendet werden können.

Wann findet die Vorlagenersetzung statt?

Die Vorlagen werden auf den Airflow-Workern unmittelbar vor dem Aufruf der pre_execute-Funktion eines Operators ersetzt. In der Praxis bedeutet dies, dass Vorlagen erst unmittelbar vor der Ausführung einer Aufgabe ersetzt werden.

Wie kann ich erkennen, welche Operatorargumente die Vorlagenersetzung unterstützen?

Operatorargumente, die die Jinja2-Vorlagenersetzung unterstützen, sind explizit entsprechend gekennzeichnet.

Suchen Sie in der Operatordefinition nach dem Feld template_fields. Es enthält eine Liste der Argumentnamen, für die die Vorlagenersetzung verwendet wird.

Dazu gehört beispielsweise der BashOperator, mit dem Vorlagen für die Argumente bash_command und env unterstützt werden.

Eingestellte und entfernte Airflow-Operatoren

Die in der folgenden Tabelle aufgeführten Airflow-Operatoren sind veraltet:

  • Vermeiden Sie die Verwendung dieser Operatoren in Ihren DAGs. Verwenden Sie stattdessen die bereitgestellten aktuellen Ersatzoperatoren.

  • Im neuesten Wartungsrelease von Managed Airflow (Legacy Gen 1) (1.20.12) wird eine Version des apache-airflow-providers-google-Pakets verwendet, die auf der öffentlichen Version 8.9.0 basiert. In der folgenden Tabelle sehen Sie, ob ein bestimmter Operator unterstützt wird oder ob ein Ersatz verfügbar ist, basierend auf der aufgeführten Version des Pakets.

  • Einige der Ersatzoperatoren werden in keiner Version von Managed Airflow (Legacy Gen 1) unterstützt. Wenn Sie sie verwenden möchten, sollten Sie ein Upgrade auf Managed Airflow (Gen 3) oder Managed Airflow (Gen 2) in Betracht ziehen.

Veralteter Operator Ersatzoperator

GCSObjectsWtihPrefixExistenceSensor

GCSObjectsWithPrefixExistenceSensor

CreateAutoMLTextTrainingJobOperator

SupervisedFineTuningTrainOperator

GKEDeploymentHook

GKEKubernetesHook

GKECustomResourceHook

GKEKubernetesHook

GKEPodHook

GKEKubernetesHook

GKEJobHook

GKEKubernetesHook

GKEPodAsyncHook

GKEKubernetesAsyncHook

SecretsManagerHook

GoogleCloudSecretManagerHook

BigQueryExecuteQueryOperator

BigQueryInsertJobOperator

BigQueryPatchDatasetOperator

BigQueryUpdateDatasetOperator

DataflowCreateJavaJobOperator

beam.BeamRunJavaPipelineOperator

DataflowCreatePythonJobOperator

beam.BeamRunPythonPipelineOperator

DataprocSubmitPigJobOperator

DataprocSubmitJobOperator

DataprocSubmitHiveJobOperator

DataprocSubmitJobOperator

DataprocSubmitSparkSqlJobOperator

DataprocSubmitJobOperator

DataprocSubmitSparkJobOperator

DataprocSubmitJobOperator

DataprocSubmitHadoopJobOperator

DataprocSubmitJobOperator

DataprocSubmitPySparkJobOperator

DataprocSubmitJobOperator

BigQueryTableExistenceAsyncSensor

BigQueryTableExistenceSensor

BigQueryTableExistencePartitionAsyncSensor

BigQueryTablePartitionExistenceSensor

CloudComposerEnvironmentSensor

CloudComposerCreateEnvironmentOperator, CloudComposerDeleteEnvironmentOperator, CloudComposerUpdateEnvironmentOperator

GCSObjectExistenceAsyncSensor

GCSObjectExistenceSensor

GoogleAnalyticsHook

GoogleAnalyticsAdminHook

GoogleAnalyticsListAccountsOperator

GoogleAnalyticsAdminListAccountsOperator

GoogleAnalyticsGetAdsLinkOperator

GoogleAnalyticsAdminGetGoogleAdsLinkOperator

GoogleAnalyticsRetrieveAdsLinksListOperator

GoogleAnalyticsAdminListGoogleAdsLinksOperator

GoogleAnalyticsDataImportUploadOperator

GoogleAnalyticsAdminCreateDataStreamOperator

GoogleAnalyticsDeletePreviousDataUploadsOperator

GoogleAnalyticsAdminDeleteDataStreamOperator

DataPipelineHook

DataflowHook

CreateDataPipelineOperator

DataflowCreatePipelineOperator

RunDataPipelineOperator

DataflowRunPipelineOperator

AutoMLBatchPredictOperator

vertex_ai.batch_prediction_job

PromptLanguageModelOperator

TextGenerationModelPredictOperator

GenerateTextEmbeddingsOperator

TextEmbeddingModelGetEmbeddingsOperator

PromptMultimodalModelOperator

GenerativeModelGenerateContentOperator

PromptMultimodalModelWithMediaOperator

GenerativeModelGenerateContentOperator

DataflowStartSqlJobOperator

DataflowStartYamlJobOperator

DataprocScaleClusterOperator

DataprocUpdateClusterOperator

MLEngineStartBatchPredictionJobOperator

CreateBatchPredictionJobOperator

MLEngineManageModelOperator

MLEngineCreateModelOperator, MLEngineGetModelOperator

MLEngineGetModelOperator

GetModelOperator

MLEngineDeleteModelOperator

DeleteModelOperator

MLEngineManageVersionOperator

MLEngineCreateVersion, MLEngineSetDefaultVersion, MLEngineListVersions, MLEngineDeleteVersion

MLEngineCreateVersionOperator

Parameter „parent_model“ für VertexAI-Operatoren

MLEngineSetDefaultVersionOperator

SetDefaultVersionOnModelOperator

MLEngineListVersionsOperator

ListModelVersionsOperator

MLEngineDeleteVersionOperator

DeleteModelVersionOperator

MLEngineStartTrainingJobOperator

CreateCustomPythonPackageTrainingJobOperator

MLEngineTrainingCancelJobOperator

CancelCustomTrainingJobOperator

AutoMLDatasetLink

TranslationLegacyDatasetLink

AutoMLDatasetListLink

TranslationDatasetListLink

AutoMLModelLink

TranslationLegacyModelLink

AutoMLModelTrainLink

TranslationLegacyModelTrainLink

AutoMLModelPredictLink

TranslationLegacyModelPredictLink

TextGenerationModelPredictOperator

GenerativeModelGenerateContentOperator

LifeSciencesHook

Hook für Google Cloud Batch-Operatoren

LifeSciencesLink

Kein Ersatz (API eingestellt)

LifeSciencesRunPipelineOperator

Google Cloud Batch-Operatoren

BigQueryCreateEmptyTableOperator

BigQueryCreateTableOperator

BigQueryCreateExternalTableOperator

BigQueryCreateTableOperator

GoogleDisplayVideo360CreateQueryOperator

display_video.GoogleDisplayVideo360CreateSDFDownloadTaskOperator

GoogleDisplayVideo360RunQueryOperator

display_video.GoogleDisplayVideo360CreateSDFDownloadTaskOperator

GoogleDisplayVideo360DeleteReportOperator

SDF-Exportaufgabe in Version 4 der API

GoogleDisplayVideo360DownloadReportV2Operator

display_video.GoogleDisplayVideo360SDFtoGCSOperator

GoogleDisplayVideo360DownloadLineItemsOperator

display_video.GoogleDisplayVideo360CreateSDFDownloadTaskOperator

GoogleDisplayVideo360UploadLineItemsOperator

display_video.GoogleDisplayVideo360SDFtoGCSOperator

GoogleDisplayVideo360RunQuerySensor

SDF-Exportaufgabe in Version 4 der API

AutoMLPredictOperator

TextGenerationModelPredictOperator, TranslateTextOperator

CloudAutoMLHook

vertex_ai.auto_ml.AutoMLHook, translate.TranslateHook

AutoMLCreateDatasetOperator

vertex_ai.dataset.CreateDatasetOperator, translate.TranslateCreateDatasetOperator

AutoMLDeleteDatasetOperator

vertex_ai.dataset.ListDatasetsOperator, translate.TranslateDatasetsListOperator

AutoMLDeleteModelOperator

vertex_ai.model_service.DeleteModelOperator, translate.TranslateDeleteModelOperator

AutoMLDeployModelOperator

vertex_ai.endpoint_service.DeployModelOperator

AutoMLGetModelOperator

vertex_ai.model_service.GetModelOperator

AutoMLImportDataOperator

vertex_ai.dataset.ImportDataOperator, translate.TranslateImportDataOperator

AutoMLListDatasetOperator

vertex_ai.dataset.ListDatasetsOperator, translate.TranslateDatasetsListOperator

AutoMLTablesListColumnSpecsOperator

Kein Ersatz (Legacy-Version von AutoML Tables wurde eingestellt)

AutoMLTablesListTableSpecsOperator

Kein Ersatz (Legacy-Version von AutoML Tables wurde eingestellt)

AutoMLTablesUpdateDatasetOperator

vertex_ai.dataset.UpdateDatasetOperator

AutoMLTrainModelOperator

vertex_ai.auto_ml.CreateAutoMLTabularTrainingJobOperator, CreateAutoMLVideoTrainingJobOperator, CreateAutoMLImageTrainingJobOperator, SupervisedFineTuningTrainOperator, TranslateCreateModelOperator

MLEngineCreateModelOperator

entsprechender Vertex AI-Operator

DataCatalogEntryGroupLink

DataplexCatalogEntryGroupLink

DataCatalogEntryLink

DataplexCatalogEntryLink

DataCatalogTagTemplateLink

DataplexCatalogAspectTypeLink

CloudDataCatalogCreateEntryOperator

DataplexCatalogCreateEntryOperator

CloudDataCatalogCreateEntryGroupOperator

DataplexCatalogCreateEntryGroupOperator

CloudDataCatalogCreateTagOperator

DataplexCatalogCreateEntryOperator, DataplexCatalogUpdateEntryOperator

CloudDataCatalogCreateTagTemplateOperator

DataplexCatalogCreateAspectTypeOperator

CloudDataCatalogCreateTagTemplateFieldOperator

DataplexCatalogUpdateAspectTypeOperator, DataplexCatalogCreateAspectTypeOperator

CloudDataCatalogDeleteEntryGroupOperator

DataplexCatalogDeleteEntryGroupOperator

CloudDataCatalogDeleteTagOperator

DataplexCatalogUpdateEntryOperator

CloudDataCatalogDeleteTagTemplateOperator

DataplexCatalogDeleteAspectTypeOperator

CloudDataCatalogDeleteTagTemplateFieldOperator

DataplexCatalogUpdateAspectTypeOperator

CloudDataCatalogGetEntryOperator

DataplexCatalogGetEntryOperator

CloudDataCatalogGetEntryGroupOperator

DataplexCatalogGetEntryGroupOperator

CloudDataCatalogGetTagTemplateOperator

DataplexCatalogGetAspectTypeOperator

CloudDataCatalogListTagsOperator

DataplexCatalogGetEntryOperator

CloudDataCatalogLookupEntryOperator

DataplexCatalogLookupEntryOperator

CloudDataCatalogRenameTagTemplateFieldOperator

DataplexCatalogUpdateAspectTypeOperator

CloudDataCatalogSearchCatalogOperator

DataplexCatalogSearchEntriesOperator

CloudDataCatalogUpdateEntryOperator

DataplexCatalogUpdateEntryOperator

CloudDataCatalogUpdateTagOperator

DataplexCatalogUpdateEntryOperator

CloudDataCatalogUpdateTagTemplateOperator

DataplexCatalogUpdateAspectTypeOperator

CloudDataCatalogUpdateTagTemplateFieldOperator

DataplexCatalogUpdateAspectTypeOperator

CloudDataCatalogHook

DataplexHook

TextEmbeddingModelGetEmbeddingsOperator

GenAIGenerateEmbeddingsOperator

GenerativeModelGenerateContentOperator

GenAIGenerateContentOperator

SupervisedFineTuningTrainOperator

GenAISupervisedFineTuningTrainOperator

CountTokensOperator

GenAICountTokensOperator

CreateCachedContentOperator

GenAICreateCachedContentOperator

GenerateFromCachedContentOperator

GenAIGenerateContentOperator

DeleteExperimentRunOperator

DeleteExperimentRunOperator

TranslationLegacyModelLink

TranslationModelLink

TranslationDatasetListLink

TranslationDatasetsListLink

TranslationLegacyDatasetLink

TranslationDatasetsListLink

TranslationLegacyModelTrainLink

TranslationModelsListLink

Nächste Schritte