服务器环境介绍:
框架介绍:
Celery 是分布式任务队列,与调度工具 airflow 强强联合,可实现复杂的分布式任务调度,这就是CeleryExecutor。
Celery 需要一个发送和接受消息的传输者 broker。RabbitMQ 和 Redis 是官方推荐的生产环境级别的 broker,我们选择Redis。
MySQL:后端数据库
CeleryExecutor:执行器
Redis:Message broker,消息中间件
说明:
/data/projects/code
:存储各个项目。
/data/projects/airflow_config
:存储airflow相关的文件。
登陆服务器切换到root
用户,然后新建目录用于存放Python项目代码:
sudo bash
mkdir /data/projects/code
新建airflow的用户并修改文件权限``:
# 新建
adduser af_user
# 修改该用户对logs文件、代码文件目录的权限:
chown af_user:af_user /data/projects
新建目录:
mkdir -p /data/projects/airflow_config
mkdir -p /data/projects/code
miniconda就够用了。
1、下载
root
用户下,下载anaconda安装包:
a.打开 anaconda清华镜像源
b.选择linux-x86的一个版本,右键拷贝链接地址。
c.下载:例如,
cd /data
# wget url
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
如果连接超时,看是否是因为禁止访问外网。
如果下载特别慢,那就本地下载后上传包至服务器。
2、安装anaconda
a.安装
#sh [安装包名]
sh Miniconda3-latest-Linux-x86_64.sh
注意:安装过程中,会提示安装目录,修改一下,选择 /data/anaconda3
作为安装目录(必须是一个不存在的目录)。
b.确保添加了环境变量:vim /etc/profile
,如果没有,则末尾一行添加:export PATH="/data/anaconda3/bin:$PATH"
1、创建环境,root
用户下:
conda create -n airflow-py36 python=3.6
2、切换到新建的af_user
用户:
su -l af_user
3、初始化anaconda:conda init
,如果前面没有在/etc/profile
添加anaconda的PATH,那就得这样:/data/anaconda3/bin/conda init
4、激活刚刚创建的py环境并安装包:
# 激活环境
conda activate airflow-py36
# 看下当前的pip是否正确:应该输出的是 airflow-py36下的bin/pip
which pip
安装所需的包:按需安装吧。
pip install apache-airflow
pip install 'apache-airflow[async]'
pip install 'apache-airflow[celery]'
pip install 'apache-airflow[redis]'
pip install pymysql # 报错的话 需apt-get install libmysqlclient-dev
pip install mysqlclient
pip install flask_bcrypt # 安这个是因为后面initdb时报缺少包的错误
airflow被安装到了/home/af_user/.local/
下。
另外,如果pip安装特别慢的话,需要配置pip源,即 在~/
新建 .pip/pip.conf
文件:
cd ~
mkdir -pv .pip
vim ~/.pip/pip.conf
可以配置阿里云镜像源,或其他的镜像源:
[global]
index-url=http://mirrors.cloud.aliyuncs.com/pypi/simple/
[list]
format=columns
[install]
trusted-host=mirrors.cloud.aliyuncs.com
5、添加环境变量
由root
用户切换到af_user
并编辑.bashrc
文件
su -l af_user
vim ~/.bashrc
export AIRFLOW_HOME="/data/projects/airflow_config"
export PYTHONPATH="/data/projects/code/[YOUR_PYHTON_PROJECT_NAME]:$PYTHONPATH"
export PATH="/data/anaconda3/envs/air-py36/bin:$PATH"
其中,
a. export
第一行,若不指定AIRFLOW_HOME,则默认是 ~/airflow
,为了方便管理可以修改为我们最开始指定的路径,这样在后面运行airflow时会在$AIRFLOW_HOME
下生成airflow.cfg
文件以及logs等目录。
b. export
第二行,Python搜索路径,默认我们import
的模块都会从PYTHONPATH
里面寻找,这里可以把项目路径添加进来。
c.export
第三行,添加airflow的python路径。
注意:~/.bashrc 文件只对当前用户生效。
执行airflow就会初始化:airflow
发现在$AIRFLOW_HOME
下新增了几个文件和目录。
第一次运行airflow时,它会在$AIRFLOW_HOME
目录中创建一个名为airflow.cfg的配置文件。
文件的各项参数解释见:https://www.cnblogs.com/skyrim/p/7456166.html
下面列举需要修改的参数:
[core]
dags_folder
:dag python文件目录,需要修改,指定到python里专门存放dag文件的目录例如 /data/projects/code/[YOUR_PYTHON_PROJECT_NAME]/dags
。base_log_folder
:主日志目录,默认是$AIRFLOW_HOME/logs
,存储dag里的task执行日志存储目录。child_process_log_directory
:scheduler的日志文件存储路径,默认是$AIRFLOW_HOME/logs/scheduler
,例如 /data/projects/airflow_config/logs/scheduler
dag_processor_manager_log_location
:默认是$AIRFLOW_HOME/logs/dag_processor_manager/dag_processor_manager.log
plugins_folder
:默认是 $AIRFLOW_HOME下/plugins
,例如/data/work/airflow_config/plugins
。default_timezone
:时区,默认是UTC,需要修改为 Asia/Shanghai
。executor
: CeleryExecutor
# airflow后端数据库地址,数据库需提前建好.
sql_alchemy_conn = mysql+mysqldb://[your_db_user_name]:[your_db_pwd]@[your_mysql_host_address]:[port]/[your_schema_name]
# 编码,如果上面的conn结尾指定了 添加了?charset=utf8mb4,则需注释掉 sql_engine_encoding。
sql_engine_encoding = utf-8
dags_are_paused_at_creation
:dag在创建以后是否是暂停状态,改为False
,这样新建dag提交后会打开,省去麻烦。[webserver]
base_url = http://[xx.xx.xx.xx]:8080
web_server_host = [IP]
web_server_port = [port]
authenticate = True
auth_backend = airflow.contrib.auth.backends.password_auth
[smtp]
12.
smtp_host = smtp.exmail.qq.com
smtp_starttls = False
smtp_ssl = True
# Example: smtp_user = airflow
smtp_user = [xxxxx]@[公司域名]
# Example: smtp_password = airflow
smtp_password = [PWD]
smtp_port = 465
smtp_mail_from = [xxxxx]@[公司域名]
[celery]
13.
broker_url = redis://:[pwd_redis]@[redis_host_adddress]:[port]/[db编号不能重复]
result_backend = redis://:[pwd_redis]@[redis_host_adddress]:[port]/[db编号不能重复]
airflow inintdb
如果提示缺少MySQLdb模块,则 pip install mysqlclient
。安好后再次初始化。
可能提示缺少
记住:如果初始化过一次,那么最好把后端数据库先清空,然后再初始化。不然可能会和我一样,初始化以及启动web server、sheduler时遇到各种后端数据库表 column notfound的问题,血坑啊……
设置web server的用户名和密码:
https://airflow.apache.org/docs/stable/security.html
切换root用户:sudo bash
激活airflow的python环境: conda activate airflow-py36
进入pythonj交互:pyhton
开始新建用户。代码参考。
import airflow
from airflow import models, settings
from airflow.contrib.auth.backends.password_auth import PasswordUser
user = PasswordUser(models.User())
user.username = 'YOUR_WEB_USER_NAME'
user.password = 'YOUR_WEB_USER_PWD'
session = settings.Session()
session.add(user)
session.commit()
session.close()
exit()
假如在import airflow时 有报缺少包的错误,就一一安装。
在af_user
下,激活airlfow的python环境:conda activate airflow-py36
在af_user
用户下分别执行:
airflow webserver
airflow scheduler
airflow worker
启动webserver后:在浏览器打开url,输入用户名和密码,
OK,就到这里了。
以后有时间介绍下通过tmux
启动airlfow服务,这样即使关闭了与服务器的ssh连接,airflow的服务也会正常运行,不会被打断。
感兴趣的可以参考这篇自学tmux
:tmux的使用方法
airflow中文文档
官网(新建web 用户名&添加密码)
Celery-简书
airflow 配置 CeleryExecutor
Airflow安装
使用Celery扩大规模
airflow + CeleryExecutor 环境搭建
AirFlow使用指南一 安装与启动