真的是想不通,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
__linux
如下操做均在mysql客戶端上進行操做,首先須要鏈接並登陸mysql。git
用root用戶鏈接登陸mysql:github
mysql -uroot
use mysql; update user set password=password('root') where user='root'; flush privileges;
建庫:web
create database airflow;
建用戶:sql
create user 'airflow'@'%' identified by 'airflow'; create user 'airflow'@'localhost' identified by 'airflow';
爲用戶受權:數據庫
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元數據庫:
_
這裏就巨坑無比了,不少人的教程裏面都是這麼直接寫的,而後就完蛋了!!!不信你試試看,等下初始化數據庫必死無疑!並且尚未任何有效的解決方案能夠供你搜索!!!其次也不要相信什麼改爲<span style="color:green;"> pymysql
</span>配合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官方文檔中有說明,連接爲:http://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
便可
7) 應用的基礎命令
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目錄環境變量便可(也能夠參照http://www.javashuo.com/article/p-ryjiscca-p.html):
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代碼。連接爲:https://github.com/lattebank/airflow-dag-creation-manager-plugin,惋惜只支持到Python2.x。不事後續我會對其作升級處理。
若是scheduler檢測DAG過於頻繁,會致使CPU負載很是高。而默認scheduler檢測時間爲0,也就是沒有時間間隔。
能夠經過修改airflow.cfg文件中的 min_file_process_interval
設置時間間隔,以下,我是修改成了5秒檢測一次:
能夠經過修改airflow.cfg文件中的 parallelism
來控制scheduler的併發量:
(未完待續...)