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

airflow安裝教程

0.背景

真的是想不通,Airflow不論社區活躍度仍是Github的star數都是遠勝於Azkaban還有EasyScheduler的,可是爲什麼卻連一個完備的安裝教程都沒有呢?是個人需求過高?真的是心累不已,整整把搜索引擎還有youtube翻來覆去也沒讓我感到知足……不過好在,一步一坑一腳印的最終搭建連通好了環境以及Operator。好了,廢話很少說,開始Airflow今日份安裝教程。html

1.安裝前準備工做

  • 安裝版本說明
安裝工具 版本 用途
Python 3.6.5 安裝airflow及其依賴包、開發airflow的dag使用
MySQL 5.7 做爲airflow的元數據庫
Airflow 1.10.0 任務調度平臺

請選擇一臺乾淨的物理機或者雲主機。否則,產生任何多餘影響或者後果,本人概不負責!node

  • 請確保你熟悉Linux環境及基本操做命令,順便會一些Python基礎命令,若是不熟悉,請出門左轉充完電再來

2.安裝Python3

Python3的安裝能夠參考我以前的文章,在此再也不敖述python

3.安裝MySQL

3年前也寫過一個關於Centos安裝MySQL的教程,可是雖然實用,可是內容過久,在此咱們用最簡方式快速安裝MySQL並配置用戶(固然,若是你用現成的RDS也能夠,省去了安裝過程,可直接跳轉至爲Airflow建庫建用戶步驟了)。mysql

  • 老規矩,卸載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
sudo service mysqld start
複製代碼

如下操做均在mysql客戶端上進行操做,首先須要鏈接並登陸mysql。linux

用root用戶鏈接登陸mysql:git

mysql -uroot
複製代碼
  • 重置mysql密碼
use mysql;

update user set password=password('root') where user='root';

flush privileges;
複製代碼
  • 爲Airflow建庫、建用戶

建庫: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;
複製代碼

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官方文檔


[敲黑板,劃重點]

安裝mysql模塊時可能會報以下錯誤:

mysql_config not found
複製代碼

解決步驟以下:

(1)先查看下是否已經存在mysql_config文件:

find / -name mysql_config
複製代碼

(2)若是沒有的話,安裝mysql-devel:

sudo yum install mysql-devel
複製代碼

(3)安裝完成以後,再次驗證是否有mysql_config文件:

airflow-mysql_config_install


    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


[敲黑板,劃重點]

此時初始化數據庫時,可能會報以下錯誤:

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
複製代碼

airflow-mysql-cnf-pos

(2)修改my.cnf文件:

[mysqld]下面(必定不要寫錯地方)添加以下配置:

explicit_defaults_for_timestamp=true
複製代碼

airflow-mysql-cnf-modify

(3))重啓MySQL使配置生效:

sudo service mysqld restart
複製代碼

(4)查看修改的配置是否生效:

airflow-mysql-cnf-result

(5)從新執行airflow initdb便可


    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

[敲黑板,劃重點]

啓動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
複製代碼

airflow-python-bin-dir

source /etc/profile
複製代碼

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 = '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。不事後續我會對其作升級處理。

    1. 修改webserver地址(須要重啓生效)

airflow-webserver-url

    1. 如何修改檢測新DAG間隔(須要重啓生效)

若是scheduler檢測DAG過於頻繁,會致使CPU負載很是高。而默認scheduler檢測時間爲0,也就是沒有時間間隔。

能夠經過修改airflow.cfg文件中的min_file_process_interval設置時間間隔,以下,我是修改成了5秒檢測一次:

airflow-scheduler-check-time

    1. 如何修改scheduler線程數控制併發量(須要重啓生效)

能夠經過修改airflow.cfg文件中的parallelism來控制scheduler的併發量:

airflow-scheduler-parallelism

4.3高級篇

    1. 配置Airflow分佈式集羣

(未完待續...)

相關文章
相關標籤/搜索