因为⼤数据的任务多、复杂化就会有不同的需求:
任务种类多、需求多样化所以说我们需要调度系统
⼯作之后,很多童鞋和我⼀样最先接触到的应该是Linux⾃带的定期执⾏程序命令 crontab,使⽤简单、运⾏稳定、上⼿容易但是也有⾃⼰的缺点⽐如任务多了之后⽆法管 理、没有依赖关系。
因此我们在这⾥对crontab不做过多介绍,主要针对较为成熟的⼯作 流调度⼯具:Oozie、Azkaban、Airflow进⾏对⽐
通过以上看出Airflow是⼀款优秀的调度⼯具,下⽂将以Airflow的服务构成、Airflow的Web 界⾯、DAG⽰例以及部署运维来介绍这款调度系统
在进⼀步介绍 Airflow 之前,我想先介绍⼀些在 Airflow 中常⻅的名词概念
也叫有向⽆环图,在Airflow中则定义了整个完整的作业。是多个Task的集合,包含了Task之间的依赖关系
Task是DAG中具体的作业任务,它必须存在于某⼀个DAG之中。
当⼀个DAG满⾜它的调度时间,或者被外部触发时,就会产⽣⼀个DAG Run,可以理解 为由DAG实例化的实例
当⼀个Task被调度启动时,就会产⽣⼀个Task Instance,可以理解为由Task实例化的实例
⼀个正常运⾏的Airflow系统⼀般由以下⼏个服务构成,可通过ps查看
Airflow提供了⼀个可视化的Web界⾯,启动WebServer后,就可以在Web界⾯上查看定义 好的DAG并监控其改变的运⾏状况,也可以在Web界⾯中对⼀些变量进⾏配置
整个Airflow的调度由Scheduler负责发起,每隔⼀段时间Scheduler就会检查所有定义完成 的DAG及Task,如果有符合运⾏条件的作业,Scheduler就会发起相应的作业任务以供 Worker去执⾏
来执⾏具体的作业,Worker可以部署在多台机器上,当接收的队列中有作业任务时, Worker就会接收这个作业任务,并开始执⾏
提供了⼀个可视化界⾯监控所有的Worker运⾏状况,这个服务不是必要的。
下⾯介绍⼀下 Airflow的Web操作界⾯,从⽽可以对Airflow有⼀个更直观的了解
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