[英]Unexpected Airflow behaviour in dynamic task generation
出於我可以接受的原因,我試圖在每次迭代中動態生成具有不同execution_date_fn
的ExternalTaskSensor
任務。 Callable provided to execution_date_fn
kwarg requires to have dt
as input and provide execution_date
as output, which I am writing down as a lambda function, eg lambda dt: get_execution_date(i)
.
我注意到作為 lambda function 在循環中提供的execution_date_fn
會導致意外行為 - 所有生成的任務都具有相同的execution_date
我注意到這種行為不是ExternalTaskSensor
Sensor 固有的,而是源自其他地方。 在此示例中可以看到此行為:
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime
dag = DAG(
'test_lambda',
schedule_interval=None,
start_date=datetime(2021,1,1),
catchup=False
)
for task_id in ['task1', 'task2']:
task = PythonOperator(
task_id='printer_'+task_id,
python_callable=lambda: print(task_id),
dag=dag
)
這會導致任務printer_task1
任務 1 和printer_task2
任務 2 在日志中打印'task2'
。
我設法通過將傳感器實例移動到 function 中來糾正這種行為:
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime
def create_task(task_id):
task = PythonOperator(
task_id='printer_'+task_id,
python_callable=lambda: print(task_id),
dag=dag
)
return task
dag = DAG(
'test_lambda',
schedule_interval=None,
start_date=datetime(2021,1,1),
catchup=False
)
for task_id in ['task1', 'task2']:
task = create_task(task_id)
在這種情況下,任務printer_task1
任務 1 打印'task1'
, printer_task2
任務 2 在日志中打印'task2'
任務 2”。
我很想知道我為什么要觀察這種行為?
免責聲明:我知道向PythonOperator
提供 arguments 的正常方法是通過op_args
kwarg。 Lambda 函數僅用於提供示例,因為使用execution_date_fn
時, ExternalTaskSensor
Sensor 中的op_args
選項不可用。
編輯:這是一個lambda
問題,而不是特定於氣流的問題。 官方 Python 文檔有一個關於該問題的主題: https://docs.python.org/3/faq/programming-defined---a-loop-with-different-values-defined--a返回相同的結果
這與 Airflow 關系不大,是lambda
問題:
>>> ls = [lambda: i for i in [1,2]]
>>> ls[0]()
2
>>> ls[1]()
2
要知道為什么會這樣,我建議閱讀Stackoverflow 帖子,它可能會比我更好地解釋為什么
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.