59
社区成员




简介:最好的任务调度工具,可编程、调度和监控的工作流平台。Airflow用户可以定义一组有依赖的任务,即 有向无环图(DAG),按照依赖依次执行。Airflow提供了丰富的命令行和强大的Web UI,方便的管控调度任务,可以实时监控运行状态。
日益增加的数据量
快速排查任务失败的原因
每个新工具都要重新学习新的配置规范
重试,监控,报警
敏捷高效地开发以满足业务需求
不均衡的数据峰值
纯Python、UI好用、丰富的集成、上手简单、开源打造、不只是为ETL打造。只要是做任务调度都可以用到
Airflow管道是作为代码配置的(Python),允许动态管道生成,允许编写动态实例化管道的代码。
轻松定义自己的运算符(operators),执行器(excutors)和扩展库,使其适合于环境的抽象级别。
Airflow管道简洁明了。使用功能强大的Jinja模板引擎(类似于Freemarker模板引擎),将脚本参数化内置到AirFlow的核心中。
Airfow具有模块化架构,并使用消息队列来协调任务数量的worker。Airflow可扩展到无穷大。
brew install --cask --appdir=/Applications docker #需要安装brew才能使用
docker --version
# 如果你比较懒可以使用最后的“airflow一键初始化脚本”,mac电脑通用
https://hub.docker.com/r/puckel/docker-airflow/tags?page=1&ordering=last_updated
# 执行镜像下载命令
docker pull puckel/docker-airflow:latest
# 获取当前系统的用户名,例如:jason
echo $USER
# 执行上述命名将得到的用户名替换在 $USER 的位置
sudo mkdir -p -v /data/docker/volumes/airflow/{dags,logs} && sudo chown -R $USER /data/docker/volumes/airflow/{dags,logs}
docker run -d -p 8080:8080 --name airflow puckel/docker-airflow
docker exec -it -u 0 airflow /bin/bash (root用户) #这个也是进入Docker的命令,docker是个容器,这个就是进入容器的命令
python -c "from cryptography.fernet import Fernet;print(Fernet.generate_key().decode())" #记得按回车
export AIRFLOW__CORE__FERNET_KEY=字符串 #拿到上边命令运行出来的字符串,回车
airflow initdb # 初始化数据库 创建好多表插入初始值
http://localhost:8080/admin #admin是我自己电脑的用户名,根据自己用户名填写
docker start airflow
docker stop airflow
DAG有向无环图,跟Spark的通过DAG生成RDD的血缘关系依赖和血缘追踪一样。一个DAG就代表一些列有依赖关系的Task。
类似面向编程语言里的一个Class和Object 的关系,代表着一个DAG的运行。
task是最小的、最基础的任务运行单位,一群Task就组成了一个DAG有向无环图,一个DAG里Task和Task之间有上下游的依赖关系。
Scheduler 是一种使用DAG定义结合元数据中的任务状态来决定那些任务需要被执行或者任务的优先级执行过程,调度器通常作为任务来执行。启动一个子程序,监控DAG文件,DAG文件有增加和修改对其相应的处理,一分钟扫描一次。
检查有没有那个DAG先被执行的,有就DAGRUN。
看看有没有别的DAG需要执行
看看共享池的大小来决定你这个任务要不要执行(假设池子有五个,五个都有任务执行,那么后面的任务就需要等待)
提供图形界面,可以监控DAG运行状态,也可以对DAG操作,WebServer 使用的是Gunicorn框架。
元数据库,默认为SQLite,可支持第三方库,例如Mysql等。存储所有的DAG、任务定义、运行历史、用户、权限、等等。
一般是读取数据库连接和用户密码等
用来执行Executor(逻辑执行的任务) 接受的任务,这些是实际执行任务逻辑的进程,用正在使用的执行器来定义
Airflow本身是一个综合平台,它兼容多种组件,所以在使用的时候有多种方案可以选择。比如最关键的执行器就有四种:
SequentialExecutor:单进程顺序执行任务,默认执行器,通常只用来测试。
LocalExecutor:多进程本地执行任务。
CeleryExecutor:多分布式调度,生产常用
DaskExecutor:动态任务带哦度,主要用于数据分析
。。。。。。等等
AirFlow2.0版本后可以有多个Scheduler,实现分布式调用
是一个分布式调度框架,其本身无队列功能,需要使用第三方组件,比如redis或者rebbitmq,我们公司现在用的是redis来做第三方组件
# -*- coding: utf-8 -*-
import airflow
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dummy_operator import DummyOperator
from airflow.models import DAG
args = {
'owner': 'airflow',
'start_date': airflow.utils.dates.days_ago(2)
}
#设置DAG的名称
dag = DAG(
dag_id='demo01', default_args=args,
schedule_interval='0 0 * * *')
cmd = 'ls -l'
run_this_last = DummyOperator(task_id='run_this_last', dag=dag)
run_this = BashOperator(
task_id='run_after_loop', bash_command='echo 1', dag=dag)
run_this.set_downstream(run_this_last)
for i in range(3):
i = str(i)
task = BashOperator(
task_id='runme_'+i,
bash_command='echo "{{ task_instance_key_str }}" && sleep 1',
dag=dag)
task.set_downstream(run_this)
task = BashOperator(
task_id='also_run_this',
bash_command='echo "run_id={{ run_id }} | dag_run={{ dag_run }}"',
dag=dag)
task.set_downstream(run_this_last)
airflow配置文件默认是将代码放在本目录下的一个dags目录(小写)没有自己创建一个,然后vim一个后缀为.py的文件将代码粘入保存
切记注意缩进行,代码绝对不会报错,报错看看代码格式,有可能粘乱