任务编排和调度神器:Apache Airflow

简介:Apache Airflow是一个开源的工作流调度系统,由Airbnb创建,并于2015年开源。它使用Python编写,可以用来创建、调度和监控工作流。Airflow的工作流是由一系列的任务组成,这些任务按照依赖关系形成有向无环图(DAG)。Airflow的精髓在于其灵活性和可扩展性。使用Python代码定义工作流,使得工作流可以像普通的程序那样进行版本控制、测试和重构。同时,Airflow支持各种任务类型,包括但不限于bash命令、Python函数、SQL查询,也可以通过插件机制支持更多类型的任务和系统。

作用:主要用于数据处理的工作流管理。例如,你可以使用Airflow来定义和调度一个ETL工作流,这个工作流从多个数据源提取数据,将数据进行清洗和转换,然后将数据加载到数据仓库中。除此之外,Airflow也可以用于机器学习的工作流,自动化测试,基础设施的管理等。

工作流程:在Airflow中,工作流被定义为DAG(有向无环图)。每一个DAG由多个任务(Task)组成,每个任务都是一个可独立运行的工作单元,任务之间可以设定依赖关系。Airflow的调度器会按照DAG的结构和任务的依赖关系,自动调度和运行任务。

历史攻略:

flask+apscheduler+企业微信消息机器人推送

Python:Celery+Redis实现定时任务

Python:Celery+Redis+Flower安装和使用

Python + Jenkins + Selenium-Grid实现分布式web-ui自动化测试(centos+win10为例)

GitLab+GitLabRunner+Docker+Dockerfile+docker-compose+Flask持续集成部署

centos7.6:安装python、miniconda

环境安装

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 还具有强大的调度和监控功能,使得你可以轻松地调度任务、监控任务运行状态,并在任务失败时接收警报。

图片

猜你喜欢

转载自blog.csdn.net/hzblucky1314/article/details/130664604