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 * *
解释:每月最后一天的午夜运行
可视化时间轴[编辑 | 编辑源代码]
常见问题[编辑 | 编辑源代码]
时区处理[编辑 | 编辑源代码]
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
,其数学表示为:
例如*/15
在分钟字段表示:
最佳实践[编辑 | 编辑源代码]
1. 避免使用*
在"日"和"星期"字段同时出现(可能产生冲突)
2. 测试时先用@daily
等简单规则,再逐步复杂化
3. 在DAG注释中写明cron表达式的自然语言解释
4. 考虑使用timedelta
作为schedule_interval
的替代方案