Airflow[v1.10]任務調度平臺的安裝教程

airflow安裝教程

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

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目錄如下所示:
python3-airflow-dir

    1. 正式安裝airflow

安裝airflow前,我們需要先配置一下airflow的安裝目錄AIRFLOW_HOME,同時爲了方便使用airflow的相關命令,我們也把airflow配置到環境變量中,一勞永逸。

編輯/etc/profile系統環境變量文件:

sudo vim /etc/profile

做如下修改(當然,具體目錄需要修改成你自己對應的目錄,不要照搬不動哦):
airflow-env-variable

使修改後的環境變量立即生效:

sudo source /etc/profile
  • 3)執行airflow命令做初始化操作

因爲配置過airflow的環境變量SITE_AIRFLOW_HOME,我們在哪裏執行如下命令都可:

airflow

到此,airflow會在剛剛的AIRFLOW_HOME目錄下生成一些文件。當然,執行該命令時可能會報一些錯誤,可以不用理會!生成的文件列表如下所示:
airflow-init-file

    1. 爲airflow安裝mysql模塊
sudo pip install 'apache-airflow[mysql]'

airflow的包依賴安裝均可採用該方式進行安裝,具體可參考airflow官方文檔

    1. 採用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配置好元數據庫信息且準備好依賴包。

    1. 初始化元數據庫信息(其實也就是新建airflow依賴的表)
airflow initdb

此時,我們的mysql元數據庫(庫名爲airflow)中已經新建好了airflow的依賴表:

airflow-metadata

    1. 應用的基礎命令
    • 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進階篇

    1. 初識executor

airflow-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文件。

airflow-webserver-time

修改後效果如圖所示:

airflow-webserver-time-2

(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

效果如下:

airflow-code-modify

第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")

效果如下:

airflow-code-modify-2

修改完畢,此時可以通過重啓webserver查看效果!

    1. 添加用戶認證

在這裏我們採用簡單的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中會多出來一條記錄的。

    1. 修改webserver地址

airflow-webserver-url

4.3高級篇

    1. 配置Airflow分佈式集羣

(未完待續…)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章