簡體   English   中英

動態任務生成中的意外 Airflow 行為

[英]Unexpected Airflow behaviour in dynamic task generation

出於我可以接受的原因,我試圖在每次迭代中動態生成具有不同execution_date_fnExternalTaskSensor任務。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM