真的是想不通,Airflow不論社區活躍度仍是Github的star數都是遠勝於Azkaban還有EasyScheduler的,可是爲什麼卻連一個完備的安裝教程都沒有呢?是個人需求過高?真的是心累不已,整整把搜索引擎還有youtube翻來覆去也沒讓我感到知足……不過好在,一步一坑一腳印的最終搭建連通好了環境以及Operator。好了,廢話很少說,開始Airflow今日份安裝教程。html
安裝工具 | 版本 | 用途 |
---|---|---|
Python | 3.6.5 | 安裝airflow及其依賴包、開發airflow的dag使用 |
MySQL | 5.7 | 做爲airflow的元數據庫 |
Airflow | 1.10.0 | 任務調度平臺 |
請選擇一臺乾淨的物理機或者雲主機。否則,產生任何多餘影響或者後果,本人概不負責!node
Python3的安裝能夠參考我以前的文章,在此再也不敖述python
3年前也寫過一個關於Centos安裝MySQL的教程,可是雖然實用,可是內容過久,在此咱們用最簡方式快速安裝MySQL並配置用戶(固然,若是你用現成的RDS
也能夠,省去了安裝過程,可直接跳轉至爲Airflow建庫建用戶步驟了)。mysql
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 複製代碼
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
複製代碼
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
複製代碼
sudo yum install mysql-server
sudo chown -R mysql:mysql /var/lib/mysql
複製代碼
sudo service mysqld start
複製代碼
如下操做均在mysql客戶端上進行操做,首先須要鏈接並登陸mysql。linux
用root用戶鏈接登陸mysql:git
mysql -uroot
複製代碼
use mysql; update user set password=password('root') where user='root'; flush privileges; 複製代碼
建庫:github
create database airflow;
複製代碼
建用戶:web
create user 'airflow'@'%' identified by 'airflow'; create user 'airflow'@'localhost' identified by 'airflow'; 複製代碼
爲用戶受權:sql
grant all on airflow.* to 'airflow'@'%'; flush privileges; exit; 複製代碼
萬事既已具有,讓咱們開始進入今天的主題!數據庫
安裝以前須要設置一下臨時環境變量SLUGIFY_USES_TEXT_UNIDECODE
,否則,會致使安裝失敗,命令以下:
export SLUGIFY_USES_TEXT_UNIDECODE=yes 複製代碼
安裝airflow腳手架:
sudo pip install apache-airflow===1.10.0
複製代碼
airflow會被安裝到python3下的site-packages目錄下,完整目錄爲:${PYTHON_HOME}/lib/python3.6/site-packages/airflow
,個人airflow目錄以下所示:
安裝airflow前,咱們須要先配置一下airflow的安裝目錄AIRFLOW_HOME
,同時爲了方便使用airflow的相關命令,咱們也把airflow配置到環境變量中,一勞永逸。
編輯/etc/profile
系統環境變量文件:
sudo vim /etc/profile
複製代碼
作以下修改(固然,具體目錄須要修改爲你本身對應的目錄,不要照搬不動哦):
使修改後的環境變量當即生效:
sudo source /etc/profile 複製代碼
airflow
命令作初始化操做由於配置過airflow的環境變量SITE_AIRFLOW_HOME
,咱們在哪裏執行以下命令均可:
airflow
複製代碼
到此,airflow會在剛剛的AIRFLOW_HOME
目錄下生成一些文件。固然,執行該命令時可能會報一些錯誤,能夠不用理會!生成的文件列表以下所示:
sudo pip install 'apache-airflow[mysql]' 複製代碼
airflow的包依賴安裝都可採用該方式進行安裝,具體可參考airflow官方文檔
[敲黑板,劃重點]
安裝mysql模塊時可能會報以下錯誤:
mysql_config not found
複製代碼
解決步驟以下:
(1)先查看下是否已經存在mysql_config文件:
find / -name mysql_config
複製代碼
(2)若是沒有的話,安裝mysql-devel:
sudo yum install mysql-devel
複製代碼
(3)安裝完成以後,再次驗證是否有mysql_config文件:
修改airflow.cfg文件,配置mysql做爲airflow元數據庫:
這裏就巨坑無比了,不少人的教程裏面都是這麼直接寫的,而後就完蛋了!!!不信你試試看,等下初始化數據庫必死無疑!並且尚未任何有效的解決方案能夠供你搜索!!!其次也不要相信什麼改爲pymysql
配合pymysql包實現,這樣更慘,會有數據類型解析問題,讓你毫無頭緒!!!切記切記!!!
sql_alchemy_conn = mysql://airflow:airflow@localhost:3306/airflow
複製代碼
或
sql_alchemy_conn = mysql+pymysql://airflow:airflow@localhost:3306/airflow
複製代碼
那既然這種方式不可行,該怎麼辦呢?辦法總比困難多的!由於Python3再也不支持MySQLdb了,只有Python2才支持。可是呢,也只有MySQLdb纔是最佳結果。
首先,咱們經過pip安裝一下mysqlclient:
sudo pip install mysqlclient
複製代碼
而後,再經過pip安裝一下MySQLdb:
sudo pip install MySQLdb
複製代碼
最後,咱們修改airflow.cfg文件中的sql_alchemy_conn配置:
sql_alchemy_conn = mysql+mysqldb://airflow:airflow@localhost:3306/airflow
複製代碼
到此,咱們已經爲airflow配置好元數據庫信息且準備好依賴包。
airflow initdb
複製代碼
此時,咱們的mysql元數據庫(庫名爲airflow)中已經新建好了airflow的依賴表:
[敲黑板,劃重點]
此時初始化數據庫時,可能會報以下錯誤:
Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql 複製代碼
該問題的解決方案在Airflow官方文檔中有說明,連接爲:airflow.apache.org/faq.html。須要經過修改MySQL配置文件my.cnf進行處理,步驟以下:
(1)查找my.cnf位置:
mysql --help | grep my.cnf
複製代碼
(2)修改my.cnf文件:
在[mysqld]下面(必定不要寫錯地方)添加以下配置:
explicit_defaults_for_timestamp=true 複製代碼
(3))重啓MySQL使配置生效:
sudo service mysqld restart
複製代碼
(4)查看修改的配置是否生效:
(5)從新執行airflow initdb
便可
airflow xxx -D
airflow list_dags
airflow list_tasks dag_id
airflow pause/unpause dag_id
airflow test dag_id task_id execution_date
[敲黑板,劃重點]
啓動webserver組件時可能會報以下錯誤:
錯誤1:
Error: 'python:airflow.www.gunicorn_config' doesn‘t exist 複製代碼
安裝指定版本的gunicorn便可:
(1) Airflow1.10版本對應gunicorn的19.4.0版本:
sudo pip install gunicorn==19.4.0
複製代碼
(2) Airflow1.8版本安裝gunicorn的19.3.0版本:
sudo pip install gunicorn==19.3.0
複製代碼
錯誤2:
FileNotFoundError: [Errno 2] No such file or directory: 'gunicorn': 'gunicorn' 複製代碼
只須要配置好Python的bin目錄環境變量便可(也能夠參照www.cnblogs.com/lwglinux/p/…):
sudo vim /etc/profile
複製代碼
source /etc/profile 複製代碼
這裏爲何要修改呢?由於SequentialExecutor是單進程順序執行任務,默認執行器,一般只用於測試,LocalExecutor是多進程本地執行任務使用的,CeleryExecutor是分佈式調度使用(固然也能夠單機),生產環境經常使用,DaskExecutor則用於動態任務調度,經常使用於數據分析。
爲何要修改時區呢?由於Airflow默認的時間是GMT時間,雖然能夠在Airflow集羣分佈在不一樣時區時仍可保證時間相同,不會出現時間不一樣步的問題,可是這個時間比北京早8小時,不太符合咱們的閱讀習慣,也不夠簡潔直觀。鑑於咱們一般狀況下,咱們要麼爲單節點服務,要麼即便擴展也是在同一個時區的,因此將時區修改成東八區,即北京時間,這樣更便於咱們使用。
Come on!
(1) 修改airflow.cfg文件:
default_timezone = Asia/Shanghai
複製代碼
這裏修改的是scheduler的調度時間,也就是說在編寫調度時間是能夠直接寫北京時間。
(2) 修改webserver頁面上右上角展現的時間:
須要修改${PATHON_HOME}/lib/python3.6/site-packages/airflow/www/templates/admin/master.html
文件。
修改後效果如圖所示:
(3) 修改webserver lastRun時間:
第1處修改${PATHON_HOME}/lib/python3.6/site-packages/airflow/models.py
文件。
def utc2local(self,utc): import time epoch = time.mktime(utc.timetuple()) offset = datetime.fromtimestamp(epoch) - datetime.utcfromtimestamp(epoch) return utc + offset 複製代碼
效果以下:
第2處修改${PATHON_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") 複製代碼
效果以下:
修改完畢,此時能夠經過重啓webserver查看效果!
在這裏咱們採用簡單的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中會多出來一條記錄的。
固然,你也能夠藉助於第三方插件方式對用戶帳號還有可視化UI創建/修改DAG代碼。連接爲:github.com/lattebank/a…,惋惜只支持到Python2.x。不事後續我會對其作升級處理。
若是scheduler檢測DAG過於頻繁,會致使CPU負載很是高。而默認scheduler檢測時間爲0,也就是沒有時間間隔。
能夠經過修改airflow.cfg文件中的min_file_process_interval
設置時間間隔,以下,我是修改成了5秒檢測一次:
能夠經過修改airflow.cfg文件中的parallelism
來控制scheduler的併發量:
(未完待續...)