Airflow | 脚本东零西散?Airflow 快速搭建 pipeline(超详细)

原创声明

本文为 HinGwenWoong 原创,如果这篇文章对您有帮助,欢迎转载,转载请阅读文末的【授权须知】,感谢您对 HinGwenWoong 文章的认可!


前言

我们平常在生成数据集的时候,通常多有有好几个步骤,而且每个步骤都需要进行一些必要参数的配置,通常情况下是几个函数写到一个main方法中直接调用,但是需要直接使用 SSH 链接 -> 切换路径 -> 进入虚拟环境 -> 执行,这样虽然可行,但是都是重复的工作。

我们可以使用 Airflow 对任务进行编排,还可以设定执行的时间,具体执行的任务,而且可以使用其可视化界面清除看到执行到哪一步还有其输出的 log,这样大大增强了对任务的监控,下面,就让我带大家一起去搭建 Airflow 的环境吧。

我是 HinGwenWoong,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!


什么是 Airflow

Airflow 是一个以编程方式创作、安排和监控工作流的平台。

使用 Airflow 将工作流创作为任务的有向无环图 (DAG)。 Airflow scheduler在遵循指定的依赖关系的同时,在多个Worker上执行任务。丰富的命令行实用程序使在 DAG 上执行复杂的步骤变得轻而易举。丰富的用户界面使可视化生产中运行的 pipeline、监控进度和在需要时解决问题变得容易。

当工作流被定义为代码时,它们变得更加可维护、可版本化、可测试和协作。


一、部署

本章会阐述两种方式

  • 本地部署(生产推荐)
  • Docker 部署(测试推荐)

本地部署(生产推荐)

本地部署有两个工具需要部署

  • 数据库,我选用了 MySQL
  • Airflow 本体部署

1) 数据库安装 :

  1. 下载 MySQL 安装包 ,这里使用的是 5.7.x
    wget -i -c \
    http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
    
  2. 安装
    yum -y install mysql57-community-release-el7-10.noarch.rpm && \
    yum -y install mysql-community-server
    
  3. 启动 MySQL 服务
    systemctl start  mysqld.service
    
  4. 查看 MySQL 服务状态
    systemctl status mysqld.service
    
  5. 查看初始密码
    grep "password" /var/log/mysqld.log
    
  6. 使用其登录 MySQL数据库
    mysql -uroot -p
    
  7. 重置密码
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
    

2) Airflow 本体部署

  1. 使用 pip 安装

    AIRFLOW_VERSION=2.1.1
    PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
    CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
    pip install "apache-airflow[async,virtualenv,docker,mysql,kubernetes]==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}" -i https://pypi.tuna.tsinghua.edu.cn/simple --ignore-installed
    

    注意:具体的额外包,使用 Reference for package extras 查阅

  2. 查看 Airflow 数据库链接

    airflow config get-value core sql_alchemy_conn
    
  3. 进入 MySQL 建立数据库 :

    mysql -u root -p
    
  4. 创建表

    CREATE DATABASE airflow_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    CREATE USER 'airflow_user' IDENTIFIED BY 'airflow_pass';
    GRANT ALL PRIVILEGES ON airflow_db.* TO 'airflow_user';
    
  5. 打开 Airflow 的配置文件 airflow.cfg,切换 Airflow 为 MySQL :

    vim ~/ariflow/airflow.cfg
    

    sql_alchemy_conn 后面加入数据库的地址在这里插入图片描述
    注意:后面的 ?charset=utf8 一定要加上,要不然会出现 UnicodeEncodeError: 'charmap' codec can't encode characters in position 36-38: character maps to <undefined>

  6. 修改 MySQL 配置 my.cnf

    mysql --help | grep my.cnf
    sudo vim /etc/my.cnf
    

    可以查看到 my.cnf 的路径
    在这里插入图片描述
    在配置文件中加入 explicit_defaults_for_timestamp=true注意位置不要写错
    在这里插入图片描述

  7. 修改时区为 Asia/Shanghai 在这里插入图片描述

  8. 加入配置 sql_engine_collation_for_ids = utf8mb3_general_ci
    在这里插入图片描述

  9. 执行数据库初始化

    airflow db init
    

    如果没出现报错的话,证明成功!
    在这里插入图片描述

  10. 创建用户

    airflow users create \
    --username admin \
    --firstname HinGwen \
    --lastname Woong \
    --role Admin \
    --email peterhuang0323@@qq.com
    

    之后会提示输入密码,输入之后即可创建好用户

  11. 后台启动 Airflow 服务

    airflow webserver --port 8080 -D
    airflow scheduler -D
    
  12. 登录 localhost:8080 ,输入 10 中的用户名和密码,即可
    在这里插入图片描述

本地部署可能出现的问题及其解决方法

  1. 使用 pip 安装 Airflow 的时候出现: OSError: mysql_config not found
    在这里插入图片描述
    解决方法:

    sudo yum install -y mysql-devel gcc gcc-devel python3-devel
    
  2. 使用 pip 安装 Airflow 的时候出现:ERROR: Cannot uninstall 'PyYAML'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
    在这里插入图片描述
    解决方法:
    加入 --ignore-installed

    sudo pip3 install "apache-airflow[async,virtualenv,docker,mysql,kubernetes]==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}" -i https://pypi.tuna.tsinghua.edu.cn/simple --ignore-installed
    
  3. 在 Airflow 初始化数据库的时候出现: UnicodeEncodeError: 'charmap' codec can't encode characters in position 36-38: character maps to <undefined>
    在这里插入图片描述
    解决方法:
    在数据库 URL 后面加上 ?charset=utf8 在这里插入图片描述
    解决方法:第5

  4. 在 Airflow 初始化数据库的时候出现:Exception: Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql
    在这里插入图片描述
    解决方法:第6

  5. 在 Airflow 初始化数据库的时候出现:sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1071, 'Specified key was too long; max key length is 3072 bytes')
    在这里插入图片描述
    解决方法:第8

  6. 在跑 Dags 的时候,进入 Log 显示 Log file does not exist
    在这里插入图片描述
    解决方法:将 executor 配置成 LocalExecutor
    在这里插入图片描述

Docker 部署(测试推荐)

这里使用的是:Docker 方式进行搭建

官方文档:Running Airflow in Docker

  1. 安装 docker-composeInstall Docker Compose

    sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    docker-compose --version
    
  2. 拉取官方的 docker-compose 启动文件 docker-compose.yaml

    curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.1.0/docker-compose.yaml'
    

    该文件包含几个服务定义如下:
    1)airflow-scheduler: 调度器监视所有任务和DAG,然后在任务实例的依赖关系完成后触发它们。
    2)airflow-webserver: 提供网页可视化服务 http://localhost:8080
    3)airflow-worker: 执行调度程序给定任务的工作进程。
    4)airflow-init: 初始化服务。
    5)flower: 监测环境的 flower 应用程序。接口是:http://localhost:5555
    6)postgres: 数据库。
    7)redis: 将消息从调度程序转发到工作程序的 redis-broker。

  3. 初始化必备文件

    mkdir ./dags ./logs ./plugins
    echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env	
    
  4. 执行初始化

    docker-compose up airflow-init
    

    在这里插入图片描述
    待看到 start_airflow-init_1 exited with code 0 即为初始化成功:
    在这里插入图片描述

  5. 启动 ariflow 服务

    docker-compose up
    

    如果想使用后台启动

    docker-compose up -d
    
  6. 在另外的一个 shell 查看容器状态

    docker ps
    

    可以看到容器已经启动了

        CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                    PORTS                              NAMES
    247ebe6cf87a   apache/airflow:2.1.0   "/usr/bin/dumb-init …"   3 minutes ago    Up 3 minutes (healthy)    8080/tcp                           compose_airflow-worker_1
    ed9b09fc84b1   apache/airflow:2.1.0   "/usr/bin/dumb-init …"   3 minutes ago    Up 3 minutes (healthy)    8080/tcp                           compose_airflow-scheduler_1
    65ac1da2c219   apache/airflow:2.1.0   "/usr/bin/dumb-init …"   3 minutes ago    Up 3 minutes (healthy)    0.0.0.0:5555->5555/tcp, 8080/tcp   compose_flower_1
    7cb1fb603a98   apache/airflow:2.1.0   "/usr/bin/dumb-init …"   3 minutes ago    Up 3 minutes (healthy)    0.0.0.0:8080->8080/tcp             compose_airflow-webserver_1
    74f3bbe506eb   postgres:13            "docker-entrypoint.s…"   18 minutes ago   Up 17 minutes (healthy)   5432/tcp                           compose_postgres_1
    0bd6576d23cb   redis:latest           "docker-entrypoint.s…"   10 hours ago     Up 17 minutes (healthy)   0.0.0.0:6379->6379/tcp             compose_redis_1
    
  7. 使用浏览器登录到http://localhost:8080即可看到登录界面,初始化的用户名和密码都是 airflow
    在这里插入图片描述

二、运行 Dag

  1. 进入你的 dag 中,这里我选了官方提供的 example_bash_operator 作为演示
    在这里插入图片描述

  2. 开启 dag
    在这里插入图片描述
    这里需要注意的是,我们可以设置 dag 定时自己启动,具体的时间间隔可以看右上角:
    在这里插入图片描述

  3. 执行
    在这里插入图片描述
    如果需要传参,使用下面那个按钮
    在这里插入图片描述
    传入约定好的参数
    在这里插入图片描述
    代码中使用这种方法取值:

    example_key = '{{ dag_run.conf["example_key"] }}'
    
  4. 运行之后你就可以看到任务的运行状态了
    在这里插入图片描述
    步骤可视化图
    在这里插入图片描述
    事件日历视图
    在这里插入图片描述
    任务持续时间
    在这里插入图片描述
    甘特图
    在这里插入图片描述
    如果需要查看每个任务的 Log 以及执行的命令,先点击你需要查看的任务,然后点击 Log:
    在这里插入图片描述
    就可以看到其对应的 Log
    在这里插入图片描述
    您也可以看到每个任务执行的命令
    在这里插入图片描述


三、加入你的 dag

  1. 编写好你的 Dag 文件之后,放到 ~/airflow/dags (如果是 docker 部署的话,放到 ./dag )里面
  2. 在 Airflow 中进行重新登录
    在这里插入图片描述
  3. 刷新即可看到你自己的 Dag 任务了
  4. 如果还是看不到, 重启 Airflow 的所有服务即可
    docker-compose restart
    

总结

以上就是如何部署 Airflow 、如何运行 dag,以及如何加入您自己的 pipeline,希望能够祝您一臂之力。

我是 HinGwenWoong,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!


参考资料

[1] Running Airflow in Docker
[2] https://www.cnblogs.com/xuziyu/p/11696549.html
[3] https://blog.csdn.net/qq_36582604/article/details/80526287
[4] http://airflow.apache.org/docs/apache-airflow/stable/howto/set-up-database.html#database-uri


授权须知

  1. 原创文章在推送一天后才可进行转载
  2. 转载文章,禁止声明原创
  3. 不允许直接二次转载,转载请根据原文链接联系作者
  4. 若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
    但对于未注明转载来源/原文链接的文章,我将保留追述的权利。

    作者:HinGwenWoong
    一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,共同进步!
    CSDN: HinGwenWoong
    原文链接:Airflow | 脚本东零西散?Airflow 快速搭建 pipeline(超详细)

  5. 若需要修改文章的排版,请根据原文链接联系作者
  6. 再次感谢您的认可,转载请遵守如上转载须知!
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值