主机 | webserver | scheduler | worker | flower |
---|---|---|---|---|
airflow08 | ✅ | ✅ | ✅ | ✅ |
airflow09 | ❌ | ❌ | ✅ | ❌ |
airflow10 | ❌ | ❌ | ✅ | ❌ |
首先通过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/
为了后期可以方便进行移植拓展,可以进行配置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
在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}
目录下)
检查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
才能正常连接成功
修改${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
修改 ${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
# web ui 界面使用的时区
default_ui_timezone=Asia/Shanghai
# 是否加载案例demo
load_examples = False
# 是否使用catchup功能
# catchup叫追赶, 即是否执行自上次execute_date以来所有未执行的DAG Run, 另外定义每个DAG对象可传递catchup参数进行覆盖
catchup_by_default = False
执行如下命令成功后, 查看数据库airflow下是否生成各个表
airflow db init
[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_date和schedule_interval两个参数去生成每个DAG RUN的时间点, 时间到了就会触发执行。
tips
:
airflow 系统在运行时有许多守护进程,它们提供了 airflow 的全部功能。守护进程包括 Web服务器-webserver、调度程序-scheduler、执行单元-worker、消息队列监控工具-Flower等。下面是 apache-airflow 集群、高可用部署的主要守护进程。
webserver 是一个守护进程,它接受 HTTP 请求,允许您通过 Python Flask Web 应用程序与 airflow 进行交互,webserver 提供以下功能:
webserver 守护进程使用 gunicorn 服务器(相当于 java 中的 tomcat )处理并发请求,可通过修改{AIRFLOW_HOME}/airflow.cfg文件中 workers 的值来控制处理并发请求的进程数。 例如:
workers = 4 #表示开启4个gunicorn worker(进程)处理web请求
启动 webserver 守护进程:
$ airfow webserver -D
scheduler 是一个守护进程,它周期性地轮询任务的调度计划,以确定是否触发任务执行。 启动的 scheduler 守护进程:
$ airfow scheduler -D
worker 是一个守护进程,它启动 1 个或多个 Celery 的任务队列,负责执行具体 的 DAG 任务。
当设置 airflow 的 executors 设置为 CeleryExecutor 时才需要开启 worker 守护进程。推荐您在生产环境使用 CeleryExecutor :
executor = CeleryExecutor
启动一个 worker守护进程,默认的队列名为 default:
$ airfow worker -D
flower 是一个守护进程,用于是监控 celery 消息队列。启动守护进程命令如下:
$ airflow flower -D
默认的端口为 5555,您可以在浏览器地址栏中输入 “http://hostip:5555” 来访问 flower ,对 celery 消息队列进行监控。
# 换版本
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冲突的问题,导致安装不上
airflow 的安装部署与填坑
如何部署一个健壮的 apache-airflow 调度系统
Airflow2.0.0 + Celery 集群搭建
airflow 安装,部署,填坑
Centos7安装部署Airflow详解
Airflow配置和使用