Airflow+celery集群部署、踩坑

本文详细介绍了在CentOS环境下,如何进行Airflow与Celery的集群部署,包括Python环境配置、虚拟环境创建、相关软件包安装、数据库配置、启动流程以及遇到的常见问题和解决方案。重点在于配置远程数据库、Celery的设置以及启动守护进程。

1.初始环境准备

主机webserverschedulerworkerflower
airflow08
airflow09
airflow10
1.1 python3安装

首先通过yum安装一些编译时所需的依赖包:

yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
yum install libffi-devel -y

下载

[root@airflow10 ~]# cd ~
[root@airflow10 ~]# wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
[root@airflow10 ~]# tar -zxvf Python-3.8.3.tgz

进入解压后的目录,按照以下步骤完成编译安装:

[root@airflow10 ~]# cd Python-3.8.3
[root@airflow10 ~]# ./configure --prefix=/usr/local/python3
[root@airflow10 ~]# make && make install

安装完成后,需要配置一下系统环境变量,以便使用Python的命令:

[root@airflow10 ~]# vim /etc/profile
PYTHON_HOME=/usr/local/python3
export PATH=$PATH:$PYTHON_HOME/bin
[root@airflow10 ~]# source /etc/profile

清理一下现在的python3软连接以及pip3软连接(可略过)

rm /usr/bin/python3
ln -s /usr/local/python/bin/python3.8 /usr/bin/python3
rm /usr/bin/pip3
ln -s /usr/local/python/bin/pip3 /usr/bin/pip3

最后验证版本:

[root@airflow10 bin]# pip3 --version
pip 19.2.3 from /usr/local/python3/lib/python3.8/site-packages/pip (python 3.8)
[root@airflow10 bin]# python3
Python 3.8.3 (default, Dec  6 2021, 11:30:12) 
[GCC 7.3.1 20180303 (Red Hat 7.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

更换pip国内源:

pip3 install xlrd -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

然后在用户的家目录下新建pip的配置文件,步骤如下:

cd ~
mkdir .pip
cd .pip/
vim pip.conf

写入pip.conf

[global]
index-url=http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com

最后记得把/usr/local/python3/目录的权限改一下

sudo chmod 775 -R /usr/local/python3/
1.2 python虚拟环境

为了后期可以方便进行移植拓展,可以进行配置python虚拟环境。

第一步:安装包

pip3 install virtualenv
pip3 install virtualenvwrapper

第二步, 创建一个文件夹,用于存放所有的虚拟环境:一般建议在home目录下(加.是隐形目录,可能不能直接看到)

例:

mkdir /home/sudouser/serve/python_venv

第三步,查找virtualenvwrapper所在的路径(记得加.sh要不然查到出来的路径不正确)

whereis virtualenvwrapper.sh
# 或
find / -name virtualenvwrapper.sh

第四步:最重要的一步,也就是编辑.bashrc配置文件,所在路径

vim /root/.bashrc

添加以下三句:

export WORKON_HOME=/home/sudouser/serve/python_venv
export VIRTUALENVWRAPPER_PYTHON=/usr/local/python3/bin/python3.8
source /usr/local/python3/bin/virtualenvwrapper.sh

第五步:

source /root/.bashrc

第六步:如果创建虚拟环境报错,

ERROR: virtualenvwrapper could not find /root/.local/lib/python3.7/site-packages/virtualenv in your path

find / -name virtualenv

则增加一个配置

export WORKON_HOME=/home/sudouser/serve/python_venv
export VIRTUALENVWRAPPER_PYTHON=/usr/local/python3/bin/python3.8
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/python3/bin/virtualenv
source /usr/local/python3/bin/virtualenvwrapper.sh

第七步:虚拟环境的使用

# 创建跟退出
# 创建新虚拟环境:mkvirtualenv 名称
# 例:
mkvirtualenv py3_dev
# 退出环境:
deactivate
# 如果想指定一个python3来运行的虚拟环境
mkvirtualenv 虚拟环境名 -p python路径
# 例:
mkvirtualenv 虚拟环境名 -p /usr/bin/python3
# 快速激活虚拟环境
workon 虚拟环境名称cd
# 例:
workon aw_venv
1.3 下载apache-airflow、celery、mysql、redis包

在3台机器上都要下载一次

pip3 install apache-airflow==2.0.0 
pip3 install apache-airflow[celery]
pip3 install apache-airflow[mysql]
pip3 install apache-airflow[reids]
pip3 install pymysql
pip3 install mysqlclient
# 或者只用下面这一条命令
pip install apache-airflow[all]

配置Airflow工作目录的环境变量

# 注意在此命令时是哪个用户
vim ~/.bashrc

添加如下

export AIRFLOW_HOME=/home/sudouser/serve/airflow

配置airflow命令

下载apache-airflow包后,在python环境的bin目录下会生成airflow命令, 需要自己配置到全局调用, 用软连接挂在到/usr/bin下

如:

[sudouser@airflow10 bin]$ pwd
/usr/local/python3/bin
# 创建软连接
[sudouser@airflow10 bin]$ ln -s /home/sudouser/serve/python_venv/airflow_python_venv/bin/airflow /usr/bin/airflow
[sudouser@airflow10 bin]$ cd /usr/bin/
[sudouser@airflow10 bin]$ ll | grep airflow
1 root root          64 Dec  6 16:55 airflow -> /home/sudouser/serve/python_venv/airflow_python_venv/bin/airflow

使用命令airflow --help看是否执行成功, 执行airflow的任何命令都会初始化airflow的工作目录的生成(在${AIRFLOW_HOME}目录下)

1.4 启动mysql,作为元数据库

检查mysql状态:

netstat -tulpn   #来查mysql是否在真的运行,查看3306端口是否存在,发现没有;
# 或
ps -elf | grep mysqld   #查询进程,发现没有mysqld_safe ,说明mysql没启动;

如果首次登陆不知道初始密码就去

vi /var/log/mysqld.log

搜索password

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YjTMNBmt-1638871826469)(/Users/wpc/Library/Application Support/typora-user-images/image-20211206172827446.png)]

如果为初始则设置密码:

set password for root@'%' = password('*****');

创建用户:

CREATE USER 'airflow_user'@'%' IDENTIFIED BY '*****';
# 赋权
GRANT ALL ON *.* TO 'airflow_user'@'%';
# 刷新
FLUSH PRIVILEGES;

启动之后设置mysql的my.cnf中的[mysqld]explicit_defaults_for_timestamp=1才能正常连接成功

2.配置

配置元数据库

修改${AIRFLOW_HOME}/airflow.cfg配置文件, 配置远程连接数据库的地址, 需要先创建一个叫airflow的数据库. 因为默认使用的是sqlite作为元数据库不支持DAG任务的并发执行、绝不能用于生产环境。

[core]
# 时区设置
default_timezone = Asia/Shanghai
# 数据库连接设置
sql_alchemy_conn = mysql+pymysql://airflow_user:*****@airflow10:3306/airflow?charset=utf8
# 数据库编码
sql_engine_encoding = utf-8
配置celery(这里务必小心,巨坑)

修改 ${AIRFLOW_HOME}/airflow.cfg配置文件, 配置celery和executor相关配置

# 设置执行策略、可选SequentialEXecutor(默认)、LocalExecutor(适合单机)、Celery Executor
executor = CeleryExecutor
# 配置celery的broker_url			(存储要执行的命令然后celery的worker去消费)
# broker_url = redis://airflow10:6379/0
broker_url = sqla+mysql://airflow_user:*****@airflow10:3306/airflow?charset=utf8
# 配置celery的result_backend  (存储任务执行状态)、 也可以用redis存储
result_backend = sqla+mysql://airflow_user:*****@airflow10:3306/airflow?charset=utf8
#result_backend = redis://127.0.0.1:6379/1
配置邮箱
[smtp]
# If you want airflow to send emails on retries, failure, and you want to use
# the airflow.utils.email.send_email_smtp function, you have to configure an
# smtp server here
smtp_host = smtp.exmail.qq.com
smtp_starttls = True
smtp_ssl = True
# Example: smtp_user = airflow
smtp_user = *****
# Example: smtp_password = airflow
smtp_password = *****
smtp_port = 465
smtp_mail_from = *****
smtp_timeout = 30
smtp_retry_limit = 5
其他airflow.cfg 配置(可选)
# web ui 界面使用的时区
default_ui_timezone=Asia/Shanghai
# 是否加载案例demo
load_examples = False
# 是否使用catchup功能
# catchup叫追赶, 即是否执行自上次execute_date以来所有未执行的DAG Run, 另外定义每个DAG对象可传递catchup参数进行覆盖
catchup_by_default = False

3.启动

初始化元数据库表生成

执行如下命令成功后, 查看数据库airflow下是否生成各个表

airflow db init

在这里插入图片描述

启动web server、scheduler、worker
  • 在airflow09上启动web server、scheduler、worker
  • 在airflow08和airflow10上启动worker
[root@airflow09 ~]$  airflow webserver --port 9988 -D # -D 参数以守护进程启动(以下均适用)
[root@airflow09 ~]$  airflow scheduler -D
[root@airflow09 ~]$  airflow celery worker -D # -q 可指定worker监听消费的队列,默认是default队列
[root@airflow08 ~]$  airflow celery worker -D 
[root@airflow10 ~]$  airflow celery worker -D

访问 airflow09:9988的web server 的UI界面

发现需要账号密码、创建一个即可.

[root@airflow09 ~]$ airflow users create \
    --username testuser \
    --firstname testuser \
    --lastname testuser \
    --role Admin \
    --email *****

之后在${AIRFLOW_HOME}/dags 编写自己的DAG任务即可, DAG文件名以包含dag或者airflow就会被scheduler去调度执行. 会根据 DAG对象的start_dateschedule_interval两个参数去生成每个DAG RUN的时间点, 时间到了就会触发执行。

tips:

4.Tips:airflow 的守护进程

airflow 系统在运行时有许多守护进程,它们提供了 airflow 的全部功能。守护进程包括 Web服务器-webserver、调度程序-scheduler、执行单元-worker、消息队列监控工具-Flower等。下面是 apache-airflow 集群、高可用部署的主要守护进程。

webserver

webserver 是一个守护进程,它接受 HTTP 请求,允许您通过 Python Flask Web 应用程序与 airflow 进行交互,webserver 提供以下功能:

  • 中止、恢复、触发任务。
  • 监控正在运行的任务,断点续跑任务。
  • 执行 ad-hoc 命令或 SQL 语句来查询任务的状态,日志等详细信息。
  • 配置连接,包括不限于数据库、ssh 的连接等。

webserver 守护进程使用 gunicorn 服务器(相当于 java 中的 tomcat )处理并发请求,可通过修改{AIRFLOW_HOME}/airflow.cfg文件中 workers 的值来控制处理并发请求的进程数。 例如:

workers = 4 #表示开启4个gunicorn worker(进程)处理web请求

启动 webserver 守护进程:

$ airfow webserver -D
scheduler

scheduler 是一个守护进程,它周期性地轮询任务的调度计划,以确定是否触发任务执行。 启动的 scheduler 守护进程:

$ airfow scheduler -D 
worker

worker 是一个守护进程,它启动 1 个或多个 Celery 的任务队列,负责执行具体 的 DAG 任务。

当设置 airflow 的 executors 设置为 CeleryExecutor 时才需要开启 worker 守护进程。推荐您在生产环境使用 CeleryExecutor :

executor = CeleryExecutor

启动一个 worker守护进程,默认的队列名为 default:

$ airfow worker -D 
flower

flower 是一个守护进程,用于是监控 celery 消息队列。启动守护进程命令如下:

$ airflow flower -D

默认的端口为 5555,您可以在浏览器地址栏中输入 “http://hostip:5555” 来访问 flower ,对 celery 消息队列进行监控。

5.遇到的问题:

  1. No module named wtforms.compat
# 换版本
pip install wtforms==2.3.3

2.entry_points() got an unexpected keyword argument ‘group’

# 换版本
pip install MarkDown==2.0.1

3.OSError: mysql_config not found

yum install mysql-devel
rpm -qa | grep mysql
rpm -e卸载mysql
# 可能会有mariaDB与mysql冲突的问题,导致安装不上

6.可参考文档

airflow 的安装部署与填坑

如何部署一个健壮的 apache-airflow 调度系统

Airflow2.0.0 + Celery 集群搭建

airflow 安装,部署,填坑

Centos7安装部署Airflow详解

Airflow配置和使用

### Airflow与RAGFlow的集成或对比 #### 关于Airflow Apache Airflow 是一种用于数据管道编排的强大工具,它通过有向无环图 (DAG) 来定义工作流中的任务及其依赖关系[^2]。Airflow 提供了一个灵活的任务调度机制以及丰富的插件生态系统,使得复杂的数据处理流程可以被轻松管理和自动化。 #### RAGFlow简介 RAGFlow 可能指代基于检索增强生成(Retrieval-Augmented Generation, RAG)的工作流框架或者类似的自定义实现方案。这种架构通常涉及从大量文档中提取相关信息并将其输入到生成模型中以创建上下文敏感的回答。虽然具体细节可能因项目而异,但其核心理念围绕着高效的信息检索和自然语言生成技术展开[^1]。 #### 集成可能性分析 如果考虑将 Apache Airflow 和 RAGFlow 进行集成,则主要目标可能是利用前者强大的任务协调能力来优化后者内部各阶段操作之间的衔接效率。例如,在构建土壤科学期刊摘要自动获取系统时,可以通过设置一系列按顺序执行的操作节点——包括但不限于网络爬取最新文章链接、解析HTML内容、存储至数据库以及最终调用机器学习算法生成简洁概述等环节——借助 Airflow 实现全流程监控与错误恢复功能[^3]。 另一方面,假设存在名为 “RagFlow” 的专用软件包专门服务于某些特定领域内的文本挖掘需求,则此时两者之间更倾向于形成互补合作关系而非单纯意义上的替代选项。在这种情况下,重点应放在如何让二者优势相互补充上:即由 RagFlow 负责完成高精度语义理解方面的计算密集型子任务;与此同时依靠 Airflow 组织好这些耗时较长且彼此关联紧密的小单元活动的整体进度安排情况。 #### 对比维度探讨 当把注意力转向比较两者的差异之处时,可以从以下几个方面入手: - **设计目的** 如前所述,Airflow 主要定位于解决大规模分布式环境下的ETL过程管理难题;相比之下,“假想”的RAGFlow则更加专注于提升问答系统的响应质量和服务水平。 - **适用场景** 前者适用于任何需要周期性运行批量脚本的企业级应用场合;而后者的典型应用场景或许集中在科研辅助决策支持平台建设等领域内。 - **扩展性和灵活性** 尽管两种解决方案都强调模块化设计理念以便日后维护升级方便快捷,但从长远来看,由于开源社区活跃度较高加上第三方库资源丰富等因素影响下,Airflow 在这方面显然占据一定领先地位。 ```python from airflow import DAG from datetime import timedelta, datetime from airflow.providers.google.cloud.operators.bigquery import BigQueryInsertJobOperator default_args = { 'owner': 'airflow', 'depends_on_past': False, 'email_on_failure': False, 'email_on_retry': False, 'retries': 1, 'retry_delay': timedelta(minutes=5), } with DAG( dag_id='example_bigquery_dag', default_args=default_args, description='A simple tutorial DAG', schedule_interval=timedelta(days=1), start_date=datetime(2022, 1, 1), catchup=False, ) as dag: run_query = BigQueryInsertJobOperator( task_id="run_query", configuration={ "query": { "query": """SELECT * FROM `project.dataset.table` LIMIT 10""", "useLegacySql": False, } }, ) ``` 上述代码片段展示了如何使用 Airflow 创建一个简单的 ETL 流程实例,其中包含了查询 Google BigQuery 数据表的部分逻辑。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值