如何使气流跳过时间表?

时间:2019-09-02 12:44:50

标签: airflow airflow-scheduler

我有一个Airflow DAG,计划将它每天@上午10点运行。我想控制DAG触发器,以便如果未在上午10:00到10:30之间安排它,则不会安排它。

LatestOnlyOperator无法帮助,因为执行持续时间是一天。一旦启用调度功能,就会触发DAG

关闭而不是创建30分钟的窗口,“我的流程”需要依赖于外部DAG,这需要手动触发。

让计划的dag-DAG1,手动触发dag-DAG2

例如当天触发DAG2。 DAG1应该检查执行日期(今天)的最后一个DAG2实例状态。

如果成功跳过任务的其余部分

如果未执行或失败,请运行其余任务

我创建了一个分支运算符来执行以下操作。但我无法从 DAG2 获取 task1 的最后一个实例。无法正确确定任务1 的执行日期。


branching = BranchPythonOperator(
    task_id='branching',
    python_callable=branchTo,
    dag=dag)


def branchTo(**kwargs):
    date = kwargs['execution_date'] - timedelta(hours=-1)
    dag_folder = conf.get('core', 'DAGS_FOLDER')
    dagbag = DagBag(dag_folder)
    check_dag = dagbag.dags['DAG2']
    my_task = check_dag.get_task('task1')
    ti = TaskInstance(my_task, date)
    state = ti.current_state()
    if state != 'success':
        return 'procees_with_remaining_tasks'
    else:
        return 'mark_success'

由于很难获得手动触发的任务实例。我正在查询一个时间范围,以获取给定'dag_id'的所有DAG信息

并将输出用于条件跳转

@provide_session
def get_task_instances(dag_id, task_id, start_date=None, end_date=None, session=None): 
    TI = TaskInstance
    end_date = end_date or datetime.utcnow()
    list = session.query(TI).filter(
        TI.dag_id == dag_id,
        TI.task_id == task_id,
        TI.execution_date >= start_date,
        TI.execution_date <= end_date,
    ).order_by(TI.execution_date.desc()).all()
    return list

1 个答案:

答案 0 :(得分:1)

您可以在工作流开始时使用 BranchDateTimeOperator 来验证当前时间是什么,并根据它决定是继续执行工作流还是分支到结束任务。

from airflow.operators.datetime import BranchDateTimeOperator
cond = BranchDateTimeOperator(
    task_id='datetime_branch',
    follow_task_ids_if_true=['continue_task'],
    follow_task_ids_if_false=['end_task'],
    target_upper=datetime.time(10, 30, 0),
    target_lower=datetime.time(10, 0, 0),
    dag=dag,
)