由于机器学习各流程时长较长,并且流程比较复杂,经过选型对比,决定选用airflow作为流程调度器
一、选型对比
网上有较详细的各种流程调度器特性对比:https://www.jdon.com/workflow/Airflow-vs-Azkaban-vs-Conductor-vs-Oozie-vs-Amazon-Step-Functions.html
个人选择airlfow作为机器学习流程调度器主要原因是:python代码调试修改非常方便,特别适合流程较长,容易出问题,需要紧急修复的系统
二、部署架构
1)整个服务以微服务的方式部署在K8s上面,借助k8s调度器保证Scheduler、web挂掉以后自动重新拉起
2)需要共享存储保证worker、rabbitmq集群挂掉以后重启数据不丢失
三、基本使用方式
1)定义DAG
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2015, 6, 1),
'email': ['[email protected]'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
# 'queue': 'bash_queue',
# 'pool': 'backfill',
# 'priority_weight': 10,
# 'end_date': datetime(2016, 1, 1),
}
dag = DAG('tutorial', default_args=default_args, schedule_interval=timedelta(days=1))
参数详解:
default_args:dict,一些默认参数,这些参数可能是dag级别的,也可能是任务级别的,注意分辨
dag_id: dag的标识,也是dag的名字
start_date:任务开始执行的时间
catchup :很重要的参数,表示启动任务时,是否将任务start_date开始的所有未执行的周期任务都补执行一遍。true为开启,如果启用可能会一下子拉起很多dag run;false为禁用,如果禁用,任务开启时仅执行最近一次需要执行的任务(当前时间的上一周期时间点,比如每天凌晨1点执行的任务,那么当前任务的执行时间为上一天凌晨一点)
wait_for_downstream:True为开启,当前dag需要等待上一个dag执行成功才能开始执行
schedule_interval:任务执行周期,可以定义crontab表达式,也可以输入airflow自定义的参数,例如@daily,@hour等
sla:True为开启,表示当前任务运行时间超过下一dag任务开始时间时触发SLA
sla_miss_callback:触发SLA时候的回调函数,5个参数 dag, task_list, blocking_task_list, slas, blocking_tis
2)定义TASK
# t1, t2 and t3 are examples of tasks created by instantiating operators
t1 = BashOperator(
task_id='print_date',
bash_command='date',
dag=dag)
t2 = BashOperator(
task_id='sleep',
bash_command='sleep 5',
retries=3,
dag=dag)
templated_command = """
{% for i in range(5) %}
echo "{
{ ds }}"
echo "{
{ macros.ds_add(ds, 7)}}"
echo "{
{ params.my_param }}"
{% endfor %}
"""
t3 = BashOperator(
task_id='templated',
bash_command=templated_command,
params={'my_param': 'Parameter I passed in'},
dag=dag)
t2.set_upstream(t1)
t3.set_upstream(t1)
参数详解:
task_id:任务Id,也是任务的名称
dag:指定任务所属dag
depends_on_past:如果为True,下一个DagRun的时候,该task等待上一个Dag的相同task跑成功才会启动,对catchup有较好的并发抑制作用
on_success_callback:任务成功后的回调函数,一个context参数
on_failure_callback:任务失败后的回调函数,一个context参数
execution_timeout:任务超时时间
retries:任务失败后的重试次数
retry_delay:任务重试延时时间
四、对airlfow的一些改造
1)定义自己的CLI,这样不用修改airflow自带的CLI就能新增功能或者修改airflow存在的一些bug
2)airlfow默认的周期是T-1,继承airlfow的BaseOperator,定制自己的BaseOperator,将任务周期适配成T-n
3)airflow界面默认时间是UTC0时区,将界面显示改造成UTC东八时区
4)一些bug的修改
5)封装一些自己的operator和sensor,方便流程调用时使用