气流:ExternalTask​​Sensor不会触发任务

时间:2019-01-10 11:53:11

标签: python airflow directed-acyclic-graphs airflow-scheduler

我已经看到关于thisthis的问题,并做出了相应的更改。但是,我的依赖DAG仍然卡在戳状态。以下是我的主DAG:

from airflow import DAG
from airflow.operators.jdbc_operator import JdbcOperator
from datetime import datetime
from airflow.operators.bash_operator import BashOperator

today = datetime.today()

default_args = {
    'depends_on_past': False,
    'retries': 0,
    'start_date': datetime(today.year, today.month, today.day),
    'schedule_interval': '@once'
}

dag = DAG('call-procedure-and-bash', default_args=default_args)

call_procedure = JdbcOperator(
    task_id='call_procedure',
    jdbc_conn_id='airflow_db2',
    sql='CALL AIRFLOW.TEST_INSERT (20)',
    dag=dag
)

call_procedure

下面是我的依赖DAG:

from airflow import DAG
from airflow.operators.jdbc_operator import JdbcOperator
from datetime import datetime, timedelta
from airflow.sensors.external_task_sensor import ExternalTaskSensor

today = datetime.today()

default_args = {
    'depends_on_past': False,
    'retries': 0,
    'start_date': datetime(today.year, today.month, today.day),
    'schedule_interval': '@once'
}

dag = DAG('external-dag-upstream', default_args=default_args)

task_sensor = ExternalTaskSensor(
    task_id='link_upstream',
    external_dag_id='call-procedure-and-bash',
    external_task_id='call_procedure',
    execution_delta=timedelta(minutes=-2),
    dag=dag
)

count_rows = JdbcOperator(
    task_id='count_rows',
    jdbc_conn_id='airflow_db2',
    sql='SELECT COUNT(*) FROM AIRFLOW.TEST',
    dag=dag
)

count_rows.set_upstream(task_sensor)

一旦执行主DAG,以下是从属DAG的日志:

[2019-01-10 11:43:52,951] {{external_task_sensor.py:91}} INFO - Poking for call-procedure-and-bash.call_procedure on 2019-01-10T11:45:47.893735+00:00 ... 
[2019-01-10 11:44:52,955] {{external_task_sensor.py:91}} INFO - Poking for call-procedure-and-bash.call_procedure on 2019-01-10T11:45:47.893735+00:00 ... 
[2019-01-10 11:45:52,961] {{external_task_sensor.py:91}} INFO - Poking for call-procedure-and-bash.call_procedure on 2019-01-10T11:45:47.893735+00:00 ... 
[2019-01-10 11:46:52,949] {{external_task_sensor.py:91}} INFO - Poking for call-procedure-and-bash.call_procedure on 2019-01-10T11:45:47.893735+00:00 ... 
[2019-01-10 11:47:52,928] {{external_task_sensor.py:91}} INFO - Poking for call-procedure-and-bash.call_procedure on 2019-01-10T11:45:47.893735+00:00 ... 
[2019-01-10 11:48:52,928] {{external_task_sensor.py:91}} INFO - Poking for call-procedure-and-bash.call_procedure on 2019-01-10T11:45:47.893735+00:00 ... 
[2019-01-10 11:49:52,905] {{external_task_sensor.py:91}} INFO - Poking for call-procedure-and-bash.call_procedure on 2019-01-10T11:45:47.893735+00:00 ... 

以下是主DAG执行的日志:

[2019-01-10 11:45:20,215] {{jdbc_operator.py:56}} INFO - Executing: CALL AIRFLOW.TEST_INSERT (20)
[2019-01-10 11:45:21,477] {{logging_mixin.py:95}} INFO - [2019-01-10 11:45:21,476] {{dbapi_hook.py:166}} INFO - CALL AIRFLOW.TEST_INSERT (20)
[2019-01-10 11:45:24,139] {{logging_mixin.py:95}} INFO - [2019-01-10 11:45:24,137] {{jobs.py:2627}} INFO - Task exited with return code 0

我的假设是,如果主机运行正常,Airflow应该触发从属DAG吗?我尝试过玩execution_delta,但似乎不起作用。

此外,两个DAG的schedule_intervalstart_date相同,因此不要认为这会造成任何麻烦。

我想念什么吗?

4 个答案:

答案 0 :(得分:1)

希望您不会手动触发DAG。如果要进行测试,请让DAG按计划运行,然后监视DAG的运行。

答案 1 :(得分:0)

您可能应该使用正的时间增量:https://airflow.readthedocs.io/en/stable/_modules/airflow/sensors/external_task_sensor.html,因为当减去执行增量时,它将最终寻找在其自身2分钟后运行的任务。

但是,增量并不是真正的范围,TI必须在日期时间列表中具有匹配的Dag ID,任务ID,成功结果以及执行日期。当您将execution_delta用作增量时,它是一个包含当前执行日期并减去时间增量的日期时间的列表。

这可能归因于您要么删除时间增量,以便两个执行日期匹配,并且传感器将等待直到另一个任务成功,或者您的开始日期和计划时间间隔基本上设置为今天和@once正在获得执行日期,彼此之间的锁定步伐并不可预测。您可以尝试设置“ datetime(2019,1,10)”和“ 0 1 * * *”,使它们每天凌晨1点运行(再次没有execution_delta)。

答案 2 :(得分:0)

确保两个DAG同时启动,并且您没有手动启动两个DAG。

答案 3 :(得分:0)

由于夏/冬时间更改,我遇到了这个问题:“前一天”表示“恰好在24小时之前”,因此,如果时区在两者之间有夏令时更改,则DAG卡住了。

一种解决方法是手动将其设置为成功。

在这种情况下,另一种方法是使用execution_date_fn参数并手动正确计算时差。