浅谈Airflow调度系统

一、调度系统

1.1 为什么需要调度系统?

因为⼤数据的任务多、复杂化就会有不同的需求:

  • 单个任务
  • 串联、并联任务
  • 要⽀持⼦节点、依赖节点
  • 数据抽取
  • 任务失败重试机制
  • 补数机制
  • 发邮件等

任务种类多、需求多样化所以说我们需要调度系统

1.2 调度系统有⼏多

⼯作之后,很多童鞋和我⼀样最先接触到的应该是Linux⾃带的定期执⾏程序命令 crontab,使⽤简单、运⾏稳定、上⼿容易但是也有⾃⼰的缺点⽐如任务多了之后⽆法管 理、没有依赖关系。

因此我们在这⾥对crontab不做过多介绍,主要针对较为成熟的⼯作 流调度⼯具:Oozie、Azkaban、Airflow进⾏对⽐

 

通过以上看出Airflow是⼀款优秀的调度⼯具,下⽂将以Airflow的服务构成、Airflow的Web 界⾯、DAG⽰例以及部署运维来介绍这款调度系统

浅谈Airflow调度系统_第1张图片

⼆、什么是 Airflow

2.1 何为Airflow

  • Airflow是开源的⼀个⽤Python编写的调度⼯具,于2014年启动,2015年开源,2016年加 ⼊Apache软件基⾦会,之后成为Apache的顶级项⽬
  • Airflow通过DAG(有向⽆环图)来定义整个⼯作流,因⽽具有⾮常强⼤的表达能⼒

浅谈Airflow调度系统_第2张图片

 

在进⼀步介绍 Airflow 之前,我想先介绍⼀些在 Airflow 中常⻅的名词概念

2.2 名词解释

  • DAG

          也叫有向⽆环图,在Airflow中则定义了整个完整的作业。是多个Task的集合,包含了Task之间的依赖关系

  • Task

          Task是DAG中具体的作业任务,它必须存在于某⼀个DAG之中。

  • DAG Run

          当⼀个DAG满⾜它的调度时间,或者被外部触发时,就会产⽣⼀个DAG Run,可以理解 为由DAG实例化的实例

  • Task Instance

          当⼀个Task被调度启动时,就会产⽣⼀个Task Instance,可以理解为由Task实例化的实例

三、 Airflow的服务构成

⼀个正常运⾏的Airflow系统⼀般由以下⼏个服务构成,可通过ps查看

  • WebServer

          Airflow提供了⼀个可视化的Web界⾯,启动WebServer后,就可以在Web界⾯上查看定义 好的DAG并监控其改变的运⾏状况,也可以在Web界⾯中对⼀些变量进⾏配置

  • Scheduler

          整个Airflow的调度由Scheduler负责发起,每隔⼀段时间Scheduler就会检查所有定义完成 的DAG及Task,如果有符合运⾏条件的作业,Scheduler就会发起相应的作业任务以供 Worker去执⾏

  • Worker

         来执⾏具体的作业,Worker可以部署在多台机器上,当接收的队列中有作业任务时, Worker就会接收这个作业任务,并开始执⾏

  • Flower

         提供了⼀个可视化界⾯监控所有的Worker运⾏状况,这个服务不是必要的。

浅谈Airflow调度系统_第3张图片

 

四、Airflow的Web界⾯

下⾯介绍⼀下 Airflow的Web操作界⾯,从⽽可以对Airflow有⼀个更直观的了解

4.1 DAG列表

浅谈Airflow调度系统_第4张图片

 

4.2 DAG树状图

浅谈Airflow调度系统_第5张图片

4.3 DAG依赖图

浅谈Airflow调度系统_第6张图片

 

五、DAG⽰例

Airflow中的DAG是由Python代码来写的,因⽽可扩展性⾮常强。接下来,我们可以通过⼀ 个例⼦来了解⼀下。

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
from airflow.utils.dates import days_ago
from datetime import timedelta

default_args = {
  'owner': 'airflow',
 'depends_on_past': True,
 'start_date': days_ago(1),
 'email': ['[email protected]'],
 'email_on_failure': True,
 'email_on_retry': False,
 'retries': 1,
 'retry_delay': timedelta(minutes=1),
 # 'pool': 'backfill',
 # 'priority_weight': 10,
 # 'end_date': datetime(2016, 1, 1),
 # 'execution_timeout': timedelta(seconds=300),
 # 'on_failure_callback': some_function,
 # 'on_success_callback': some_other_function,
 # 'on_retry_callback': another_function
}

def print_hello():
    print('-----------Hello world!---------')

schedule = timedelta(days=1)
dag = DAG(dag_id='hello_world_dag', default_args=default_args, schedule_interval=schedule, catchup=False)

t1 = BashOperator(task_id='date_task', bash_command='date', dag=dag)
t2 = BashOperator(task_id='sleep_task', bash_command='sleep 5', dag=dag)
t3 = PythonOperator(task_id='hello_task', python_callable=print_hello, dag=dag)

[t2, t3] >> t1

六、⽣产部署

  • ⼿动部署

          将项⽬代码⼿动上传到DAG⽬录,注意代码⽂件的执⾏权限,airflow会⾃动识别⽂件中 的DAG并在UI上显⽰,这种部署⽅式适合Python模块之间没有依赖的项⽬

  • ⾃动部署

          通过CI/CD⾃动部署代码到DAG⽬录,这种⽅式适合Python模块之间彼此有依赖的

七、⽇常运维

  • ⽇志太多
  • 任务失败
  • ⾼可⽤

          WebServer可通过HAProxy提供⾼可⽤性、负载均衡应⽤的代理

          Scheduler每个airflow集群只能有⼀个存活的实例,需要实现⾼可⽤,github上有解决 ⽅案。

          https://github.com/teamclairvoyant/airflow-scheduler-failover-controller

你可能感兴趣的:(airflow,airflow,分布式,调度框架,python)