簡體   English   中英

氣流:ExternalTask​​Sensor 不觸發任務

[英]Airflow : ExternalTaskSensor doesn't trigger the task

我已經在 SO 上看到了這個這個問題,並進行了相應的更改。 但是,我的依賴 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

我的假設是,如果 master 運行良好,Airflow 應該觸發依賴的 DAG? 我嘗試過使用execution_delta但這似乎不起作用。

此外,兩個 DAG 的schedule_intervalstart_date是相同的,所以不要認為這會造成任何問題。

我錯過了什么嗎?

確保兩個 DAG 同時啟動,並且不要手動啟動任何一個 DAG。

希望您沒有手動觸發 DAG。 如果你想測試它,讓 DAG 按照計划運行,然后監控 DAG 運行。

您可能應該使用正時間增量: https ://airflow.readthedocs.io/en/stable/_modules/airflow/sensors/external_task_sensor.html 因為在減去執行增量時,它最終會尋找一個任務自己跑了2分鍾。

然而,增量並不是真正的范圍,TI 必須具有匹配的 Dag ID、任務 ID、成功結果以及日期時間列表中的執行日期。 當您將execution_delta作為增量提供時,它是一個日期時間列表,其中包含當前執行日期並減去 timedelta。

這可能歸結為您要么刪除 timedelta 以便兩個執行日期匹配並且傳感器將等到另一個任務成功,或者您的開始日期和計划間隔基本上設置為今天並且@once獲得的執行日期不在彼此之間可預測的鎖步。 您可以嘗試設置 say datetime(2019,1,10)0 1 * * *以使它們都在每天凌晨 1 點運行(同樣沒有execution_delta )。

由於夏季/冬季時間更改,我遇到了這個問題:“1 天前”表示“恰好 24 小時前”,因此如果時區之間有夏令時更改,則 DAG 會卡住。

解決此問題的一種方法是手動將其設置為成功。

另一種方法是使用execution_date_fn參數並在這種情況下正確手動計算時差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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