外部触发具有schedule_interval = None的dag

时间:2019-07-23 08:56:45

标签: python-3.x airflow airflow-scheduler

我有一个名为 dss_controller

的控制器dag
dag = DAG(
dag_id='dss_controller',
default_args={
    "owner": "dss admin",
    "start_date": datetime.utcnow(),
},
schedule_interval=None,
)

和名为 dss_trigger_target_dag

的目标dag
dag = DAG(
dag_id='dss_trigger_target_dag',
default_args=args,
schedule_interval=None,
)

在控制器和目标dag中都定义了任务,如默认可用示例中一样。

dss_controller schedule_interval 设置为“ @once ”时,此系统可以正常工作。

然后将其设置为并从外部触发。它将触发控制器dag,并将其移动到运行状态,然后将其移动到成功状态。

但是它不会触发控制器dag的 dss_trigger_dagrun 任务。 这种行为的原因是什么?

设置 schedule_interval =没有原因,如果是这样的话?

这是我的控制器,

import pprint
import pprint
from datetime import datetime

from airflow import DAG
from airflow.operators.dagrun_operator import TriggerDagRunOperator

pp = pprint.PrettyPrinter(indent=4)


def conditionally_trigger(context, dag_run_obj):
   """This function decides whether or not to Trigger the remote DAG"""
   c_p = context['params']['condition_param']
   print("Controller DAG : conditionally_trigger = {}".format(c_p))
   if context['params']['condition_param']:
      dag_run_obj.payload = {'message': context['params']['message']}
      pp.pprint(dag_run_obj.payload)
      return dag_run_obj

   # Define the DAG
   dag = DAG(
      dag_id='dss_controller',
    default_args={
        "owner": "dss admin",
        "start_date": datetime.utcnow(),
    },
    schedule_interval=None,
)

# Define the single task in this controller example DAG
trigger = TriggerDagRunOperator(
    task_id='dss_trigger_dagrun',
    trigger_dag_id="dss_trigger_target_dag",
    python_callable=conditionally_trigger,
    params={'condition_param': True, 'message': 'Hello Hasitha'},
    dag=dag,
)

这是我的目标,

import pprint
from datetime import datetime

from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator

pp = pprint.PrettyPrinter(indent=4)

args = {
    'start_date': datetime.utcnow(),
    'owner': 'dss admin',
}

dag = DAG(
    dag_id='dss_trigger_target_dag',
    default_args=args,
    schedule_interval=None,
)


def run_this_func(ds, **kwargs):
    print("Remotely received value of {} for key=message".
          format(kwargs['dag_run'].conf['message']))


run_this = PythonOperator(
    task_id='target_run_this',
    provide_context=True,
    python_callable=run_this_func,
    dag=dag,
)

1 个答案:

答案 0 :(得分:0)

您已经在默认参数中将now。(start_date)作为now()添加到了每个任务。看来,这才是真正的罪魁祸首。 Airflow建议不要这样做,因为它可以防止触发任务。 尝试将开始日期设置为过去的日期,例如airflow.utils.dates.days_ago(1)。


引用:https://airflow.apache.org/faq.html#what-s-the-deal-with-start-date