真的是想不通,Airflow不论社区活跃度还是Github的star数都是远胜于Azkaban还有EasyScheduler的,但是为何却连一个完备的安装教程都没有呢?是我的需求太高?真的是心累不已,整整把搜索引擎还有youtube翻来覆去也没让我感到满足……不过好在,一步一坑一脚印的最终搭建连通好了环境以及Operator。好了,废话不多说,开始Airflow今日份安装教程。
安装工具 | 版本 | 用途 |
---|---|---|
Python | 3.6.5 | 安装airflow及其依赖包、开发airflow的dag使用 |
MySQL | 5.7 | 作为airflow的元数据库 |
Airflow | 1.10.0 | 任务调度平台 |
请选择一台干净的物理机或者云主机。不然,产生任何多余影响或者后果,本人概不负责!
Python3的安装可以参考我之前的文章,在此不再敖述
3年前也写过一个关于Centos安装MySQL的教程,但是虽然实用,但是内容太久,在此我们用最简方式快速安装MySQL并配置用户(当然,如果你用现成的RDS
也可以,省去了安装过程,可直接跳转至为Airflow建库建用户步骤了)。
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.52-1.el7.x86_64
sudo rpm -e --nodeps mariadb-libs-5.5.52-1.el7.x86_64
rpm -qa | grep mariadb
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
sudo yum install mysql-server
sudo chown -R mysql:mysql /var/lib/mysql
sudo service mysqld start
以下操作均在mysql客户端上进行操作,首先需要连接并登录mysql。
用root用户连接登录mysql:
mysql -uroot
use mysql;
update user set password=password('root') where user='root';
flush privileges;
建库:
create database airflow;
建用户:
create user 'airflow'@'%' identified by 'airflow';
create user 'airflow'@'localhost' identified by 'airflow';
为用户授权:
grant all on airflow.* to 'airflow'@'%';
flush privileges;
exit;
万事既已具备,让我们开始进入今天的主题!
安装之前需要设置一下临时环境变量SLUGIFY_USES_TEXT_UNIDECODE
,不然,会导致安装失败,命令如下:
export SLUGIFY_USES_TEXT_UNIDECODE=yes
安装airflow脚手架:
sudo pip install apache-airflow===1.10.0
airflow会被安装到python3下的site-packages目录下,完整目录为:${PYTHON_HOME}/lib/python3.6/site-packages/airflow
,我的airflow目录如下所示:
安装airflow前,我们需要先配置一下airflow的安装目录AIRFLOW_HOME
,同时为了方便使用airflow的相关命令,我们也把airflow配置到环境变量中,一劳永逸。
编辑/etc/profile
系统环境变量文件:
sudo vim /etc/profile
做如下修改(当然,具体目录需要修改成你自己对应的目录,不要照搬不动哦):
使修改后的环境变量立即生效:
sudo source /etc/profile
airflow
命令做初始化操作因为配置过airflow的环境变量SITE_AIRFLOW_HOME
,我们在哪里执行如下命令都可:
airflow
到此,airflow会在刚刚的AIRFLOW_HOME
目录下生成一些文件。当然,执行该命令时可能会报一些错误,可以不用理会!生成的文件列表如下所示:
sudo pip install 'apache-airflow[mysql]'
airflow的包依赖安装均可采用该方式进行安装,具体可参考airflow官方文档
[敲黑板,划重点]
安装mysql模块时可能会报如下错误:
mysql_config not found
解决步骤如下:
(1)先查看下是否已经存在mysql_config文件:
find / -name mysql_config
(2)如果没有的话,安装mysql-devel:
sudo yum install mysql-devel
(3)安装完成之后,再次验证是否有mysql_config文件:
修改airflow.cfg文件,配置mysql作为airflow元数据库:
这里就巨坑无比了,很多人的教程里面都是这么直接写的,然后就完蛋了!!!不信你试试看,等下初始化数据库必死无疑!而且还没有任何有效的解决方案可以供你搜索!!!其次也不要相信什么改成pymysql
配合pymysql包实现,这样更惨,会有数据类型解析问题,让你毫无头绪!!!切记切记!!!
sql_alchemy_conn = mysql://airflow:airflow@localhost:3306/airflow
或
sql_alchemy_conn = mysql+pymysql://airflow:airflow@localhost:3306/airflow
那既然这种方式不可行,该怎么办呢?办法总比困难多的!因为Python3不再支持MySQLdb了,只有Python2才支持。但是呢,也只有MySQLdb才是最佳结果。
首先,我们通过pip安装一下mysqlclient:
sudo pip install mysqlclient
然后,再通过pip安装一下MySQLdb:
sudo pip install MySQLdb
最后,我们修改airflow.cfg文件中的sql_alchemy_conn配置:
sql_alchemy_conn = mysql+mysqldb://airflow:airflow@localhost:3306/airflow
到此,我们已经为airflow配置好元数据库信息且准备好依赖包。
airflow initdb
此时,我们的mysql元数据库(库名为airflow)中已经新建好了airflow的依赖表:
[敲黑板,划重点]
此时初始化数据库时,可能会报如下错误:
Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql
该问题的解决方案在Airflow官方文档中有说明,链接为:http://airflow.apache.org/faq.html。需要通过修改MySQL配置文件my.cnf进行处理,步骤如下:
(1)查找my.cnf位置:
mysql --help | grep my.cnf
(2)修改my.cnf文件:
在[mysqld]下面(一定不要写错地方)添加如下配置:
explicit_defaults_for_timestamp=true
(3))重启MySQL使配置生效:
sudo service mysqld restart
(4)查看修改的配置是否生效:
(5)重新执行airflow initdb
即可
airflow xxx -D
airflow list_dags
airflow list_tasks dag_id
airflow pause/unpause dag_id
airflow test dag_id task_id execution_date
[敲黑板,划重点]
启动webserver组件时可能会报如下错误:
错误1:
Error: 'python:airflow.www.gunicorn_config' doesn‘t exist
安装指定版本的gunicorn即可:
(1) Airflow1.10版本对应gunicorn的19.4.0版本:
sudo pip install gunicorn==19.4.0
(2) Airflow1.8版本安装gunicorn的19.3.0版本:
sudo pip install gunicorn==19.3.0
错误2:
FileNotFoundError: [Errno 2] No such file or directory: 'gunicorn': 'gunicorn'
只需要配置好Python的bin目录环境变量即可(也可以参照https://www.cnblogs.com/lwglinux/p/7100400.html):
sudo vim /etc/profile
source /etc/profile
这里为什么要修改呢?因为SequentialExecutor是单进程顺序执行任务,默认执行器,通常只用于测试,LocalExecutor是多进程本地执行任务使用的,CeleryExecutor是分布式调度使用(当然也可以单机),生产环境常用,DaskExecutor则用于动态任务调度,常用于数据分析。
为什么要修改时区呢?因为Airflow默认的时间是GMT时间,虽然可以在Airflow集群分布在不同时区时仍可保证时间相同,不会出现时间不同步的问题,但是这个时间比北京早8小时,不太符合我们的阅读习惯,也不够简洁直观。鉴于我们通常情况下,我们要么为单节点服务,要么即使扩展也是在同一个时区的,所以将时区修改为东八区,即北京时间,这样更便于我们使用。
Come on!
(1) 修改airflow.cfg文件:
default_timezone = Asia/Shanghai
这里修改的是scheduler的调度时间,也就是说在编写调度时间是可以直接写北京时间。
(2) 修改webserver页面上右上角展示的时间:
需要修改${PATHON_HOME}/lib/python3.6/site-packages/airflow/www/templates/admin/master.html
文件。
修改后效果如图所示:
(3) 修改webserver lastRun时间:
第1处修改${PATHON_HOME}/lib/python3.6/site-packages/airflow/models.py
文件。
def utc2local(self,utc):
import time
epoch = time.mktime(utc.timetuple())
offset = datetime.fromtimestamp(epoch) - datetime.utcfromtimestamp(epoch)
return utc + offset
效果如下:
第2处修改${PATHON_HOME}/lib/python3.6/site-packages/airflow/www/templates/airflow/dags.html
文件。
dag.utc2local(last_run.execution_date).strftime("%Y-%m-%d %H:%M")
dag.utc2local(last_run.start_date).strftime("%Y-%m-%d %H:%M")
效果如下:
修改完毕,此时可以通过重启webserver查看效果!
在这里我们采用简单的password认证方式足矣!
(1)安装password组件:
sudo pip install apache-airflow[password]
(2)修改airflow.cfg配置文件:
[webserver]
authenticate = True
auth_backend = airflow.contrib.auth.backends.password_auth
(3)编写python脚本用于添加用户账号:
编写add_account.py
文件:
import airflow
from airflow import models, settings
from airflow.contrib.auth.backends.password_auth import PasswordUser
user = PasswordUser(models.User())
user.username = 'airflow'
user.email = '[email protected]'
user.password = 'airflow'
session = settings.Session()
session.add(user)
session.commit()
session.close()
exit()
执行add_account.py
文件:
python add_account.py
你会发现mysql元数据库表user中会多出来一条记录的。
当然,你也可以借助于第三方插件方式对用户账号还有可视化UI建立/修改DAG代码。链接为:https://github.com/lattebank/airflow-dag-creation-manager-plugin,可惜只支持到Python2.x。不过后续我会对其做升级处理。
如果scheduler检测DAG过于频繁,会导致CPU负载非常高。而默认scheduler检测时间为0,也就是没有时间间隔。
可以通过修改airflow.cfg文件中的min_file_process_interval
设置时间间隔,如下,我是修改为了5秒检测一次:
可以通过修改airflow.cfg文件中的parallelism
来控制scheduler的并发量:
(未完待续…)