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?
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