在安装部署之前,建议学习以下博客系列:

https://www.jianshu.com/p/2ecef979c606

一、环境准备:

设备名IP系统pythonmysql server其他
VM01192.168.72.130CentOS release 7.7.1908 Anaconda3-2019.07-Linux-x86_64.sh8.0.18root账户操作
VM02192.168.72.131CentOS release 7.7.1908Anaconda3-2019.07-Linux-x86_64.sh8.0.18root账户操作
VM03192.168.72.132CentOS release 7.7.1908Anaconda3-2019.07-Linux-x86_64.sh8.0.18root账户操作

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

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐