简介:Apache Airflow是一个开源的工作流调度系统,由Airbnb创建,并于2015年开源。它使用Python编写,可以用来创建、调度和监控工作流。Airflow的工作流是由一系列的任务组成,这些任务按照依赖关系形成有向无环图(DAG)。Airflow的精髓在于其灵活性和可扩展性。使用Python代码定义工作流,使得工作流可以像普通的程序那样进行版本控制、测试和重构。同时,Airflow支持各种任务类型,包括但不限于bash命令、Python函数、SQL查询,也可以通过插件机制支持更多类型的任务和系统。
作用:主要用于数据处理的工作流管理。例如,你可以使用Airflow来定义和调度一个ETL工作流,这个工作流从多个数据源提取数据,将数据进行清洗和转换,然后将数据加载到数据仓库中。除此之外,Airflow也可以用于机器学习的工作流,自动化测试,基础设施的管理等。
工作流程:在Airflow中,工作流被定义为DAG(有向无环图)。每一个DAG由多个任务(Task)组成,每个任务都是一个可独立运行的工作单元,任务之间可以设定依赖关系。Airflow的调度器会按照DAG的结构和任务的依赖关系,自动调度和运行任务。
历史攻略:
Python:Celery+Redis+Flower安装和使用
Python + Jenkins + Selenium-Grid实现分布式web-ui自动化测试(centos+win10为例)
GitLab+GitLabRunner+Docker+Dockerfile+docker-compose+Flask持续集成部署
环境安装:
1、安装conda:详见历史攻略
2、创建专属环境:conda create --name airflow66 python=3.8
3、激活环境:conda activate airflow66
4、安装依赖:
pip install -i https://mirrors.aliyun.com/pypi/simple/ numpy
pip install -i https://mirrors.aliyun.com/pypi/simple/ "apache-airflow==2.4.3"
pip install -i https://mirrors.aliyun.com/pypi/simple/ requests
5、初始化:airflow db init
6、启动web服务:airflow webserver -p 8666 -D
7、创建账号:airflow users create --username admin --firstname tom --lastname lucky --role Admin --email tom@123.com
根据提示:输入密码、确认密码
8、访问浏览器并登录: http://<ip>:8666
9、启动airflow调度:airflow scheduler -D
登录:
样例:
airflow构建自动化测试案例:
1、在airflow目录下创建dags
2、在dags路径下创建文件:test.py
# -*- coding: utf-8 -*-
# time: 2023/5/13 13:00
# file: test.py
# 公众号: 玩转测试开发
import unittest
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.utils.dates import days_ago
import requests
# 定义单元测试
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(add(1, 2), 3)
def test_sub(self):
self.assertEqual(sub(3, 2), 1)
# 定义任务函数
def add(a, b):
return a + b
def sub(a, b):
return a - b
def run_tests(**kwargs):
suite = unittest.TestLoader().loadTestsFromTestCase(TestMath)
result = unittest.TextTestRunner(verbosity=0).run(suite)
return {
"total": result.testsRun,
"failures": len(result.failures),
"errors": len(result.errors),
"details": [str(f[1]) for f in (result.failures + result.errors)]
}
def notify_wechat(**kwargs):
ti = kwargs['ti']
result = ti.xcom_pull(task_ids='run_tests')
content = f"测试结果:\n\n总测试数:{result['total']}\n失败数:{result['failures']}\n错误数:{result['errors']}\n详细信息:{' '.join(result['details'])}"
data = {
"msgtype": "text",
"text": {"content": content}
}
requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR-KEY',
json=data)
# 定义DAG
default_args = {
'owner': 'airflow',
'start_date': days_ago(2),
}
with DAG(
'test_dag',
default_args=default_args,
description='A simple test DAG',
schedule_interval='* * * * *', # 每分钟执行一次
catchup=False,
) as dag:
t1 = PythonOperator(
task_id='run_tests',
python_callable=run_tests,
provide_context=True,
)
t2 = PythonOperator(
task_id='notify_wechat',
python_callable=notify_wechat,
provide_context=True,
)
t1 >> t2
3、控制台开启或关闭任务
执行结果:
注意事项:
1、DAG的定义需要在Python代码中完成,因此需要一定的Python编程能力。
2、Airflow的调度器使用了一种名为“最新优先调度”的策略,这可能会导致某些任务被延迟执行。
3、Airflow本身并不执行任务,而是生成任务的命令,并通过子进程或者远程的工作机器来执行。因此,你需要确保执行任务所需的所有依赖项(例如Python库、系统命令等)都在运行任务的环境中可用。
4、Airflow默认使用SequentialExecutor来执行任务,这意味着所有的任务都会在同一个进程中顺序执行。如果你需要并行执行多个任务,你需要配置一个其他的执行器,例如LocalExecutor或CeleryExecutor。
5、Airflow的Web界面可以提供很多有用的信息,但是它并不适合用来进行复杂的操作,例如修改DAG或任务的定义。所有的这些操作都应该在Python代码中完成。
6、对于大规模的工作流,Airflow可能会消耗大量的资源。在这种情况下,你需要考虑如何优化你的DAG,或者使用更强大的硬件来运行Airflow。
感受:Airflow 的一个关键特性是它的编程模型,这使得工作流可以作为代码来编写和管理,从而使得任务的复杂逻辑更易于理解和维护。此外,Airflow 还具有强大的调度和监控功能,使得你可以轻松地调度任务、监控任务运行状态,并在任务失败时接收警报。