[英]How to make airflow skip a schedule?
我有一个 Airflow DAG,它计划在 @daily 上午 10 点运行。 我想控制我的 DAG 触发器,如果它没有在 10:00 am 到 10:30 am 之间安排,它就不会安排它。
LatestOnlyOperator 无法提供帮助,因为执行持续时间为当天。 我启用调度的那一刻,将触发 DAG
事实证明,My Flow 需要依赖于手动触发的外部 DAG,而不是创建 30 分钟的窗口。
让计划 dag - DAG1,手动触发 dag - DAG2
这样,如果当天触发 DAG2。 DAG1 应检查执行日期(今天)的最后一个 DAG2 实例状态。
如果成功跳过任务的其余部分
如果 NotExecuted 或 Failed ,运行剩余的任务
我创建了一个分支运算符来执行以下操作。 但我无法从DAG2获取task1 的最后一个实例。 无法正确确定task1 的execution_date 。
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
您可以在工作流开始时使用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,
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.