AirFlow——0:

猫TOU馨 2022-02-27 00:19:56

AirFlow

简介:最好的任务调度工具,可编程、调度和监控的工作流平台。Airflow用户可以定义一组有依赖的任务,即 有向无环图(DAG),按照依赖依次执行。Airflow提供了丰富的命令行和强大的Web UI,方便的管控调度任务,可以实时监控运行状态。

ETL 的常见痛点:

​ 日益增加的数据量

​ 快速排查任务失败的原因

​ 每个新工具都要重新学习新的配置规范

​ 重试,监控,报警

​ 敏捷高效地开发以满足业务需求

​ 不均衡的数据峰值

优点:

​ 纯Python、UI好用、丰富的集成、上手简单、开源打造、不只是为ETL打造。只要是做任务调度都可以用到

设计理念:

动态:

​ Airflow管道是作为代码配置的(Python),允许动态管道生成,允许编写动态实例化管道的代码。

可扩展:

​ 轻松定义自己的运算符(operators),执行器(excutors)和扩展库,使其适合于环境的抽象级别。

优雅:

​ Airflow管道简洁明了。使用功能强大的Jinja模板引擎(类似于Freemarker模板引擎),将脚本参数化内置到AirFlow的核心中。

可伸缩性:

​ Airfow具有模块化架构,并使用消息队列来协调任务数量的worker。Airflow可扩展到无穷大。

OS系统Docker和Airflow安装

brew install --cask --appdir=/Applications docker  #需要安装brew才能使用

检查Docker版本信息

docker --version

docker查看Airflow地址

# 如果你比较懒可以使用最后的“airflow一键初始化脚本”,mac电脑通用
https://hub.docker.com/r/puckel/docker-airflow/tags?page=1&ordering=last_updated

拉取docker镜像

# 执行镜像下载命令 
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

获取root用户

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上创建新的容器,以后airflow的启动和关闭命令变为

docker start airflow 
docker stop airflow 

Airflow核心框架

DAG

DAG有向无环图,跟Spark的通过DAG生成RDD的血缘关系依赖和血缘追踪一样。一个DAG就代表一些列有依赖关系的Task。

DAG RUN

类似面向编程语言里的一个Class和Object 的关系,代表着一个DAG的运行。

TASK

task是最小的、最基础的任务运行单位,一群Task就组成了一个DAG有向无环图,一个DAG里Task和Task之间有上下游的依赖关系。

Scheduler/调度器

​ Scheduler 是一种使用DAG定义结合元数据中的任务状态来决定那些任务需要被执行或者任务的优先级执行过程,调度器通常作为任务来执行。启动一个子程序,监控DAG文件,DAG文件有增加和修改对其相应的处理,一分钟扫描一次。

​ 检查有没有那个DAG先被执行的,有就DAGRUN。

​ 看看有没有别的DAG需要执行
​ 看看共享池的大小来决定你这个任务要不要执行(假设池子有五个,五个都有任务执行,那么后面的任务就需要等待)

WebServer/Web服务器

​ 提供图形界面,可以监控DAG运行状态,也可以对DAG操作,WebServer 使用的是Gunicorn框架。

Metadata DataBase/元数据库

​ 元数据库,默认为SQLite,可支持第三方库,例如Mysql等。存储所有的DAG、任务定义、运行历史、用户、权限、等等。

​ 一般是读取数据库连接和用户密码等

Worker

​ 用来执行Executor(逻辑执行的任务) 接受的任务,这些是实际执行任务逻辑的进程,用正在使用的执行器来定义

Executor 执行器

Airflow本身是一个综合平台,它兼容多种组件,所以在使用的时候有多种方案可以选择。比如最关键的执行器就有四种:

​ SequentialExecutor:单进程顺序执行任务,默认执行器,通常只用来测试。

​ LocalExecutor:多进程本地执行任务。

​ CeleryExecutor:多分布式调度,生产常用

​ DaskExecutor:动态任务带哦度,主要用于数据分析

​ 。。。。。。等等

Airflow运行架构

单机

img

集群

img

AirFlow2.0版本后可以有多个Scheduler,实现分布式调用

Celery

是一个分布式调度框架,其本身无队列功能,需要使用第三方组件,比如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的文件将代码粘入保存

切记注意缩进行,代码绝对不会报错,报错看看代码格式,有可能粘乱

...全文
220 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

59

社区成员

发帖
与我相关
我的任务
社区描述
汇集大数据爱好者和大数据工作者,大家共同学习,探索,和分享自己的bug和学习内容,进行技术交流。 成长自己,帮助他人,让自己做个有价值的人!
社区管理员
  • 宇智波云
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧