【airflow實戰系列】 基於 python 的調度和監控工作流的平臺

簡介

airflow 是一個使用python語言編寫的data pipeline調度和監控工作流的平臺。Airflow被Airbnb內部用來創建、監控和調整數據管道。任何工作流都可以在這個使用Python來編寫的平臺上運行。

Airflow是一種允許工作流開發人員輕鬆創建、維護和週期性地調度運行工作流(即有向無環圖或成爲DAGs)的工具。在Airbnb中,這些工作流包括瞭如數據存儲、增長分析、Email發送、A/B測試等等這些跨越多部門的用例。

這個平臺擁有和 Hive、Presto、MySQL、HDFS、Postgres和S3交互的能力,並且提供了鉤子使得系統擁有很好地擴展性。除了一個命令行界面,該工具還提供了一個基於Web的用戶界面讓您可以可視化管道的依賴關係、監控進度、觸發任務等。

傳統Workflow通常使用TextFiles(json,xml/etc)來定義DAG,然後Scheduler解析這些DAG文件形成具體的TaskObject執行;Airflow沒這麼幹,它直接用Python寫DAGdefinition,一下子突破了文本文件表達能力的侷限,定義DAG變得簡單。

Airflow的架構

在一個可擴展的生產環境中,Airflow含有以下組件:

  • 一個元數據庫(MySQL或Postgres)

  • 一組Airflow工作節點

  • 一個調節器(Redis或RabbitMQ)

  • 一個Airflow Web服務器

所有這些組件可以在一個機器上隨意擴展運行。如果使用LocalExcuter來適度的安裝則可以獲得相當多的額外性能。

優點

  • python腳本實現DAG,非常容易擴展

  • 工作流依賴可視化

  • no XML

  • 可測試

  • 可作爲crontab的替代

  • 可實現複雜的依賴規則

  • Pools

  • CLI和Web UI

功能簡介

常見命令

  • initdb,初始化元數據DB,元數據包括了DAG本身的信息、運行信息等;

  • resetdb,清空元數據DB;

  • list_dags,列出所有DAG;

  • list_tasks,列出某DAG的所有task;

  • test,測試某task的運行狀況;

  • backfill,測試某DAG在設定的日期區間的運行狀況;

  • webserver,開啓webserver服務;

  • scheduler,用於監控與觸發DAG。

ETL

ETL,是英文 Extract-Transform-Load 的縮寫,用來描述將數據從來源端經過抽取(extract)、轉換(transform)、加載(load)至目的端的過程。ETL一詞較常用在數據倉庫,但其對象並不限於數據倉庫。

Airflow設計時,只是爲了很好的處理ETL任務而已,但是其精良的設計,正好可以用來解決任務的各種依賴問題。

任務依賴

通常,在一個運維繫統,數據分析系統,或測試系統等大型系統中,我們會有各種各樣的依賴需求。比如:

  • 時間依賴:任務需要等待某一個時間點觸發

  • 外部系統依賴:任務依賴Mysql中的數據,HDFS中的數據等等,這些不同的外部系統需要調用接口去訪問

  • 機器依賴:任務的執行只能在特定的某一臺機器的環境中,可能這臺機器內存比較大,也可能只有那臺機器上有特殊的庫文件

  • 任務間依賴:任務A需要在任務B完成後啓動,兩個任務互相間會產生影響

  • 資源依賴:任務消耗資源非常多,使用同一個資源的任務需要被限制,比如跑個數據轉換任務要10個G,機器一共就30個G,最多隻能跑兩個,我希望類似的任務排個隊

  • 權限依賴:某種任務只能由某個權限的用戶啓動

也許大家會覺得這些是在任務程序中的邏輯需要處理的部分,但是我認爲,這些邏輯可以抽象爲任務控制邏輯的部分,和實際任務執行邏輯解耦合。

如何理解Crontab

現在讓我們來看下最常用的依賴管理系統,Crontab

在各種系統中,總有些定時任務需要處理,每當在這個時候,我們第一個想到的總是crontab。

確實,crontab可以很好的處理定時執行任務的需求,但是對於crontab來說,執行任務,只是調用一個程序如此簡單,而程序中的各種邏輯都不屬於crontab的管轄範圍(很好的遵循了KISS)

所以我們可以抽象的認爲:

crontab是一種依賴管理系統,而且只管理時間上的依賴。

Airflow的處理依賴的方式

Airflow的核心概念,是DAG(有向無環圖),DAG由一個或多個TASK組成,而這個DAG正是解決了上文所說的任務間依賴。Task A 執行完成後才能執行 Task B,多個Task之間的依賴關係可以很好的用DAG表示完善

Airflow完整的支持crontab表達式,也支持直接使用python的datatime表述時間,還可以用datatime的delta表述時間差。這樣可以解決任務的時間依賴問題。

Airflow在CeleryExecuter下可以使用不同的用戶啓動Worker,不同的Worker監聽不同的Queue,這樣可以解決用戶權限依賴問題。Worker也可以啓動在多個不同的機器上,解決機器依賴的問題。

Airflow可以爲任意一個Task指定一個抽象的Pool,每個Pool可以指定一個Slot數。每當一個Task啓動時,就佔用一個Slot,當Slot數佔滿時,其餘的任務就處於等待狀態。這樣就解決了資源依賴問題。

Airflow中有Hook機制(其實我覺得不應該叫Hook),作用時建立一個與外部數據系統之間的連接,比如Mysql,HDFS,本地文件系統(文件系統也被認爲是外部系統)等,通過拓展Hook能夠接入任意的外部系統的接口進行連接,這樣就解決的外部系統依賴問題。

參考

http://wingerted.com/2017/02/20/introduce-to-airflow/

https://www.youtube.com/watch?v=cHATHSB_450

https://www.youtube.com/watch?v=Pr0FrvIIfTU

 

文章來源於https://www.cnblogs.com/qyun/p/6791857.html

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