繁体   English   中英

Airflow:ExternalTaskSensor 无法按预期工作。 不同的任务计划

[英]Airflow: ExternalTaskSensor doesn't work as expected. Different task schedules

同事,我们需要帮助。 dag有Parent和Child,parent有自己的schedule,假设'30 * * * *',child '1 8-17 * * 1-5',child等待parent执行,比如40分钟,如果parent以错误结束,然后子进程也因错误而崩溃,否则执行子进程 class 的下一个任务。 问题是即使在最简单的情况下这也不起作用,我不明白如何同步它们。 我写了这样的代码:

达格父母

import time

from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.python_operator import PythonOperator
from airflow.sensors.external_task_sensor  import ExternalTaskSensor, ExternalTaskMarker

start_date =  datetime(2021, 3, 1, 20, 36, 0)

class Exept(Exception):
    pass

def wait():
    time.sleep(3)
    with open('etl.txt', 'r') as txt:
        line = txt.readline()
        if line == 'err':
            print(1)
            raise Exept
    return 'etl success'


with DAG(
    dag_id="dag_etl1",
    start_date=start_date,
    schedule_interval='* * * * *',
    tags=['example2'],
) as etl1:
    parent_task = ExternalTaskMarker(
        task_id="parent_task",
        external_dag_id="dag_etl1",
        external_task_id="etl_child",
    )
    wait_timer = PythonOperator(task_id='wait_timer', python_callable=wait)
    
    wait_timer >> parent_task

达格孩子

from datetime import datetime, timedelta


from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.python_operator import PythonOperator
from airflow.sensors.external_task_sensor  import ExternalTaskSensor, ExternalTaskMarker

from etl_parent import etl1, wait_timer, parent_task

start_date =  datetime(2021, 3, 1, 20, 36, 0)

def check():
    return 'I succeeded'

with DAG(
    dag_id='etl_child', 
    start_date=start_date, 
    schedule_interval='* * * * *',
    tags = ['testing_child_dag']
) as etl_child:
    status = ExternalTaskSensor(
        task_id="dag_etl1",
        external_dag_id=etl1.dag_id,
        external_task_id=parent_task.task_id,
        allowed_states=['success'],
        mode='reschedule',
        execution_delta=timedelta(minutes=1),
        timeout=60,
    )

    task1 = PythonOperator(task_id='task1', python_callable=check)
    
    status >> task1

如您所见,如果在文本文件中指定 err 并在任何其他情况下成功,则我正在尝试模拟父任务失败的情况。 但这根本不像我预期的那样工作,在 dag 的第一次启动时一切都很好,它工作正常,如果我更改文本文件中的数据,那么父任务正常工作,例如,我启动父dag 有一个明知的错误,一切都会正常工作,孩子 class 将以错误结束,但如果我更改文本,父母将再次正常工作,但孩子会继续跌倒一段时间,那么它可能是正确的,但不是事实。 如果已知发射成功,情况是一样的,正好相反。 另外,我不明白如何在父 dag 中组织等待任务完成。

请帮助)我最近一直在使用 airflow,我可能遗漏了一些东西。

ExternalTaskSensor 问题的最常见原因是 execution_delta 参数,所以我将从那里开始。

我看到父 dag 和子 dag 的 start_date 和 schedule_interval 完全相同,但您的 execution_delta 是 1 分钟。 在这种情况下,您的子 dag 会查找从 20:35(在您的示例中)开始的父 dag,但它实际上是在 20:36 开始的,所以它失败了。 即使测试尝试将您的父 dag 设置为从 20:35 开始,看看它是否能解决问题。

这是一篇很好的文章,详细介绍了 schedule_interval 陷阱https://medium.com/@fninsiima/sensing-the-completion-of-external-airflow-tasks-827344d03142

关于等待时间,这是您在 ExternalTaskSensor 中的超时参数。 在您的情况下,它会在失败前等待 60 秒。 就个人而言,我会非常谨慎地设置较长的超时时间。 当您的传感器正在等待时,它会占用一个工作人员,因此没有其他任务可以使用它,这可能会导致您的其他任务被锁定而无法执行,尤其是在您有很多传感器的情况下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM