气流DAG每天运行(周末除外)?

时间:2018-06-29 19:24:19

标签: airflow airflow-scheduler

是否可以创建一个除周六和周日之外每天运行的Airflow DAG?由于您只有开始日期 schedule_interval ,因此似乎不可能。

我正在设置一个工作流程,它将每天早晨处理一批文件。尽管只有星期一到星期五,这些文件不会在周末出现。我可以简单地使用24小时超时设置,这实际上会使星期六和星期日超时,因为该文件在那几天永远不会出现,但这将DAG标记为这两天都失败了,这将非常令人愉快。

3 个答案:

答案 0 :(得分:6)

Zack的答案已经有一个工作日的cron时间表,该时间表可以满足您的要求(0 0 * * 1-5),但是我想在网站上添加一个答案,以提供常见的cron时间表,ahem, crontab表达式

我在Airflow上经常使用它来提出DAG的schedule_interval

可帮助您以交互方式设计cron时间表的主应用程序位于crontab.guru

仅在工作日时间表上的示例-https://crontab.guru/every-weekday

更多常见示例(例如,每半小时,每季度等)-https://crontab.guru/examples.html

答案 1 :(得分:5)

'schedule_interval': '0 0 * * 1-5'从星期一到星期五的每周的00:00运行。

答案 2 :(得分:1)

我也有类似的需求,最终把它放在我的开始之初-它类似于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)