AirFlow 安裝配置

airflow 安裝配置

airflow 相關軟件安裝

python 3.6.5 安裝

  1. 安裝依賴程序 ;

    [root@node01 ~]# yum -y install zlib zlib-devel bzip2 bzip2-devel  ncurses ncurses-devel  readline readline-devel  openssl openssl-devel openssl-static  xz lzma xz-devel  sqlite sqlite-devel  gdbm gdbm-devel  tk tk-devel  gcc
  2. 下載python ;
    可以前往 https://www.python.org/ftp/python/查看Python各個版本,這裏,我們選擇安裝Python-3.6.5.tgz版本。通過如下命令下載Python源碼壓縮包

    [root@node01 ~]# wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
  3. 解壓Python源碼壓縮包 ;

    [root@node01 ~]# tar -zxvf Python-3.6.5.tgz
    [root@node01 ~]# cd Python-3.6.5
  4. 安裝python ;

    [root@node01 Python-3.6.5]# ./configure prefix=/usr/local/python3
    [root@node01 Python-3.6.5]# make 
    [root@node01 Python-3.6.5]# make install
    [root@node01 Python-3.6.5]# mv /usr/bin/python /usr/bin/python2    #將原來的執行腳本改名備份
    [root@node01 Python-3.6.5]# ln -s /usr/local/python3/bin/python3  /usr/bin/python  #將新的python執行腳本鏈接到命令路徑內
    [root@node01 Python-3.6.5]# ln -s /usr/local/python3/bin/pip3  /usr/bin/pip  #將pip3鏈接到命令路徑內
  5. 查看版本信息 ;
    在這裏插入圖片描述

  6. 修改yum相關配置文件 ;
    將以下兩個文件的開頭 #!/usr/bin/python 改成 #!/usr/bin/python2.7
    [root@node01 Python-3.6.5]# vim /usr/bin/yum  
    [root@node01 Python-3.6.5]# vim  /usr/libexec/urlgrabber-ext-down

    在這裏插入圖片描述
    在這裏插入圖片描述

pip3 安裝

默認python 3.6.5 已經自帶pip3 ,不需要再額外進行安裝。
如果是python2.x 就需要進行安裝pip 。

MySQL 5.7.28 安裝

  1. 解壓MySQL軟件(文件大小六百多兆,官網直接下載免安裝)

    [root@node01 ~]# tar zxvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
    [root@node01 ~]# mv mysql-5.7.28-linux-glibc2.12-x86_64  /opt/mysql
    [root@node01 ~]# cd /opt/mysql/
  2. 創建MySQL運行需要的用戶跟組

    [root@node01 mysql]# groupadd  mysql
    [root@node01 mysql]# useradd  -M -s /sbin/nologin  -g mysql  mysql
  3. 創建存放數據的目錄

    [root@node01 mysql]# mkdir data
    [root@node01 mysql]# chown  -R mysql:mysql *
  4. 編寫配置文件
    vim /etc/my.cnf

    [client]
    port = 3306
    socket = /opt/mysql/data/mysql.sock
    [mysqld]
    port = 3306
    socket = /opt/mysql/data/mysql.sock
    basedir = /opt/mysql
    datadir = /opt/mysql/data
    user = mysql
    bind-address = 0.0.0.0
    server-id = 1
    init-connect = 'SET NAMES utf8'
    character-set-server = utf8
  5. 初始化數據庫

    [root@node01 mysql]# bin/mysqld --initialize --basedir=/opt/mysql --datadir=/opt/mysql/data --user=mysql
  6. 將數據庫添加到服務內

    [root@node01 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
    [root@node01 mysql]# cp   /opt/mysql/bin/*  /usr/sbin/
    [root@node01 mysql]# chmod +x /etc/init.d/mysqld
  7. 添加開機自啓
    [root@node01 mysql]# chkconfig --add mysqld
    [root@node01 mysql]# service mysqld start
  8. 登陸 MySQL, 密碼在之前初始化時有提示的

    [root@mysql_node01 mysql]# mysql -uroot -p
  9. 修改root密碼,否則什麼都做不了

    mysql> alter user root@"localhost" identified by "123456";
    Query OK, 0 rows affected (0.00 sec)
  10. 測試賬號是否可以增刪
    
    mysql> create database abctest;
    Query OK, 1 row affected (0.00 sec)

mysql> use abctest;
Database changed

mysql> drop database abctest;
Query OK, 0 rows affected (0.00 sec)


> 12. 授權airflow用戶可被訪問 ;
```bash
mysql> grant all on *.* to 'airflow'@'%' identified by '123456a';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
  1. 創建airflow 要用的數據庫,庫名 airflow ;

    mysql> create database airflow ;
    Query OK, 1 row affected (0.00 sec)
  2. 開啓timestamp ,數據更新時添加上當前時間 ;
    mysql> set @@global.explicit_defaults_for_timestamp=on;
    Query OK, 0 rows affected (0.00 sec)

redis 安裝

  1. 解壓redis (如需下載請直接到官網進行下載);

    [root@node01 ~]# tar zxvf redis-5.0.0.tar.gz
    [root@node01 ~]# cd redis-5.0.0/
  2. 安裝redis ;

    [root@node01 redis-5.0.0]# make && make test 
    [root@node01 redis-5.0.0]# mkdir  /usr/local/redis    #創建redis運行的目錄
    [root@node01 redis-5.0.0]# cp redis.conf  /usr/local/redis/    #複製配置文件到redis運行目錄
    [root@node01 redis-5.0.0]# cp src/redis-server  /usr/sbin/    #複製redis-server程序
    [root@node01 redis-5.0.0]# cp src/redis-cli  /usr/sbin/   #複製redis-cli程序
    [root@node01 redis-5.0.0]# cp src/redis-sentinel  /usr/sbin/   #複製redis-sentinel 程序
  3. 編輯redis 配置文件

    [root@node01 redis-5.0.0]# vim  /usr/local/redis/redis.conf 
    bind 0.0.0.0    #對外的綁定地址
    daemonize yes   #守護進程
    pidfile /usr/local/redis/redis_6379.pid   #指定pid
    logfile "/usr/local/redis/redis.log"   #指定log
    dir "/usr/local/redis"    #指定家目錄
    appendonly yes     #開啓持久化
  4. 啓動redis ;

    [root@node01 redis-5.0.0]# redis-server  /usr/local/redis/redis.conf 
  5. 連接redis 進行測試
    [root@node01 ~]# redis-cli  
    127.0.0.1:6379> keys *
    (empty list or set)

RabbitMQ 安裝

  1. 安裝rabbitmq跟erlang (程序直接到官網下載即可);

    [root@node01 ~]# yum localinstall erlang-20.3-1.el7.centos.x86_64.rpm  rabbitmq-server-3.7.5-1.el7.noarch.rpm  -y
  2. 拷貝配置文件模板,然後修改配置文件(開啓默認登錄用戶);

    [root@node01 ~]# cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example  /etc/rabbitmq/rabbitmq.config
    [root@node01 ~]# vim /etc/rabbitmq/rabbitmq.config 

    在這裏插入圖片描述

  3. 開啓管理插件,啓動程序 ;
    [root@node01 ~]# rabbitmq-plugins enable rabbitmq_management  #開啓管理插件
    [root@node01 ~]# chown  rabbitmq:rabbitmq  /var/lib/rabbitmq/.erlang.cookie  #設置cookie 文件權限(否則無法啓動)
    [root@node01 ~]# systemctl  start rabbitmq-server.service    #啓動rabbitmq
    [root@node01 ~]# systemctl  enable rabbitmq-server.service  #添加開機自啓
  4. 打開管理頁面 http://ip:15672 ,使用默認用戶guest ,密碼guest 進入 ;
    在這裏插入圖片描述

  5. 點擊admin -->> add a user ,添加用戶密碼並設置administrator 權限 ;

在這裏插入圖片描述

  1. 爲admin用戶添加 虛擬目錄 / ;
    單擊用戶admin

在這裏插入圖片描述

選擇對應的Virtual Host ,單擊 Set permission 進行設置 ;
在這裏插入圖片描述

重新查看,發現已經設置成功 ;

在這裏插入圖片描述

airflow 單節點部署

將所有守護進程運行在同一臺機器上即可完成 airflow 的單結點部署,架構如下圖所示

架構圖

在這裏插入圖片描述

步驟

  1. 安裝依賴( airflow[mysql] 需要用到 );
    
    [root@node01 ~]# yum install mariadb-devel  MySQL-python -y
    [root@node01 ~]# mkdir /usr/local/mysql  #創建目錄

[root@node01 ~]# find / -name mysql.h #查看mysql.h 發現有兩個,因爲node01有安裝MySQL,所以有兩個文件,在安裝airflow[mysql]時會調用/usr/local/mysql/include/mysql.h 文件
/usr/include/mysql/mysql.h
/opt/mysql/include/mysql.h
[root@node01 ~]# ln -s /opt/mysql /usr/local/mysql # 將MySQL安裝目錄鏈接到/usr/local/mysql
[root@node01 airflow]# ln -s /opt/mysql/lib/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.20


>  2. 添加環境變量

vim /etc/profile
export PATH=$PATH:/usr/local/python3/bin/
export AIRFLOW_HOME=~/airflow


>  3. 安裝airflow 及相關應用 ;

[root@node01 ~]# pip install --upgrade pip #更新pip
[root@node01 ~]# pip install --upgrade setuptools #更新setuptools
[root@node01 ~]# pip install apache-airflow #安裝airflow 主程序
[root@node01 ~]# pip install apache-airflow[mysql] #安裝mysql連接器
[root@node01 ~]# pip install apache-airflow[celery] #安裝celery 連接器
[root@node01 ~]# pip install redis #安裝redis連接器
[root@node01 ~]# pip install --upgrade kombu #更新kombu (celery 需要最新的版本)


>  4. 初始化airflow 數據庫 ;

[root@node01 ~]# airflow initdb #或者可以只使用airflow 命令加載配置文件


>  5. 初始化完之後會產生airflow相關的一些文件,查看airflow目錄的內容 ;

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191227093123311.png)

>  6. 修改配置文件 ;
vim  /root/airflow/airflow.cfg

時區設置
default_timezone = Asia/Shanghai

不加載案例
load_examples = False

執行webserver默認啓動端口
web_server_port = 8080

使用的執行器
executor = CeleryExecutor

設置消息的中間代理
broker_url = redis://192.168.255.16:6379/0

設定結果存儲後端 backend
當然也可以使用 Redis :result_backend =redis://redis:[email protected]:6379/1
result_backend = db+mysql://airflow:[email protected]:3306/airflow

數據庫連接
sql_alchemy_conn = mysql://airflow:[email protected]:3306/airflow


>  7. 開啓timestamp ,數據更新時添加上當前時間 ;

mysql -uairflow -p
mysql> set @@global.explicit_defaults_for_timestamp=on;
Query OK, 0 rows affected (0.00 sec)


> 8. 重新生成數據庫文件 ;

airflow initdb


>  9. 啓動

[root@node01 airflow]# airflow webserver -p 8080 -D
[root@node01 airflow]# airflow scheduler -D
[root@node01 airflow]# airflow flower -D
[root@node01 airflow]# airflow worker -D #默認啓動會報錯,因爲worker不允許被ROOT用戶啓動


>  10. 設置worker 可以被root用戶啓動 
>  在 /etc/profile 文件內添加 export C_FORCE_ROOT=True 內容 ,source  /etc/profile 重新加載即可

>  11. 查看單節點是否已經搭建好
>  分別打開http://192.168.255.11:8080 跟 http://192.168.255.11:5050 查看是否ok

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191227093149183.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dxajU0MDgyMTYx,size_16,color_FFFFFF,t_70)

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191227093156143.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dxajU0MDgyMTYx,size_16,color_FFFFFF,t_70)

### airflow 多節點(集羣)部署
>    在穩定性要求較高的場景,如金融交易系統中,一般採用集羣、高可用的方式來部署。Apache Airflow 同樣支持集羣、高可用的部署,airflow 的守護進程可分佈在多臺機器上運行,架構如下圖所示:

#### 架構圖
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191227093258334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dxajU0MDgyMTYx,size_16,color_FFFFFF,t_70)

##### 多節點好處
>  高可用
>    如果一個 worker 節點崩潰或離線時,集羣仍可以被控制的,其他 worker 節點的任務仍會被執行。

>  分佈式
>    處理如果你的工作流中有一些內存密集型的任務,任務最好是分佈在多臺機器上運行以便得到更快的執行。

#### 擴展 worker 節點
##### 水平擴展
>    你可以通過向集羣中添加更多 worker 節點來水平地擴展集羣,並使這些新節點指向同一個元數據庫,從而分發處理過程。由於 worker 不需要在任何守護進程註冊即可執行任務,因此所以 worker 節點可以在不停機,不重啓服務下的情況進行擴展,也就是說可以隨時擴展。

##### 垂直擴展
>    你可以通過增加單個 worker 節點的守護進程數來垂直擴展集羣。可以通過修改 airflow 的配置文件-{AIRFLOW_HOME}/airflow.cfg 中 celeryd_concurrency 的值來實現,例如:

celeryd_concurrency = 30


>  您可以根據實際情況,如集羣上運行的任務性質,CPU 的內核數量等,增加併發進程的數量以滿足實際需求。

#### 擴展 Master 節點(高可用)
>    您還可以向集羣中添加更多主節點,以擴展主節點上運行的服務。您可以擴展 webserver 守護進程,以防止太多的 HTTP 請求出現在一臺機器上,或者您想爲 webserver 的服務提供更高的可用性。需要注意的一點是,每次只能運行一個 scheduler 守護進程。如果您有多個 scheduler 運行,那麼就有可能一個任務被執行多次。這可能會導致您的工作流因重複運行而出現一些問題。
>    下圖爲擴展 Master 節點的架構圖:

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191227093318702.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dxajU0MDgyMTYx,size_16,color_FFFFFF,t_70)

>    看到這裏,可能有人會問,scheduler 不能同時運行兩個,那麼運行 scheduler 的節點一旦出了問題,任務不就完全不運行了嗎?
>  
>    答案: 這是個非常好的問題,不過已經有解決方案了,我們可以在兩臺機器上部署 scheduler ,只運行一臺機器上的 scheduler 守護進程 ,一旦運行 scheduler 守護進程的機器出現故障,立刻啓動另一臺機器上的 scheduler 即可。我們可以藉助第三方組件 airflow-scheduler-failover-controller 實現 scheduler 的高可用。
>  
>    兩臺master 都安裝並運行 failover ,這樣才能實現真正的高可用
>  具體步驟如下所示:
>  1. 下載 failover

git clone https://github.com/teamclairvoyant/airflow-scheduler-failover-controller


>  2. 使用 pip 進行安裝

cd airflow-scheduler-failover-controller
pip install -e .


>  3. 初始化 failover

scheduler_failover_controller init

>  注:初始化時,會向airflow.cfg中追加內容,因此需要先安裝 airflow 並初始化。

>  4. 更改 failover 配置

scheduler_nodes_in_cluster= host1,host2

>  注:host name 可以通過scheduler_failover_controller get_current_host命令獲得

>  5. 配置安裝 failover 的機器之間的免密登錄,配置完成後,可以使用如下命令進行驗證:

scheduler_failover_controller test_connection


>  6. 啓動 failover

scheduler_failover_controller start

>  注意:在failover 監控scheduler 時會出現無法啓動的情況,此時應該修改  /root/airflow/airflow.cfg 的

airflow_scheduler_start_command = export AIRFLOW_HOME=/root/airflow;;nohup airflow scheduler >> ~/airflow/logs/scheduler.logs &
改爲 airflow_scheduler_start_command = airflow scheduler -D


>  因此更健壯的架構圖如下所示:

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20191227093337590.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dxajU0MDgyMTYx,size_16,color_FFFFFF,t_70)

##### 隊列服務及元數據庫(Metestore)的高可用。
>  隊列服務取決於使用的消息隊列是否可以高用可部署,如 RabbitMQ 和 Redis。
>    RabbitMQ 集羣並配置Mirrored模式見:http://blog.csdn.net/u010353408/article/details/77964190

>  元數據庫(Metestore) 取決於所使用的數據庫,如 Mysql 等。
>    Mysql 做主從備份見:http://blog.csdn.net/u010353408/article/details/77964157

#### airflow 集羣部署的具體步驟

##### 前提條件
>  節點運行的守護進程如下:

* master1 運行: webserver, scheduler
* master2運行:webserver
* worker1運行:worker
* worker2運行:worker

>  隊列服務處於運行中. (RabbitMQ, Redis, etc)

* 安裝 RabbitMQ 方法參見: http://site.clairvoyantsoft.com/installing-rabbitmq/
* 如果正在使用 RabbitMQ, 推薦 RabbitMQ 也做成高可用的集羣部署,併爲 RabbitMQ 實例配置負載均衡。

##### 步驟
>  1、 在所有需要運行守護進程的機器上安裝 Apache Airflow。

>  2、修改 {AIRFLOW_HOME}/airflow.cfg 文件,確保所有機器使用同一份配置文件。
>  1. 修改 Executor 爲 CeleryExecutor

executor = CeleryExecutor


>  2. 指定元數據庫(metestore)

sql_alchemy_conn = mysql://{USERNAME}:{PASSWORD}@{MYSQL_HOST}:3306/airflow


>  3. 設置中間人(broker)

>    如果使用 RabbitMQ

broker_url = amqp://guest:guest@{RABBITMQ_HOST}:5672/

>    如果使用 Redis

broker_url = redis://{REDIS_HOST}:6379/0 #使用數據庫 0


>  4. 設定結果存儲後端 backend

celery_result_backend = db+mysql://{USERNAME}:{PASSWORD}@{MYSQL_HOST}:3306/airflow
#當然您也可以使用 Redis :celery_result_backend =redis://{REDIS_HOST}:6379/1


>  3、在 master1 和 master2 上部署您的工作流(DAGs)。
>  4、在 master 1,初始 airflow 的元數據庫

$ airflow initdb


>  5、在 master1, 啓動相應的守護進程

$ airflow webserver

$ airflow scheduler


>  6、在 master2,啓動 Web Server

$ airflow webserver


>  7、在 worker1 和 worker2 啓動 worker

$ airflow worker



>  8、使用負載均衡處理 webserver
>  可以使用 nginx,AWS 等服務器處理 webserver 的負載均衡,所有均已集羣或高可用部署,apache-airflow 系統已堅不可摧。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章