0.背景
真的是想不通,Airflow不論社區活躍度還是Github的star數都是遠勝於Azkaban還有EasyScheduler的,但是爲何卻連一個完備的安裝教程都沒有呢?是我的需求太高?真的是心累不已,整整把搜索引擎還有youtube翻來覆去也沒讓我感到滿足……不過好在,一步一坑一腳印的最終搭建連通好了環境以及Operator。好了,廢話不多說,開始Airflow今日份安裝教程。
1.安裝前準備工作
- 安裝版本說明
安裝工具 | 版本 | 用途 |
---|---|---|
Python | 3.6.5 | 安裝airflow及其依賴包、開發airflow的dag使用 |
MySQL | 5.7 | 作爲airflow的元數據庫 |
Airflow | 1.10.0 | 任務調度平臺 |
請選擇一臺乾淨的物理機或者雲主機。不然,產生任何多餘影響或者後果,本人概不負責!
- 請確保你熟悉Linux環境及基本操作命令,順便會一些Python基礎命令,如果不熟悉,請出門左轉充完電再來
2.安裝Python3
3.安裝MySQL
3年前也寫過一個關於Centos安裝MySQL的教程,但是雖然實用,但是內容太久,在此我們用最簡方式快速安裝MySQL並配置用戶(當然,如果你用現成的RDS
也可以,省去了安裝過程,可直接跳轉至爲Airflow建庫建用戶步驟了)。
- 老規矩,卸載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 http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
- 通過rpm安裝
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
- 安裝mysql並授權
sudo yum install mysql-server
sudo chown -R mysql:mysql /var/lib/mysql
- 啓動mysql
service mysqld start
以下操作均在mysql客戶端上進行操作,首先需要連接並登錄mysql。
用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'@'%';
flush privileges;
exit;
4.安裝Airflow
萬事既已具備,讓我們開始進入今天的主題!
4.1基礎篇
- 1)通過pip安裝airflow腳手架
安裝之前需要設置一下臨時環境變量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的安裝目錄AIRFLOW_HOME
,同時爲了方便使用airflow的相關命令,我們也把airflow配置到環境變量中,一勞永逸。
編輯/etc/profile
系統環境變量文件:
sudo vim /etc/profile
做如下修改(當然,具體目錄需要修改成你自己對應的目錄,不要照搬不動哦):
使修改後的環境變量立即生效:
sudo source /etc/profile
- 3)執行
airflow
命令做初始化操作
因爲配置過airflow的環境變量SITE_AIRFLOW_HOME
,我們在哪裏執行如下命令都可:
airflow
到此,airflow會在剛剛的AIRFLOW_HOME
目錄下生成一些文件。當然,執行該命令時可能會報一些錯誤,可以不用理會!生成的文件列表如下所示:
-
- 爲airflow安裝mysql模塊
sudo pip install 'apache-airflow[mysql]'
airflow的包依賴安裝均可採用該方式進行安裝,具體可參考airflow官方文檔
-
- 採用mysql作爲airflow的元數據庫
修改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依賴的表)
airflow initdb
此時,我們的mysql元數據庫(庫名爲airflow)中已經新建好了airflow的依賴表:
-
- 應用的基礎命令
- airflow組件:webserver, scheduler, worker, flower
- 後臺啓動各組件命令:
airflow xxx -D
- 查看dag列表:
airflow list_dags
- 查看某個dag的任務列表:
airflow list_tasks dag_id
- 掛起/恢復某個dag:
airflow pause/unpause dag_id
- 測試某個dag任務:
airflow test dag_id task_id execution_date
4.2進階篇
-
- 初識executor
這裏爲什麼要修改呢?因爲SequentialExecutor是單進程順序執行任務,默認執行器,通常只用於測試,LocalExecutor是多進程本地執行任務使用的,CeleryExecutor是分佈式調度使用(當然也可以單機),生產環境常用,DaskExecutor則用於動態任務調度,常用於數據分析。
- 2)如何修改時區爲東八區
爲什麼要修改時區呢?因爲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 = '[email protected]'
user.password = 'airflow'
session = settings.Session()
session.add(user)
session.commit()
session.close()
exit()
執行add_account.py
文件:
python add_account.py
你會發現mysql元數據庫表user中會多出來一條記錄的。
-
- 修改webserver地址
4.3高級篇
-
- 配置Airflow分佈式集羣
(未完待續…)