【发布时间】:2018-06-29 19:24:19
【问题描述】:
是否可以创建除周六和周日外每天都运行的 Airflow DAG?这似乎是不可能的,因为您只有 start_date 和 schedule_interval。
我正在设置一个每天早上处理一批文件的工作流程。这些文件不会出现在周末,尽管只有周一到周五。我可以简单地使用 24 小时的超时设置,这实际上使周六和周日超时,因为该文件在那些日子永远不会出现,但这会将 DAG 在这两天标记为失败,这将是非常愉快的。
【问题讨论】:
是否可以创建除周六和周日外每天都运行的 Airflow DAG?这似乎是不可能的,因为您只有 start_date 和 schedule_interval。
我正在设置一个每天早上处理一批文件的工作流程。这些文件不会出现在周末,尽管只有周一到周五。我可以简单地使用 24 小时的超时设置,这实际上使周六和周日超时,因为该文件在那些日子永远不会出现,但这会将 DAG 在这两天标记为失败,这将是非常愉快的。
【问题讨论】:
'schedule_interval': '0 0 * * 1-5' 在每周一到周五的每一天的 00:00 运行。
【讨论】:
我也有类似的需求,最后把它放在了我的 dags 的开头——它类似于 ShortCircuitOperator。
import logging
from airflow.models import SkipMixin, BaseOperator
from airflow.utils.decorators import apply_defaults
class pull_file_decision_operator(BaseOperator, SkipMixin):
template_fields = ('execution_date',)
@apply_defaults
def __init__(self,
day_of_week,
hour_of_day,
execution_date,
**kwargs):
self.day_of_week = day_of_week
self.hour_of_week = hour_of_day
self.execution_date = execution_date
def execute(self, context):
# https://docs.python.org/3/library/datetime.html#datetime.date.weekday
run_dt = self.execution_date
dow = self.day_of_week
hod = self.hour_of_day
if run_dt.weekday() == dow and run_dt.hour == hod:
return True
else:
downstream_tasks = context['task'].get_flat_relatives(upstream=False)
logging.info('Skipping downstream tasks...')
logging.info("Downstream task_ids %s", downstream_tasks)
if downstream_tasks:
self.skip(context['dag_run'],
context['ti'].execution_date,
downstream_tasks)
【讨论】:
Zack 的答案已经有一个工作日的 cron 计划,可以满足你的要求 (0 0 * * 1-5),但我想在一个站点上添加一个答案,例如常见的 cron 计划、咳咳、crontab 表达式.
我经常将它与 Airflow 一起使用,以提出 DAG 的 schedule_interval。
帮助您以交互方式设计 cron 计划的主要应用位于 crontab.guru。
仅在工作日安排的示例 - https://crontab.guru/every-weekday
更常见的示例(例如,每半小时、每季度等)-https://crontab.guru/examples.html
【讨论】: