AIRFLOW使用总结

由于机器学习各流程时长较长,并且流程比较复杂,经过选型对比,决定选用airflow作为流程调度器

一、选型对比

网上有较详细的各种流程调度器特性对比:https://www.jdon.com/workflow/Airflow-vs-Azkaban-vs-Conductor-vs-Oozie-vs-Amazon-Step-Functions.html 

个人选择airlfow作为机器学习流程调度器主要原因是:python代码调试修改非常方便,特别适合流程较长,容易出问题,需要紧急修复的系统

二、部署架构

  AIRFLOW使用总结_第1张图片

 

 

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,方便流程调用时使用

 

你可能感兴趣的:(AIRFLOW)