本篇文章只講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;
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.時區
其他配置
#同時需要修改另外三個文件 #修改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.128:8085/admin/ #測試 可以選擇airflow_db數據庫簡單查詢進行測試 select * from log;
https://blog.csdn.net/yingkongshi99/article/details/52658538