【问题标题】:Airflow DAG Runs Daily Excluding Weekends?Airflow DAG 每天运行,不包括周末?
【发布时间】:2018-06-29 19:24:19
【问题描述】:

是否可以创建除周六和周日外每天都运行的 Airflow DAG?这似乎是不可能的,因为您只有 start_dateschedule_interval

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

【问题讨论】:

    标签: airflow airflow-scheduler


    【解决方案1】:

    'schedule_interval': '0 0 * * 1-5' 在每周一到周五的每一天的 00:00 运行。

    【讨论】:

    • 它应该可以解决问题!它目前对我们有用。如果您有任何问题,请告诉我,我会尽力提供帮助。
    【解决方案2】:

    我也有类似的需求,最后把它放在了我的 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)
    

    【讨论】:

    • 对不起,请您稍微解释一下代码和/或举例说明如何使用操作符(我的大脑必须已经处于周末模式,因为它已经过时了:D)
    • 基本上你可以把它放在你的 dag 前面来评估时间/日期是否适合启动下游任务(在这种情况下,它只查看星期几并将自己标记为成功如果 execution_date 是工作日并且小时匹配 - 尽管如果您只关心工作日而不是小时,您可以删除第二部分。)如果它不匹配(即如果它是周末的一天),它将跳过所有下游任务。 dag 运行将被标记为成功。
    【解决方案3】:

    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

    【讨论】:

    • 感谢您扩展我的回答泰勒!非常有用的例子。
    • 好的,如果 crontab.guru 可以在除纽约证券交易所假期之外的每个工作日进行,我会更加印象深刻! XD
    • 看起来 cron 并不真正支持排除特定日期 (unix.stackexchange.com/q/128628/169772),但您可以在代码中执行排除部分并将 NYSE 假期保留在 Airflow 变量中。也许是纽约证券交易所假期的 BranchOperator?我也很想知道你在这里想出了什么。
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多