Airflow的部署(全網圖文結合最全)


本篇文章只講Airflow的部署以及再部署中遇到的坑和解決方式

  • 環境准備

 

 

 

 

  • Python的安裝

 python安裝的過程中 你可能會遇到各種各樣的問題,上網搜各種問題的解法也不盡相同,最關鍵的是基本沒啥效果。在我安裝的過程中總結了幾點,再執行我下面的流程的時候,一定要一步不落,並且保證環境一定要干凈,如果在執行某個步驟的時候出現 已存在的字眼,一定要刪掉然后重新執行這一步。(這都是血與淚的教訓)

 

#python依賴
yum -y install zlib zlib-devel
yum -y install bzip2 bzip2-devel
yum -y install ncurses ncurses-devel
yum -y install readline readline-devel
yum -y install openssl openssl-devel
yum -y install openssl-static
yum -y install xz lzma xz-devel
yum -y install sqlite sqlite-devel
yum -y install gdbm gdbm-devel
yum -y install tk tk-devel
yum install gcc

#安裝wget命令
yum -y install wget
#使用wget下載Python源碼壓縮包到/root目錄下
wget -P /root https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
#在當前目錄解壓Python源碼壓縮包
tar -zxvf Python-3.6.5.tgz
#進入解壓后的文件目錄下
cd /root/Python-3.6.5
#檢測及校驗平台
./configure --with-ssl --prefix=/service/python3
#編譯Python源代碼
make
#安裝Python
make install
#備份原來的Python軟連接
mv /usr/bin/python /usr/bin/python2.backup
#制作新的指向Python3的軟連接
ln -s /service/python3/bin/python3 /usr/bin/python
#建立pip的軟連接
ln -s /service/python3//bin/pip3 /usr/bin/pip
###注意這一步執行的時候就可能會出現已經存在,這時候你要把/usr/bin/pip刪掉然后再執行這一步
錯誤:ln: failed to create symbolic link ‘/usr/bin/pip’: File exists

 

#查看Python版本
python -V
#檢測pip是否可用
pip
#升級pip
pip install --upgrade pip
#獲取yum命令所在位置
whereis yum
#yum: /usr/bin/yum /etc/yum /etc/yum.conf /usr/share/man/man8/yum.8
#編輯yum文件
vi /usr/bin/yum /etc/yum /etc/yum.conf /usr/share/man/man8/yum.8
#進入編輯模式
i
#修改第一行內容(看系統版本,centos7對應2.7,centos6對應2.6)
#修改前:
#!/usr/bin/python
#修改后:
#!/usr/bin/python2.7
#退出編輯模式
esc
#保存文件
:wq
#按上述方式編輯以下文件,修改第一行內容
/usr/libexec/urlgrabber-ext-down

注意在編輯yum文件這一步一定要謹慎不要弄錯。否則后邊用yum命令的時候可能會出問題,有包下不下來的情況

Error downloading packages:
python3-rpm-generators-6-2.el7.noarch: [Errno 5] [Errno 2] No such file or directory

 

 

 

 

 

 

 

 

 

對了  在以上步驟都執行完畢以后請輸入pip命令看一下是否正常

如下就是正常的

 

 

 

  • MySQL的安裝

mysql的安裝有兩個方式一個是RPM安裝,另一種是tar包部署

本文中給出簡單的RPM部署

如果不成功或者想保證一次性安裝成功可以用TAR包部署,TAR包部署可參考

https://www.cnblogs.com/xuziyu/p/10353968.html

 

#卸載mariadb
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

 

#下載mysql的repo源
wget -P /root http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
#通過rpm安裝
rpm -ivh mysql-community-release-el7-5.noarch.rpm
#安裝mysql
yum install mysql-server
#授權
chown -R mysql:mysql /var/lib/mysql
#開啟Mysql服務
service mysqld start
#用root用戶連接登錄mysql:
mysql -uroot
#重置mysql密碼
use mysql;
update user set password=password('root') where user='root';
flush privileges;
#為Airflow建庫、建用戶
#建庫:
create database airflow;
#建用戶:
create user 'airflow'@'%' identified by 'airflow';
create user 'airflow'@'localhost' identified by 'airflow';
#為用戶授權:
grant all on airflow.* to 'airflow'@'%';
grant all on airflow.* to 'root'@'%';
flush privileges;
exit;

 

 

官網:http://airflow.apache.org/

 

 

 

Airflow2019年1月成為了Apache的頂級項目,它是由Python編寫的一個任務調度框架。

 

  • 接下來安裝airflow

#設置臨時環境變量
export SLUGIFY_USES_TEXT_UNIDECODE=yes
#添加編輯環境變量
vi /etc/profile
#在最后添加以下內容:
----》
export PS1="[\u@\h \w]\$ "
#Python環境變量
export PYTHON_HOME=/service/python3
export PATH=$PATH:$PYTHON_HOME/bin
#Airflow環境變量
export AIRFLOW_HOME=/root/airflow
export SITE_AIRFLOW_HOME=/service/python3/lib/python3.6/site-packages/airflow
export PATH=$PATH:$SITE_AIRFLOW_HOME/bin
----》
#生效環境變量
source /etc/profile
#安裝apache-airflow並且指定1.10.0版本
pip install apache-airflow===1.10.0
(這一步你若能順利執行下來,你就可以歡呼一會了,太難了)

 

 airflow會被安裝到python3下的site-packages目錄下,完整目錄為:

${PYTHON_HOME}/lib/python3.6/site-packages/airflow
#絕對路徑/service/python3/lib/python3.6/site-packages/airflow

 

執行airflow命令做初始化操作

 

 解決:參考博客:https://www.cnblogs.com/wang-li/p/7620483.html

                   https://blog.csdn.net/yingkongshi99/article/details/52658538

airflow
####
[2019-07-17 04:40:01,565] {__init__.py:51} INFO - Using executor SequentialExecutor
usage: airflow [-h]
               {backfill,list_tasks,clear,pause,unpause,trigger_dag,delete_dag,pool,variables,kerberos,render,run,initdb,list_dags,dag_state,task_failed_deps,task_state,serve_logs,test,webserver,resetdb,upgradedb,scheduler,worker,flower,version,connections,create_user}
               ...
airflow: error: the following arguments are required: subcommand
####
#到此,airflow會在剛剛的AIRFLOW_HOME目錄下生成一些文件。當然,執行該命令時可能會報一些錯誤,可以不用理會!
#報錯如下:
[2019-07-17 04:40:01,565] {__init__.py:51} INFO - Using executor SequentialExecutor
usage: airflow [-h]
               {backfill,list_tasks,clear,pause,unpause,trigger_dag,delete_dag,pool,variables,kerberos,render,run,initdb,list_dags,dag_state,task_failed_deps,task_state,serve_logs,test,webserver,resetdb,upgradedb,scheduler,worker,flower,version,connections,create_user}
               ...
airflow: error: the following arguments are required: subcommand
#生成的文件logs如下所示:
[root@test01 ~]$ cd airflow/
[root@test01 ~/airflow]$ ll
total 28
-rw-r--r--. 1 root root 20572 Jul 17 04:40 airflow.cfg
drwxr-xr-x. 3 root root    23 Jul 17 04:40 logs
-rw-r--r--. 1 root root  2299 Jul 17 04:40 unittests.cfg

 

#為airflow安裝mysql模塊
pip install 'apache-airflow[mysql]'

 

#出現報錯:
    ERROR: Complete output from command python setup.py egg_info:
    ERROR: /bin/sh: mysql_config: command not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-dq81ujxt/mysqlclient/setup.py", line 16, in <module>
        metadata, options = get_config()
      File "/tmp/pip-install-dq81ujxt/mysqlclient/setup_posix.py", line 51, in get_config
        libs = mysql_config("libs")
      File "/tmp/pip-install-dq81ujxt/mysqlclient/setup_posix.py", line 29, in mysql_config
        raise EnvironmentError("%s not found" % (_mysql_config_path,))
    OSError: mysql_config not found
    ----------------------------------------
ERROR: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-dq81ujxt/mysqlclient/
#解決方案,查看是否有mysql_config文件
[root@test01 ~]$ find / -name mysql_config
#如果沒有
[root@test01 ~]$ yum -y install mysql-devel
#安裝完成后再次驗證是否有mysql_config
find / -name mysql_config
#采用mysql作為airflow的元數據庫
pip install mysqlclient
#安裝MySQLdb
pip install MySQLdb
#報錯不支持
Collecting MySQLdb
  ERROR: Could not find a version that satisfies the requirement MySQLdb (from versions: none)
ERROR: No matching distribution found for MySQLdb
#所以使用python-mysql
pip install pymysql
pip install cryptography
#避免之后產生錯誤
#airflow.exceptions.AirflowException: Could not create Fernet object: Incorrect padding
#需要修改airflow.cfg (默認位於~/airflow/)里的fernet_key
#修改方法
python -c "from cryptography.fernet import Fernet; 
print(Fernet.generate_key().decode())"
#這個命令生成一個key,復制這個key然后替換airflow.cfg文件里的fernet_key的值,
#可能出現報錯
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'cryptography'
#處理方式:
pip install cryptography
#文件中進行fernet_key值修改
cd  ${AIRFLOW_HOME}
vi airflow.cfg
#查找fernet_net
/fernet_net
#編輯替換fernet值

 

 

 

 

 

#修改airflow.cfg文件中的sql_alchemy_conn配置
sql_alchemy_conn = mysql+mysqldb://airflow:airflow@localhost:3306/airflow
#保存文件
#為避免初始化數據庫時有如下報錯
#Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql
#修改MySQL配置文件my.cnf
#查找my.cnf位置
mysql --help | grep my.cnf

 

 

 

#修改my.cnf
vi /etc/my.cnf
#在[mysqld]下面(一定不要寫錯地方)添加如下配置:
explicit_defaults_for_timestamp=true

 

 

 

#重啟mysql服務使配置生效
service mysqld restart
#檢查配置是否生效
mysql -uroot -proot
mysql> select @@global.explicit_defaults_for_timestamp;
+------------------------------------------+
| @@global.explicit_defaults_for_timestamp |
+------------------------------------------+
|                                        1 |
+------------------------------------------+
1 row in set (0.00 sec)

 

通過修改airflow.cfg調整配置

1.修改webserver地址

base_url = http://IP:8080

web_server_port = 8080

 

 

2.修改executor

 

 

3.時區

#修改airflow.cfg中

default_timezone = Asia/Shanghai

 

 

其他配置

#同時需要修改另外三個文件
#修改webserver頁面上右上角展示的時間:
vi ${PYTHON_HOME}/lib/python3.6/site-packages/airflow/www/templates/admin/master.html
-----------------------------------
{% block tail_js %}
{{ super() }}
<script src="{{ url_for('static', filename='jqClock.min.js') }}" type="text/javascript"></script>
<script>
    x = new Date()
   // var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000);##修改的內容
    var UTCseconds = x.getTime();##修改的內容
    $("#clock").clock({

 

 

#修改webserver lastRun時間:
vi ${PYTHON_HOME}/lib/python3.6/site-packages/airflow/models.py
-----------------------------------》
#在指定位置添加如下內容,可以借助get_last_dagrun定位
def utc2local(self,utc):
       import time
       epoch = time.mktime(utc.timetuple())
       offset = datetime.fromtimestamp(epoch) - datetime.utcfromtimestamp(epoch)
       return utc + offset

 

 

vi ${PYTHON_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")

 

 

 

4.添加用戶認證(暫時不做這一步,還沒懂)

在這里我們采用簡單的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 = 'test_airflow@wps.cn'
user.password = 'airflow'

session = settings.Session()
session.add(user)
session.commit()
session.close()
exit()
#執行add_account.py文件:
python add_account.py
#你會發現mysql元數據庫表user中會多出來一條記錄的。

5修改scheduler線程數控制並發量

parallelism = 32

6修改檢測新DAG間隔

min_file_process_interval = 5
  • 初始化源數據庫及啟動組件

#初始化元數據庫信息(其實也就是新建airflow依賴的表)
pip install celery
pip install apache-airflow['kubernetes']
airflow initdb 
#或者使用airflow resetdb

 

 

 

#准備操作
#關閉linux防火牆
systemctl stop firewalld.service
systemctl disable firewalld.service
#同時需要關閉windows防火牆
#數據庫設置
mysql -uroot -proot
mysql> set password for 'root'@'localhost' =password('');
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on airflow.* to 'airflow'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on airflow.* to 'root'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> exit;

#啟動組件:
airflow webserver -D
#airflow scheduler -D
#airflow worker -D
#airflow flower -D

 

  • Web頁面查看

#地址
192.168.150.1288085/admin/
#測試
可以選擇airflow_db數據庫簡單查詢進行測試
select * from log;

 

 

 

 

 

https://blog.csdn.net/yingkongshi99/article/details/52658538


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM