##airflow简析(一) airflow是airbnb开源的用于构建工作流的框架。开发者用python脚本来定义DAG,airflow负责调度和监控。开发简单,后台功能丰富。
###scheduler调度器
- collect dags 遍历dags目录下面的.py文件,导入模块,找出定义的dag对象保存到dag列表dagbag
- 进入循环
- 优先处理处于排队中的task实例
- 默认每10次循环检查一次dags目录,加载更新的dag,否则,只加载dagbag中更新的dag
- 遍历dagbag中的dag,开始调度
- 实例化一个对应执行日期的dagrun,如果dag是第一次执行并且没有执行过的task,则从dag定义的start_date开始调度,如果dag是第一次运行但是有执行过的属于这个dag的task,会从task最后执行时间前5天开始调度;如果dag不是第一次执行,则从上一次的执行日期开始,下次执行日期是(开始日期+调度间隔),并且在下下次执行日期(下次执行日期+调度间隔)到来之后才调度。也就是,开始日期是2015-10-01,调度间隔是1天,下次执行日期是2015-10-02,然后这个任务会在 2015-10-03 调度执行。
- 对于每个dag,查找状态为running的实例dagrun,每个dagrun是dag在某个执行日期的实例,对于构成dag的每个task,实例化task instance(task对应某个执行日期的实例),判断是否能执行,例如依赖的上级task有没有成功等,如果可以执行,则组装一条airflow run命令放入队列中。
- 处理SLA miss,如果task在配置的预计执行完成日期没有执行成功,会发邮件通知。
- 处理僵尸进程,即没有心跳的执行状态的job。
- executor异步执行队列中的命令
- 检查当前调度进程(SchedulerJob)数据库中的状态,是SHUTDOWN就kill掉自己,否则更新心跳
- sleep直到与上次心跳间隔为scheduler_heartbeat_sec,进入下一次循环
###executor执行器
- 三种选择
- Sequential executor 单进程
- local executor 多进程,通过multiprocessing库预先建立worker池
- celery 分布式,利用celery库
- 执行过程
- 从调度任务队列拿task
- 开子进程用shell执行task的命令,父进程阻塞等待子进程完成
- 执行状态(SUCCESS/FAILED)放入结果队列