气流外部传感器在刺戳时卡住

时间:2018-10-13 19:40:17

标签: airflow airflow-scheduler

我希望一个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)

leader_dag的日志: enter image description here

依赖dag的日志:

enter image description here

2 个答案:

答案 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_fnExternalTaskSensor