Airflow+celery集群部署、踩坑

1.初始环境准备

主机 webserver scheduler worker flower
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:

  • start_date和schedule_interval 两个参数去配置定时的周期可不是从字面上看上那么简单.
  • 见 Airflow 官方文档 FAQ
  • 见 Airflow 官方文档 DAG RUN

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配置和使用

你可能感兴趣的:(学习笔记,bash,linux,centos)