在安装部署之前,建议学习以下博客系列:
https://www.jianshu.com/p/2ecef979c606
一、环境准备:
设备名 | IP | 系统 | python | mysql server | 其他 |
VM01 | 192.168.72.130 | CentOS release 7.7.1908 | Anaconda3-2019.07-Linux-x86_64.sh | 8.0.18 | root账户操作 |
VM02 | 192.168.72.131 | CentOS release 7.7.1908 | Anaconda3-2019.07-Linux-x86_64.sh | 8.0.18 | root账户操作 |
VM03 | 192.168.72.132 | CentOS release 7.7.1908 | Anaconda3-2019.07-Linux-x86_64.sh | 8.0.18 | root账户操作 |
Centos7克隆和设置静态ip,方法链接:
https://www.jianshu.com/p/ced871fcdf6e
修改主机名命令:
hostnamectl set-hostname VM01
二、三台设备都离线安装airflow:
下载安装包的设备条件是,与以上三台设备的系统和anaconda版本相同(即python版本相同)、联网,操作如下
$ mkdir airflow
$ cd airflow
$ pip download apache-airflow[all]
$ pip install apache-airflow[all] --no-index -f ./
注意经过以上命令下载的安装包并不能成功安装,有部分包没有下载到,有部分包可能依赖版本不对或相斥,可以通过pip download单独下载需要的包,版本不对则选择正确的版本,A和B模块都依赖的模块C版本不一样,则可以降低或升高A版本使得其所需C版本和B所需的C版本一致 即可。(离线下载缺的包比较耗时)
可能遇到的问题:
1、解决mysqlclient安装问题
联网解决方法,未联网则按后面方法下载mysql-devel之后再使用本方法。
ln -s /usr/local/mysql/bin/mysql_config /usr/local/bin/mysql_config
yum install mysql-devel
pip3 install mysqlclient
2、yum下载离线安装包
离线下载mysql-devel,可使用yum只下载不安装的方式:
利用yum-utils中的yumdownloader,
(1)安装yum-utils
yum -y install yum-utils
(2)首先cd到创建的mysql-devel目录,使用yumdownloader下载软件包mysql-devel,安装包在当前目录下。
yumdownloader mysql-devel
(3)下载后的所有rpm包的安装方式:
rpm -Uvh --force --nodeps *.rpm
三、三台设备都离线安装Dask:
有线安装方法如下:
pip install "dask[complete]"
离线安装同上一小节方法。
四、配置mysql元数据库
1、在VM01上操作
$ mysql -u root -p
创建airflow元数据库
mysql>create database airflowdb;
mysql>use airflowdb;
设置密码策略,使得简单密码可以通过:
mysql>set global validate_password.policy=LOW;
mysql>set global validate_password.length=1;
创建访问用户:
mysql>flush privileges;
mysql>create user 'algo'@'localhost' IDENTIFIED BY 'algo';
mysql>flush privileges;
给用户权限:
mysql>GRANT all privileges ON airflowdb.* TO 'algo'@'localhost';
密码可持续使用:
mysql>ALTER USER 'algo'@'localhost' IDENTIFIED BY 'algo' PASSWORD EXPIRE NEVER;
mysql>ALTER USER 'algo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'algo';
刷新权限设置:
mysql>flush privileges;
查看权限设置结果:
mysql>show grants for algo@localhost;
VM01的mysql服务器设置algo账户可以被远程任意设备访问:
mysql>use mysql;
mysql>update user set host = '%' where user = 'algo';
mysql>select host, user from user;
使得远程algo可使用airflowdb:
mysql>GRANT all privileges ON airflowdb.* TO 'algo'@'%';
mysql>flush privileges;
mysql>show grants for algo@'%';
mysql>quit;
重启MySQL服务:
$ service mysqld restart
2、VM02和VM03远程连接VM01数据库测试
$ mysql -h 192.168.72.130 -u algo -p
mysql>use airflowdb;
以上不出错的话,说明VM02和VM03已经可以远程访问VM01的SQL服务器且可以访问airflowdb。
五、airflow配置:
1、3台设备都设置 $AIRFLOW_HOME 的环境变量并初始化数据库
$ echo "export AIRFLOW_HOME=~/airflow" >> ~/.bashrc
$ source ~/.bashrc
$ airflow initdb
以上步骤会生成一个~/airflow目录,所有配置和任务文件都要放在该目录下。
2、在VM01上修改~/airflow/airflow.cfg文件中以下内容
executor = DaskExecutor
sql_alchemy_conn = mysql://algo:algo@localhost:3306/airflowdb
3、在VM02和VM03修改~/airflow/airflow.cfg文件中以下内容
executor = DaskExecutor
sql_alchemy_conn = mysql://algo:algo@192.168.72.130:3306/airflowdb
cluster_address = 192.168.72.130:8786
4、VM01\VM02\VM03都创建dags存放目录
$ mkdir ~/airflow/dags
今后所有的任务文件(dag文件)都要在3台设备的dags目录中各放一份相同的,VM02\VM03不放的话,VM01的分配任务来了,会找不到dag文件,即找不到dag_id。另外要执行的代码文件同样需要在3台设备中的工程目录(路径名都要相同)中各放一份。
5、VM01操作,配置文件后重新初始化元数据库:
$ airflow initdb
此处可能出现的问题:
(1)mysqlclient依赖包未正确编译,这是编译环境的问题,此问题是本人在使用旧版centos和mysql server时发生的:
ImportError: /usr/local/src/anaconda3/lib/python3.7/site-packages/mysqlclient-1.3.14-py3.7-linux-x86_64.egg/_mysql.cpython-37m-x86_64-linux-gnu.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE
解决办法:换成本人第一小节的环境则不会有问题,或者用新环境编译成功mysqlclient后,将成功的_mysql.cpython-37m-x86_64-linux-gnu.so替换到旧环境中则可解决此问题。
(2)"Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)")
查看/etc/my.cnf 看到要通过/data1/dbdata/data/mysql.sock才能连接到sql server,而不是/var/lib/mysql/mysql.sock
根据错误发生的文件修改模块文件/MySQLdb/connections.py
在class Connection 内第一行添加:
kwargs['unix_socket']='/data1/dbdata/data/mysql.sock'
(3)'Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql'
$ mysql -u root -p
mysql> show global variables like '%timestamp%';
mysql> set global explicit_defaults_for_timestamp=1;
mysql> quit;
最后应该能成功初始化用mysql的元数据库:airflow initdb
六、启动各个服务进程:
1、以下进程都未后台运行(后台运行加-D即可,比如airflow scheduler -D),可复制多个ssh运行,严格按一下顺序启动:
(1)VM01操作:
$ dask-scheduler
(2)VM02和VM03操作:
$ dask-worker 192.168.72.130:8786
(3)VM01操作:
$ airflow webserver -p 8080
$ airflow scheduler
(4)VM02和VM03操作,给VM01的 airflow webserver进程提供日志:
$ airflow serve_logs
2、后台启动以上进程的方式:
让webserver和schduler在后台运行则需要如下命令:
airflow webserver -p 8080 -D
airflow scheduler -D
airflow worker -D
杀死后台进程的方式:
$ ps -aux | grep airflow
$ kill pid (杀死所有airflow相关进程即可)
七、问题
1、关于看日志,要么在web界面上看,要么在airflow的环境路径下logs/dag_id/下看日志文件。在实际任务是集群中其他设备执行的情况下,查看web日志需要注意以下airflow.cfg的配置:
# When you start an airflow worker, airflow starts a tiny web server
# subprocess to serve the workers local log files to the airflow main
# web server, who then builds pages and sends them to users. This defines
# the port on which the logs are served. It needs to be unused, and open
# visible from the main web server to connect into the workers.
worker_log_server_port = 8793
由于具体执行任务的VM02\VM03所产生的日志只会在本地存储,所以要开启一个airflow worker或airflow serve_logs把worker的日志传到VM01上,供VM01的webserver在浏览器上展示日志给用户看。具体看airflow.cfg中参数worker_log_server_port的说明。由于airflow worker通常和celeryExecutor一起使用(这里是使用DaskExecutor,不需要airflow worker),且相对airflow serve_logs进程较重,所以这里只启动airflow serve_logs。
2、任务运行之后,点击界面上的日志链接时,显示如下错误,错误表示日志无法访问:
*** Log file does not exist: /root/airflow/logs/zhuanjipingjia2/read_test/2019-12-24T00:00:00+00:00/1.log
*** Fetching from: http://vm03:8793/log/zhuanjipingjia2/read_test/2019-12-24T00:00:00+00:00/1.log
*** Failed to fetch log file from worker
首先在VM01上检测VM02\VM03的worker_log_server_port是否开放:
$ yum install telnet
$ telnet 192.168.72.131 8793
$ telnet 192.168.72.132 8793
端口开放的,那么以上问题是由于请求链接中的vm03域名没能解析出ip, 导致访问失败。配置一下host即可:
VM01\VM02\VM03操作:
$ vim /etc/hosts
增加以下内容保存即可解决以上日志问题。
192.168.72.130 vm01
192.168.72.131 vm02
197.168.72.132 vm03
3、在任务需要用到.sh文件执行时,注意给所有shell文件都赋予可执行权限!!!!
$ chmod +x filename.sh