从第一次接触airflow到生产投产使用已经有近两个月的时间了,从部署到开发到运维调优,期间也遇到各种各样的问题,自己也从听说到熟悉。这篇博客主要从三个方面着手。
一、安装部署airflow
调度工具airflow安装使用
一、安装airflow
1.环境准备:
1.1.安装mysql数据库
解压 mariadb包:
tar -xzvf mariadb-10.2.14-linux-x86_64.tar.gz
cd mariadb-10.2.14-linux-x86_64
配置mysql:
根据实际需求修改my.cnf配置文件。
启动mysql:
初始化mysql数据库:scripts/mysql_install_db
启动mysql:nohup bin/mysqld --defaults-file=my.cnf &
重置mysql root密码:
bin/mysqladmin -u root password “123456”
bin/mysql -u root -p
输入密码即可登录
1.2.创建airflow数据库及用户
建库:
mysql> create database airflow;
建用户:
mysql> create user ‘airflow’@’%’ identified by ‘airflow’;
mysql> create user ‘airflow’@‘local-ip’ identified by ‘airflow’;
mysql> create user ‘airflow’@‘localhost’ identified by ‘airflow’;
用户授权:
mysql> grant all on airflow.* to ‘airflow’@’%’;
mysql> flush privileges;
添加配置my.cnf (否则airflow initdb时报错)
[mysqld]
explicit_defaults_for_timestamp = 1
若修改配置文件后需重启mysql服务。
2. airflow单节点部署
2.1.设置环境变量
vi .bash_profile
export AIRFLOW_HOME=KaTeX parse error: Expected 'EOF', got '#' at position 97: …all python-pip #̲ 系统级安装有pip命令 …HOME/.local
make
make install
本机账户下安装pip:加粗样式
python get-pip.py --user # 生成pip到本机账户的.local下
cat path.propertiesexport PATH= H O M E / . l o c a l / b i n : HOME/.local/bin: HOME/.local/bin:PATH
source path.properties # 生效pip环境
本机账户下安装airflow:
pip install apache-airflow --user
提前预编译包内安装airflow的相关扩展插件 – eg:async、celery、hdfs、hive、jdbc、mysql、password、rabbitmq、redis、ssh
vi requirements.txt
apache-airflow[async]
apache-airflow[celery]
apache-airflow[crypto]
apache-airflow[hdfs]
apache-airflow[hive]
apache-airflow[jdbc]
apache-airflow[kubernetes]
apache-airflow[ldap]
apache-airflow[mysql]
apache-airflow[oracle]
apache-airflow[password]
apache-airflow[postgres]
apache-airflow[rabbitmq]
apache-airflow[redis]
apache-airflow[ssh]
hdfs # 安装该插件,后续hdfs_hook引入报错的解决办法
paramiko
mysqlclient
之后运行pip安装:
pip install -r requirements.txt
2.3.初始化airflow
初始化airflow配置:
KaTeX parse error: Expected 'EOF', got '#' at position 26: …l/bin/airflow #̲ 生成相关配置到AIRFLOW…AIRFLOW_HOME/airflow.cfg:
sql_alchemy_conn = mysql://airflow:airflow@localhost:3306/airflow
# 格式:mysql://账号:密码@ip:port/dbname
初始化db:
新建airflow依赖的表到mysql数据库:
./airflow initdb
2.4.Airlow的其他配置
2.4.1.修改时区
airflow默认时间是GMT时间,更改其为北京时间。
修改airflow.cfg文件:
#default_timezone = utc
default_timezone = Asia/Shanghai
注:此处修改的是schedule调度时间,即编写调度时间时可直接写北京时间。
修改webserver界面右上角当前时间:
修改底层代码:
vim ~/.local/lib/python2.7/site-packages/airflow/www/templates/admin/master.html
x = new Date()
把代码 var UTCseconds = (x.getTime() + x.getTimezoneOffset()601000); // 将系统时间转为GMT时间
改为 var UTCseconds = x.getTime(); // 直接取系统时间,不做时区转换
把代码 “timeFormat”:“H:i:s %UTC%”,
改为 “timeFormat”:“H:i:s”,
vim ~/.local/lib/python2.7/site-packages/airflow/utils/timezone.py
a)在utc = pendulum.timezone(‘UTC’)行代码下添加:
from airflow import configuration as conf
try:
tz = conf.conf.get("core", "default_timezone")
if tz == "system":
utc = pendulum.local_timezone()
else:
utc = pendulum.timezone(tz)
except Exception:
pass
b)修改utcnow()函数:
原代码:#d = dt.datetime.utcnow()
修改为:d = dt.datetime.now() # lww-change
vim /home/lww/.local/lib/python2.7/site-packages/airflow/utils/sqlalchemy.py
在utc = pendulum.timezone(‘UTC’)行代码下添加:
from airflow import configuration as conf
try:
tz = conf.conf.get("core", "default_timezone")
if tz == "system":
utc = pendulum.local_timezone()
else:
utc = pendulum.timezone(tz)
except Exception:
pass
注意:
若之前已启动webserver,修改时区操作后需重启webserver,此处还未启动,可查看后续启动方式。
2.4.2.用户认证
上面步骤中已安装password组件:pip install ‘apache-airflow[password]’
修改airflow.cfg:
[cli]
endpoint_url = http://192.168.1.2:8088 # 修改默认端口8080为8088
[api]
# How to authenticate users of the API
auth_backend = airflow.api.auth.backend.default
[webserver]
base_url = http://192.168.1.2:8088
web_server_port = 8088
authenticate = True
auth_backend = airflow.contrib.auth.backends.password_auth # 新增配置,不同于api下的auth_backend
在python环境中执行如下代码以添加账户:
[email protected]:~/airflow$ python
Python 2.7.15+ (default, Oct 7 2019, 17:39:04)
[GCC 7.4.0] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import airflow
[2019-11-11 16:46:12,008] {settings.py:252} INFO - settings.configure_orm(): Using pool settings. pool_size=5, max_overflow=10, pool_recycle=1800, pid=28668
>>> from airflow import models, settings
>>> from airflow.contrib.auth.backends.password_auth import PasswordUser
>>> user = PasswordUser(models.User())
>>> user.username = ‘admin’
>>> user.password=‘123456’
>>> user.superuser = True # 添加superuser账户
>>> session=settings.Session()
>>> session.add(user)
>>> session.commit()
>>> session.close()
>>> exit()
2.4.3.配置邮件服务(可选)
修改airflow.cfg:
[smtp]
smtp_host = smtp.163.com
smtp_password = password
smtp_starttls = True
smtp_ssl = False
smtp_port = 25
smtp_mail_from = [email protected]
2.4.4.设置Executor
修改airflow.cfg:
executor = LocalExecutor # 本地模式
#单节点故配置为LocalExecutor模式
上面使用LocalExecutor是实现本机的调度测试,实际生产环境中需进行远程调度,相关调度配置参数说明如下:
2.4.5.修改log地址
修改vim airflow.cfg
[core]
base_log_folder = $HOME/airflow/logs
[scheduler]
child_process_log_directory = $HOME/airflow/logs/scheduler
2.4.6.修改webserver地址
[webserver]
base_url = http://192.168.1.2:8088
2.4.7.修改scheduler线程数
若调度任务不多的话可把线程数调小,默认为32,参数parallelism:
#parallelism = 32
parallelism = 8
2.4.8.不加载example dag
若不想加载示例dag可将load_examples配置为False,默认为True。此配置只在第一次启动airflow之前设置才有效:
load_examples = True
#load_examples = False
若此方法未生效,可删除~/.local/lib/python2.7/site-packages/airflow/example_dags目录,效果一样。
注:测试中为便于学习,此处加载示例dag
2.4.9.修改检测新dag的间隔
#min_file_process_interval = 0 # 默认0没有时间间隔,此时CPU负载会很高
min_file_process_interval=10 # 每10s识别一次新的dag
2.5.启动airflow
启动schedule:
nohup airflow scheduler >/dev/null 2>&1 &
启动webserver:
nohup airflow webserver -p 8088 >/dev/null 2>&1 &
页面端访问:
http://192.168.1.2:8088
登录用户:admin
登录密码:123456
3.分布式部署
架构图
1、配置服务器之间免密
操作步骤:
1.A,B,C三台主机分别执行 ssh-keygen -t rsa 在 /root/.ssh目录下生产id_rsa和id_rsa.pub,即私钥 和公钥。
2.将A、B、C三台主机/root/.ssh目录下的id_rsa.pub文件传送至另外两台主机的home目录下,即:
ssh-copy-id [email protected]
主机 服务 安装软件
10.136.1.94 Webserver、scheduler、worker、scheduler-failover Mariadb、airflow
10.136.1.83 Webserver、worker、flower Airflow、redis
10.136.1.44 Scheduler、scheduler-failover、worker Nginx、airflow
2、master与worker服务器上所需要的配置
依据单节点部署步骤在A机器安装,然后复制到B、C两机器
在B主机上下载,解压缩和编译Redis-4.0.3:
$ wget http://download.redis.io/releases/redis-4.0.3.tar.gz
$ tar xzf redis-4.0.3.tar.gz
$ cd redis-4.0.3
$ make && make install
2.3、redis配置认证密码,通过配置文件进行配置
redis配置文件redis.conf中,打开配置文件找到
#requirepass foobared
去掉行前的注释,并修改密码为所需的密码,保存文件
requirepass youpwd
重启redis完成
src/redis-server redis.conf
2.4、远程访问
1)修改redis.conf
注释掉#bind 127.0.0.1
修改protected-mode no
2)关闭防火墙, systemctl stop firewalld.service 查看防火墙状态 firewall-cmd --state(不建议使用)
我们只需打开6379端口就行:
sudo firewall-cmd --permanent --zone=public --add-port=6379/tcp
sudo firewall-cmd --reload
2.5、master和worker都要修改airflow的配置文件vim airflow.cfg,修改一个文件就行,因为服务器免密,直接传给其他服务器,主从服务器应保持airflow的路径、dags下的脚本、配置文件一致,下面是配置文件需要修改的内容:
executor = CeleryExecutor
sql_alchemy_conn = mysql://airflow2:[email protected]:3306/airflow2broker_url = redis://hadoop102:6379/0
result_backend = redis://hadoop102:6379/1
2.6、master和worker都安装airflow、python3.5.2以及Python的celery和redis包
python3 -m pip install celery -i https://pypi.douban.com/simple
python3 -m pip install redis -i https://pypi.douban.com/simple
2.7下载 failover
Git clone https://github.com/teamclairvoyant/airflow-scheduler-failover-controller
使用 pip 进行安装
cd{AIRFLOW_FAILOVER_CONTROLLER_HOME}
Pip install -e .
初始化 failover
scheduler_failover_controller init
注:初始化时,会向airflow.cfg中追加内容,因此需要先安装 airflow 并初始化。
更改 failover 配置
scheduler_nodes_in_cluster= 10.136.1.94,10.136.1.44
注:host name 可以通过scheduler_failover_controller get_current_host命令获得
配置安装 failover 的机器之间的免密登录,配置完成后,可以使用如下命令进行验证:
scheduler_failover_controller test_connection
启动 failover
scheduler_failover_controller start
2、启动airflow
A节点执行
$ airflow initdb
$ airflow webserver
$ airflow scheduler
B节点执行
$ airflow webserver
C节点执行
$ airflow scheduler
$ airflow worker