airflow

2,329 阅读12分钟

引言:更多相关请看 个人知识系列

概述

Apache Airflow

数据管道是指通过一系列步骤来完成某个数据处理任务的流程。想一下在ETL作业中,每天一次合并多个数据源并 计算汇总统计信息以用于报表。 有一些管道使用实时数据,而另一些管道通常使用批量数据。每种方法都有其自身的优点。Apache Airflow是一个用于以 编程方式开发和监控批量处理数据管道的平台。 Airflow提供了一个Python框架来开发由不同技术组成的数据管道。Airflow管道本身也以Python脚本进行编写,Airflow 框架提供了一组用于构建管道的小组件,而且小组件可与多种技术进行集成。 可将Airflow想象成管理数据管道的管家;他可以启动和停止在不同系统中或不同技术上运行的任务。

认识流程管理系统

许多数据管道由多个任务组成,这些任务必须按一定顺序执行,这些任务可以用一个流程图来定义: a.哪些任务组成了这个流程

b.这些任务按什么顺序执行

概括说,流程的定义包括两点:

1.一系列任务的定义,所有任务组成一个流程。

2.任务之间的依赖性

为了确定何时运行指定任务,流程管理系统需要知道在可以运行该任务之前需要执行哪些任务。任务之间的这种关系通常 称为任务依赖关系。 更复杂的数据流程,也是一个有向无环图,即DAG(Directed acyclic graph) 。 在Airflow里我们通过DAG来指代数据流程图。

常用数据流程管理工具的对比

Oozie Azkaban Kettle Airflow
起源 LinkedIn Airbnb
Workflow定义方式 XML YAML 图形界面 Python代码
易用性
扩展性
稳定性
用户界面 依赖于Hue 执行时无界面
调度功能
回填功能
开发语言 Java Java Java Python
功能扩展性
Github热度 419star 2078star 2064star 9681star
社区活跃度

关于历 史 和 现 状

比较精简的代码库,只有30K+行数的Python代码 。 诞生于Airbnb,15年 6月开源,现在是Apache的顶级孵化项目。 社区活跃 。 5年的开源项目,8872个提交,1148位贡献者,每周20+的提交。 有很多新兴互联网公司开始使用:Airbnb, Groupon, New Relic , PayPal, Reddit, Spotify, Tes la, Twitter, Google • 完成的有7000+ Pull Request。 国内也有很多公司开始评估和采用Airflow。

配置即代码

通常,数据流程编程可以分为两个阵营:以代码(例如 Python)配置的方法和以静态文件(例如XML)配置的方法。 Python代码允许使用for循环和其他编程结构生成动态而灵活的工 作流。另一方面,静态配置在这种意义上不太灵活,通常遵循严格 的架构。 配置为代码既可以是肯定的,也可以是否定的;代码的动态性 质可以为许多任务提供简洁的代码;但是,有无数种方法来定义代 码,因此,数据流程的定义也不太严格。

Airflow云服务(Google)

CLOUD COMPOSER特性:

多云端:创建跨云端连接数据、处理任务和服务的工作流,从而实现统一的数据环境。

混合式:通过编排跨本地和公有云的工作流,轻松过渡到云端或维护混合式数据环境。

Python编程语言:利用已有的Python技能在Cloud Composer中动态编写和安排工作流。

完全托管:Cloud Composer的托管特性使您可以专心编写、安排和监控工作流,而无需在资源的预配上费神。

开源:Cloud Composer基于Apache Air low构建而成, 可让用户避免供应商锁定问题并实现可移植性。

集成:内置集成了Big Query、Dataflow、Data proc、Datastore、Cloud Storage、Pub/Sub、Cloud ML Engine等诸多产品,让您能够编排端到端GCP工作负载。

可靠性:通过易于使用的图表来监控和排查问题的根本原因,提高工作流的可靠性。

架构

Airflow可以以多种架构方式运行,从High Level看,它包括三个组件:

1.Web服务器:向用户提供可视界面,以查看和管理数据流程的状态。

2.调度程序:调度程序负责解析DAG定义(读取DAG文件并提取有 用的片段),确定应启动的任务(调度/手动触发/回 填),并将任务发送给工作进程以执行。

3.工作进程:工作进程由调度程序在内部启动,真实执行任务的进程 。

在最简单的设置中,所有进程都在一台计算机上运行。如果单台计算 机达到资源极限,则Airflow可以在多台计算机上运行并扩展 。 Celery和Kubernetes支持分布式工作负 载 。 所有进程都需要访问数据库以存储元数据。需要对任务状态进行修改,储存DAG配置等。同样,所有进程都需要访问DAG文件。

日志:所有三种进程都会生成日志: Web服务器记录浏览器的活动,调度程序记录有关其正在执行的任务的各种信息,而工作进程记录其正在执行的任务。 日志可以存储在本地文件系统上,也可以配置为存储在其他位置。

安装

安装前提: a)C e n t O S > = 7 . 4 , 推荐7 . 8

b)python 3.6

c)docker19.03社区版

d)yum install需要有root权限的用户,下面的命令默认不带sudo,如果使用非root用户请自行加上sudo。pip、pipenv和docker-

compose都不要root权限

pip安装

a)安装 python3

yum install python3 python3-devel -y

b)安装 airflow 的依赖包(用于 python 包的编译)

yum install gcc

c)安装 pipenv

pip3 install pipenv --user

d)创建 python3 虚拟环境,创建一个目录 , 进入目录后执行

sudo -H pip install -U pipenv
mkdir -p /opt/module/airflow
cd /opt/module/airflow/
pipenv --three
pipenv shell #创建一个虚拟环境,可以退出
Launching subshell in virtual environment...
[root@slave1 airflow]#  . /root/.local/share/virtualenvs/airflow-eDhhvR35/bin/activate
(airflow) [root@slave1 airflow]# 
pipenv --python 3.6
cat /opt/module/airflow/Pipfile 
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]

[requires]
python_version = "3.6"

e)安装 airflow

pip3 install apache-airflow==1.10.9

f)修复 SQLAlchemy 的兼容性问题

pip3 uninstall SQLAlchemy
pip3 install SQLAlchemy==1.3.15

g)airflow needs a home, ~/airflow is the default

export AIRFLOW_HOME=~/airflow

h)创建 airflow db

airflow initdb

i)启动 web server (窗口不要关掉)

airflow webserver -p 10099 & (后台执行)

j)启动 scheduler(另外起一个窗口)

 airflow scheduler

docker-compose安装

a) 安装docker-compose工具: pip3 install docker-compose --user b) 下载docker-compose.yml 文件, 放在新建目录下

vim /opt/module/airflow/docker-compose.yml 
version: '3.7'
services:
    postgres:
        image: postgres:9.6
        environment:
            - POSTGRES_USER=airflow
            - POSTGRES_PASSWORD=airflow
            - POSTGRES_DB=airflow
        logging:
            options:
                max-size: 10m
                max-file: "3"

    webserver:
        image: puckel/docker-airflow:1.10.9
        restart: always
        depends_on:
            - postgres
        environment:
            - LOAD_EX=n
            - EXECUTOR=Local
        logging:
            options:
                max-size: 10m
                max-file: "3"
        volumes:
            - ./dags:/usr/local/airflow/dags
            # - ./plugins:/usr/local/airflow/plugins
        ports:
            - "8080:8080"
        command: webserver
        healthcheck:
            test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
            interval: 30s
            timeout: 30s
            retries: 3

c) 进入目录执行docker-compose up -d创建容器并启动, 第一次执行需要下载镜像会需要一点时间

注意:必须保证/opt/module/airflow下有/opt/module/airflow/docker-compose.yml配置文件。

cd /opt/module/airflow
docker-compose up -d 开启
docker-compose down 关闭

d) 容器启动成功后,检查用docker-compose ps,

[root@slave1 airflow]# docker-compose ps
/usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version!
  RequestsDependencyWarning)
       Name                      Command                 State                         Ports                   
---------------------------------------------------------------------------------------------------------------
airflow_postgres_1    docker-entrypoint.sh postgres   Up             5432/tcp                                  
airflow_webserver_1   /entrypoint.sh webserver        Up (healthy)   5555/tcp, 0.0.0.0:8080->8080/tcp, 8793/tcp

查看日志用

docker-compose logs  -f --tail 100 webserver

注意:这种方式启动是访问http://slave1:8080/ 8080端口。

访问

浏览器里打开http://<机器ip>:10099访问 。pip和docker-compose 如需修改配置,pip安装请修改目录下的airflow.cfg文件,然后重启服务。docker安装需要通过设置环境变量来修改配置。

执行器

Airflow内置4种执行模型: Sequential、Local、Celery、Mesos,扩展Dask(Python并行计算框架)和Kubernetes,执行模型很容易扩展出新的 。

Sequential顺序执行器(默认)

最小配置,可以和sqlite使用
一次只能处理一个任务
只适用于演示

local本地

生成多个调度进程 
可垂直扩展 
可用于生产环境 
无其他环境依赖,推荐新手使用 

Celery执行器

可水平和垂直扩展,组件集群 
可以通过Flower来监控 
支持Pools和队列(如kafka) 
部署稍麻烦,代码需要同步
可用于生产环境

Airflow CLI命令行管理工具 常用命令

backfill: 回填历史数据 
run: 执行一个任务实例 
list_dags: 列出所有的DAG 
test: 测试一个任务实例,没有依赖检查

还有些其他命令,但是使用UI操作更加方便 .

Docker Airflow

• 使用Docker部署Airflow • magicwind.coding.net/p/bigdata-c… • 建议先使用Local Executor • 使用docker-compose exec webserver bash可 以 登 录 容 器 运行airflow cli

[root@slave1 airflow]# docker-compose exec webserver bash
/usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version!
  RequestsDependencyWarning)
airflow@99d03cb247f0:~$ ls
airflow.cfg  airflow-webserver.pid  dags  logs  unittests.cfg

编写AirflowDAG

vim dags/tutorial.py
[root@slave1 airflow]# mkdir -p /opt/module/airflow/dags/sire/operators
[root@slave1 airflow]# vim /opt/module/airflow/dags/sire/operators/mysql2mysql_operators.py
chmod +x /opt/module/airflow/dags/sire/operators/mysql2mysql_operators.py
[root@slave1 dags]# chmod +x /opt/module/airflow/dags/tutorial.py 
[root@slave1 dags]# chmod +x /opt/module/airflow/docker-compose.yml

核心术语

DAG:向无环图(DirectedAcyclicGraph),将所有需要运行的tasks按照依赖关系组织起来,描述的是所有tasks执行的顺序。 DagRun:DAG的一次运行,分为手动的和调度的两种。 Operator:可以以简单理解为一个class,描述了DAG中一个具体的task具体要做的事。其中,airflow内置了很多operators,如BashOperator执行一个bash命令,PythonOperator调用任意的Python函数,EmailOperator用于发送邮件,HTTPOperator用于发送HTTP请求,SqlOperator用于执行SQL命令…同时,用户可以自定义Operator,这给用户提供了极大的便利性。 Task:Task是Operator的一个实例,也就是DAGs中的一个node。 TaskInstance:task的一次运行。taskinstance状态包括“running”,“success”,“failed”,“skipped”,“upforretry”等。 TaskRelationships:DAGs中的不同Tasks之间可以有依赖关系,如TaskA>>TaskB,表明TaskB依赖于TaskA。 通过将DAGs和Operators结合起来,用户就可以创建各种复杂的workflow了。

Airflow对象之间的关系

DAG

运行一个DAG:schedule定时或者manual手动。 DAG在指定时间执行–通过设置scheduleinterval。 处理失败的任务(Task):DAGGraphView里点击Task操作对话框->点击Clear按钮

调度

三种调度方式: 1.内置的固定间隔的调度:None,@once,@hourly,@daily,@weekly,@monthly,@yearly 2.(推荐)基于Cron的灵活的调度:分 时 日 月 年,比如0 0 * * * 3.基于指定频率的调度:timedelta(days=3) 增量处理任务:动态获取executiondate,然后传入task

理解ExecutionDate 使用回填功能(仅支持命令行)

时区问题

数据库里默认储存的是UTC时间,界面上显示的也是UTC时间(见下面的截图)。支持时区设置,默认的时区可以通过airflow.cfg配置修改。DAG也分为时区敏感的和不敏感的,构建时区感知的DAG,需要在构建DAG时将时区信息传入,之后就可以按照指定时区的时间来调度任务了;时区不敏感的DAG,默认按照UTC时间来调度。

Execution Date

DAG设置为中国时区 一日一次: 0 6 * * *, 每天早上6点执行

一日一次: 0 12 * * *, 每天中午12点执行

一日两次: 0 6,12 * * *, 每天早上6点和中午12点执行

扩展

Operator内置和自定义

1.Default Variables和 Macro {{ ds }}, {{ yesterday_ds }}, {{ tomorrow_ds }}

{{ ds_add(ds, days) }} 2.模版参数和模版文件:Jinja模版 3.MySqlOperator 4.扩展Operator在 contrib里 5.自定义Operator: MySQLToMySQLOperator

其它常用术语

Variable:提供通用的、用户可以自定义的变量存储和获取功能,可在UI上操作。 Connection:管理外部系统的连接信息,如外部MySQL、HTTP服务等,连接信息包括conn_id/hostname/login/password/schema等,可以通过界面查看和管理,编排workflow时,使用conn_id进行使用。可在UI上操作。 Pool:用来控制tasks执行的并行数。将一个task赋给一个指定的pool,并且指明priority_weight,可以干涉tasks的执行顺序。可在UI上操作。

Xcoms:在airflow中,operator一般(notalways)是原子的,也就是说,他们一般独立执行,同时也不需要和其他operator共享信息,如果两个operators需要共享信息,如filename之类的,推荐将这两个operators组合成一个operator。如果实在不能避免,则可以使用XComs(cross-communication)来实现。XComs用来在不同tasks之间交换信息。 Hook:访问各种数据源的钩子,被Operator所使用。 TriggerRule:指task的触发条件。默认情况下是task的直接上游执行成功后开始执行,airflow允许更复杂的依赖设置,包括all_success(所有的父节点执行成功),all_failed(所有父节点处于failed或upstream_failed状态),all_done(所有父节点执行完成),one_failed(一旦有一个父节点执行失败就触发,不必等所有父节点执行完成),one_success(一旦有一个父节点执行成功就触发,不必等所有父节点执行完成),dummy(依赖关系只是用来查看的,可以任意触发)。另外,airflow提供了depends_on_past,设置为True时,只有上一次调度成功了,才可以触发。 SubDAG:DAG可以嵌套。

Best Practice

注意DAG代码规范
使用Connection管理密码
使用Variable管理配置
DAG的定义尽量简单,避免复杂逻辑使用代码来动态生成Task
不要一次性处理大量数据
不要把文件储存在本地文件系统上
使用Pool来管理任务的并发

Azkaban

部署

JDK 单节点(测试,低负载) 多节点(高可用,生产) 以项目、Flow和Job三级结构进行管理 代码yaml是配置文件,打包成zip文件后在Web管理界面里上传支持手工调度、定时调度和任务依赖管理 界面友好,比较好上手

job type

Command, HadoopShell 
Java, javaprocess, hadoopJava Hive