web-dev-qa-db-fra.com

Airflow ExternalTaskSensor est bloqué

J'essaie d'utiliser ExternalTaskSensor et il reste bloqué à pousser une autre tâche DAG, qui a déjà été terminée avec succès.

Ici, un premier DAG "a" termine sa tâche et après cela un deuxième DAG "b" via ExternalTaskSensor est censé être déclenché. Au lieu de cela, il est coincé à piquer pour a.first_task.

Premier DAG:

import datetime
from airflow import DAG
from airflow.operators.python_operator import PythonOperator

dag = DAG(
    dag_id='a',
    default_args={'owner': 'airflow', 'start_date': datetime.datetime.now()},
    schedule_interval=None
)

def do_first_task():
    print('First task is done')

PythonOperator(
    task_id='first_task',
    python_callable=do_first_task,
    dag=dag)

Deuxième DAG:

import datetime
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.operators.sensors import ExternalTaskSensor

dag = DAG(
    dag_id='b',
    default_args={'owner': 'airflow', 'start_date': datetime.datetime.now()},
    schedule_interval=None
)

def do_second_task():
    print('Second task is done')

ExternalTaskSensor(
    task_id='wait_for_the_first_task_to_be_completed',
    external_dag_id='a',
    external_task_id='first_task',
    dag=dag) >> \
PythonOperator(
    task_id='second_task',
    python_callable=do_second_task,
    dag=dag)

Qu'est-ce que j'oublie ici?

11
Aleksei Solovev

ExternalTaskSensor suppose que vous dépendez d'une tâche dans un cycle d'exécution avec la même date d'exécution.

Cela signifie que dans votre cas, les dags a et b doivent s'exécuter selon le même horaire (par exemple, tous les jours à 9h00 ou w/e).

Sinon, vous devez utiliser le execution_delta ou execution_date_fn lorsque vous instanciez un ExternalTaskSensor.

Voici la documentation à l'intérieur de l'opérateur lui-même pour aider à clarifier davantage:

:param execution_delta: time difference with the previous execution to
    look at, the default is the same execution_date as the current task.
    For yesterday, use [positive!] datetime.timedelta(days=1). Either
    execution_delta or execution_date_fn can be passed to
    ExternalTaskSensor, but not both.

:type execution_delta: datetime.timedelta


:param execution_date_fn: function that receives the current execution date
    and returns the desired execution date to query. Either execution_delta
    or execution_date_fn can be passed to ExternalTaskSensor, but not both.

:type execution_date_fn: callable
15
jhnclvr