我希望一个dag在另一个dag完成之后开始。一种解决方案是使用外部传感器功能,在下面可以找到我的解决方案。我遇到的问题是依赖dag卡在戳上,我检查了answer并确保两个dag都按相同的时间表运行,我的简化代码如下: 任何帮助,将不胜感激。 队长dag:
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2015, 6, 1),
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
schedule = '* * * * *'
dag = DAG('leader_dag', default_args=default_args,catchup=False,
schedule_interval=schedule)
t1 = BashOperator(
task_id='print_date',
bash_command='date',
dag=dag)
依赖的dag:
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
from airflow.operators.sensors import ExternalTaskSensor
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2018, 10, 8),
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
schedule='* * * * *'
dag = DAG('dependent_dag', default_args=default_args, catchup=False,
schedule_interval=schedule)
wait_for_task = ExternalTaskSensor(task_id = 'wait_for_task',
external_dag_id = 'leader_dag', external_task_id='t1', dag=dag)
t1 = BashOperator(
task_id='print_date',
bash_command='date',
dag=dag)
t1.set_upstream(wait_for_task)
依赖dag的日志:
答案 0 :(得分:4)
首先,将task_id
中的leader_dag
命名为print_date
,但是您通过任务dependent_dag
设置了wait_for_task
,该任务正在等待leader_dag
的任务名为t1
。没有名为t1
的任务。在py
文件中分配给它的内容无关紧要,也没有在气流数据库中使用,也没有被传感器横向使用。它应该在任务名称print_date
上等待。
其次,您的日志不与您在其中显示leader_dag的运行顺序一致。
最后,我不建议您使用Airflow每分钟安排任务。当然不是两个从属任务在一起。 考虑在诸如Spark的其他系统中编写流作业,或者为此滚动自己的Celery或Dask环境。
您还可以通过在Leader_dag的末尾添加ExternalTaskSensor
来触发dependent_dag,并通过将TriggerDagRunOperator
设置为{{ 1}}。
我在您的日志中看到的是2018-10-13T19:08:11的领导者日志。充其量这将是执行时间为dated_date 2018-10-13 19:07:00的dagrun,因为从19:07开始的分钟周期在19:08结束,这是可以安排的最早时间。在这种情况下,我发现在计划和执行之间会有大约11秒的延迟。但是,Airflow中可能会有几分钟的调度延迟。
我还从schedule_interval
中看到了一条日志,该日志的运行时间为19:14:04至19:14:34,并且正在寻找相应的19:13:00 dagrun的完成。没有迹象表明您的调度程序有足够的时滞,可以在19:14:34之前启动None
的19:13:00 dagrun。如果您显示它戳了5分钟左右,您最好说服我。当然,永远不会感觉到 leader_dag.t1 ,因为那不是您命名的所示任务。
因此,Airflow具有计划延迟,如果系统中有1000个dag,则可能会超过1分钟,因此使用dependent_dag
的a将会导致一些运行,彼此跟踪IE 19:08、19:09以及某些可能会跳过一分钟(或6)的跑步,例如19:10,然后是19:16,并且由于延迟是随机的,因此您可能会得到不对齐的运行与传感器永远等待着,即使您有正确的任务ID可以等待,也是如此:
leader_dag
答案 1 :(得分:1)
使用ExternalTaskSensor
时,必须为两个DAG指定相同的开始日期。如果这不适用于您的用例,则需要在execution_delta
中使用execution_date_fn
或ExternalTaskSensor
。