Apache Airflow调度器间隔与任务启动时间异常排查求助
针对你遇到的Airflow任务未在28.03 6:48(本地UTC+3)启动的问题,结合你使用的Airflow 1.9.0、Ubuntu本地执行器环境,我整理了以下排查和解决步骤:
1. 先明确Airflow的时间核心逻辑
Airflow 1.9.0默认使用UTC时间处理所有调度逻辑,任务会在上一个调度周期结束时触发,而非周期开始时间。比如你要本地6:48触发,对应UTC是3:48,那么调度周期的结束时间是UTC 3:48,任务会在此时启动。如果你的schedule_interval或start_date用了本地时间而非UTC,就会出现时间错位。
2. 排查DAG的时间配置是否正确
检查start_date和schedule_interval的时区匹配
确保你的start_date是UTC时间,schedule_interval也是基于UTC的cron表达式:
- 本地6:48(UTC+3)对应UTC 3:48,所以cron表达式应该是
48 3 * * *,而非48 6 * * * start_date要设置为过去的UTC时间,比如datetime(2024, 3, 25, 3, 48, 0)(对应本地25号6:48),而不是本地时间的6:48
示例正确配置:
from datetime import datetime from airflow import DAG from airflow.operators.dummy_operator import DummyOperator default_args = { 'owner': 'your_team', 'start_date': datetime(2024, 3, 25, 3, 48, 0), # 明确使用UTC时间 'retries': 1, } dag = DAG( 'your_target_dag', default_args=default_args, schedule_interval='48 3 * * *', # UTC每天3:48触发,对应本地6:48 catchup=False, # 关闭补跑,避免不必要的历史任务干扰 ) # 你的任务定义 sample_task = DummyOperator( task_id='sample_task', dag=dag, )
确认catchup参数设置
如果catchup=True,Airflow会补跑start_date到当前时间的所有未执行任务,但如果你的start_date设置过晚(比如28号),第一个任务会在29号才触发(因为要等第一个周期结束)。建议设置catchup=False,仅执行未来的调度任务。
3. 检查Airflow核心组件状态
确认DAG未被暂停
在Airflow UI的DAG列表中,确保你的目标DAG是Active状态(没有被暂停)。不小心暂停DAG是任务不触发的常见原因。
重启Airflow Scheduler
Airflow 1.9.0的scheduler偶尔会出现进程挂起或调度逻辑卡住的情况,重启scheduler可以解决大部分这类问题:
- 如果是用systemd管理的服务,执行:
sudo service airflow-scheduler restart - 如果是直接运行的进程,先杀死旧进程再重新启动:
ps aux | grep airflow-scheduler | grep -v grep | awk '{print $2}' | xargs kill -9 airflow scheduler &
查看Scheduler日志
检查scheduler的日志文件(默认路径/var/log/airflow/scheduler,具体看你的airflow.cfg配置),搜索28号UTC 3:48左右的日志,看是否有任务实例创建失败、依赖错误或其他异常信息。
4. 检查任务实例状态
在Airflow UI的Browse -> Task Instances中,筛选28号的任务实例:
- 如果任务实例不存在:说明scheduler没有生成该任务,大概率是
start_date和schedule_interval的组合有问题(比如start_date设置为28号,第一个任务要等29号) - 如果任务实例存在但状态为
Scheduled或Queued:可能是本地执行器资源不足,或者任务被卡住,可以手动触发试试 - 如果任务实例状态为
Failed:查看任务日志,定位具体错误原因
5. 确认时区配置未被篡改
检查airflow.cfg中的default_timezone参数,确保值为utc(Airflow 1.9.0默认值)。如果修改为其他时区,会导致整个调度逻辑混乱。
内容的提问来源于stack exchange,提问作者Николай Осиний

