跳转到内容

Airflow Cron表达式

来自代码酷

Airflow Cron表达式[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

Cron表达式是Apache Airflow中用于定义任务调度时间的一种标准格式,源自Unix系统的cron工具。它由5或6个字段组成(部分实现支持秒级精度),每个字段代表不同的时间单位,通过特定符号组合实现灵活的调度规则。在Airflow的DAG定义中,`schedule_interval`参数可直接接收cron表达式,控制任务自动触发的频率。

基本语法[编辑 | 编辑源代码]

标准cron表达式格式如下(以5字段为例): ┌───────────── 分钟 (0 - 59) │ ┌───────────── 小时 (0 - 23) │ │ ┌───────────── 日 (1 - 31) │ │ │ ┌───────────── 月 (1 - 12 或 JAN-DEC) │ │ │ │ ┌───────────── 星期 (0 - 6 或 SUN-SAT) │ │ │ │ │

  • * * * *

字段详解[编辑 | 编辑源代码]

字段 允许值 特殊字符 说明
分钟 0-59 , - * / 每小时的第几分钟触发
小时 0-23 , - * / 每天的第几小时触发
1-31 , - * ? / L W 每月的第几天触发
1-12或JAN-DEC , - * / 每年的第几月触发
星期 0-6或SUN-SAT , - * ? L # 每周的星期几触发

特殊符号说明

  • *:匹配所有值
  • ,:指定多个值(如MON,WED,FRI
  • -:指定范围(如9-17表示9点到17点)
  • /:步长(如*/5表示每5单位)
  • ?:仅在日或星期字段使用,表示"不指定"
  • L:最后一天(如L表示月末)

在Airflow中的应用[编辑 | 编辑源代码]

DAG定义示例[编辑 | 编辑源代码]

  
from airflow import DAG  
from datetime import datetime  

dag = DAG(  
    'cron_example',  
    schedule_interval='0 8 * * 1-5',  # 每周一到周五早上8点运行  
    start_date=datetime(2023, 1, 1)  
)

预定义宏[编辑 | 编辑源代码]

Airflow扩展了cron语法,支持以下快捷方式:

  • @once:仅运行一次
  • @hourly:每小时(0 * * * *
  • @daily:每天午夜(0 0 * * *
  • @weekly:每周日午夜(0 0 * * 0
  • @monthly:每月1日午夜(0 0 1 * *
  • @yearly:每年1月1日午夜(0 0 1 1 *

复杂案例[编辑 | 编辑源代码]

案例1:工作日工作时间[编辑 | 编辑源代码]

表达式:0 9-17 * * 1-5 解释:周一至周五的9:00到17:00每小时运行一次

案例2:季度任务[编辑 | 编辑源代码]

表达式:0 0 1 */3 * 解释:每季度第一天的午夜运行(1月/4月/7月/10月1日)

案例3:月末处理[编辑 | 编辑源代码]

表达式:0 0 L * * 解释:每月最后一天的午夜运行

可视化时间轴[编辑 | 编辑源代码]

gantt title Cron表达式执行示例: 0 8,20 * * 1,3,5 dateFormat YYYY-MM-DD HH:mm axisFormat %H:%M section 任务触发 周一早上8点 :active, 2023-06-05 08:00, 1m 周一晚上8点 :active, 2023-06-05 20:00, 1m 周三早上8点 :active, 2023-06-07 08:00, 1m 周三晚上8点 :active, 2023-06-07 20:00, 1m

常见问题[编辑 | 编辑源代码]

时区处理[编辑 | 编辑源代码]

Airflow默认使用UTC时区,可通过修改airflow.cfg中的default_timezone参数调整。建议在DAG中显式指定时区:

  
import pendulum  

dag = DAG(  
    'timezone_example',  
    schedule_interval='0 8 * * *',  
    start_date=datetime(2023, 1, 1),  
    catchup=False,  
    timezone=pendulum.timezone('Asia/Shanghai')  
)

表达式验证[编辑 | 编辑源代码]

使用[crontab.guru](https://crontab.guru/)等工具在线验证表达式逻辑。

数学原理[编辑 | 编辑源代码]

对于步长表达式a/b,其数学表示为: T={tta(modb)} 例如*/15在分钟字段表示: T={0,15,30,45}

最佳实践[编辑 | 编辑源代码]

1. 避免使用*在"日"和"星期"字段同时出现(可能产生冲突) 2. 测试时先用@daily等简单规则,再逐步复杂化 3. 在DAG注释中写明cron表达式的自然语言解释 4. 考虑使用timedelta作为schedule_interval的替代方案