[譯] Airflow: 一個工做流程管理平臺

出自 Maxime Beaucheminhtml

Airbnb 是一個快速增加的、數據啓示型的公司。咱們的數據團隊和數據量都在快速地增加,同時咱們所面臨的挑戰的複雜性也在同步增加。咱們正在擴張的數據工程師、數據科學家和分析師團隊在使用 Airflow,它是咱們搭建的一個能夠快速推動工做,保持發展優點的平臺,由於咱們能夠本身編輯、監控和改寫 數據管道前端

今天,咱們很是自豪地宣佈咱們要 開源共享 咱們的工做流程管理平臺:Airflowpython

github.com/airbnb/airf…android


有向無環圖(DAGs)呈綻開之勢

當與數據打交道的工做人員開始將他們的流程自動化,那麼寫批處理做業是不可避免的。這些做業必須按照一個給定的時間安排執行,它們一般依賴於一組已有的數據集,而且其它的做業也會依賴於它們。即便你讓好幾個數據工做節點在一塊兒工做很短的一段時間,用於計算的批處理做業也會很快地擴大成一個複雜的圖。如今,若是有一個工做節奏快、中型規模的數據團隊,並且他們在幾年以內要面臨不斷改進的數據基礎設施,而且手頭上還有大量複雜的計算做業網絡。那這個複雜性就成爲數據團隊須要處理,甚至深刻了解的一個重要負擔。ios

這些做業網絡一般就是 有向無環圖DAGs),它們具備如下屬性:git

  • 已排程: 每一個做業應該按計劃好的時間間隔運行
  • 關鍵任務: 若是一些做業沒有運行,那咱們就有麻煩了
  • 演進: 隨着公司和數據團隊的成熟,數據處理也會變得成熟
  • 異質性: 現代化的分析技術棧正在快速發生着改變,並且大多數公司都運行着好幾個須要被粘合在一塊兒的系統

每一個公司都有一個(或者多個)

工做流程管理 已經成爲一個常見的需求,由於大多數公司內部有多種建立和調度做業的方式。你老是能夠從古老的 cron 調度器開始,而且不少供應商的開發包都自帶調度功能。下一步就是建立腳原本調用其它的腳本,這在短時間時間內是能夠工做的。最終,一些爲了解決做業狀態存儲和依賴的簡單框架就涌現了。github

一般,這些解決方案都是 被動增加 的,它們都是爲了響應特定做業調度需求的增加,而這一般也是由於現有的這種系統的變種連簡單的擴展都作不到。同時也請注意,那些編寫數據管道的人一般不是軟件工程師,而且他們的任務和競爭力都是圍繞着處理和分析數據的,而不是搭建工做流程管理系統。web

鑑於公司內部工做流程管理系統的成長老是比公司的需求落後至少一代,做業的編輯、調度和錯誤排查之間的 摩擦 製造了大量低效且使人沮喪的事情,這使得數據工做者和他們的高產出路線背道而馳。shell

Airflow

在評審完開源解決方案,同時聽取 Airbnb 的員工對他們過去使用的系統的看法後,咱們得出的結論是市場上沒有任何能夠知足咱們當前和將來需求的方案。咱們決定搭建一個嶄新的系統來正確地解決這個問題。隨着這個項目的開發進展,咱們意識到咱們有一個極好的機會去回饋咱們也極度依賴的開源社區。所以,咱們決定依照 Apache 的許可開源這個項目。數據庫

這裏是 Airbnb 的一些靠 Airflow 推進的處理工序:

  • 數據倉儲: 清洗、組織規劃、數據質量檢測而且將數據發佈到咱們持續增加的數據倉庫中去
  • 增加分析: 計算關於住客和房主參與度的指標以及增加審計
  • 試驗: 計算咱們 A/B 測試試驗框架的邏輯並進行合計
  • 定向電子郵件: 對目標使用規則而且經過羣發郵件來吸引用戶
  • 會話(Sessionization): 計算點擊流和停留時間的數據集
  • 搜索: 計算搜索排名相關的指標
  • 數據基礎架構維護: 數據庫抓取、文件夾清理以及應用數據留存策略...

架構

就像英語是商務活動常用的語言同樣,Python 已經穩固地將本身樹立爲數據工做的語言。Airflow 從建立之初就是用 Python 編寫的。代碼庫可擴展、文檔齊全、風格一致、語法過檢而且有很高的單元測試覆蓋率。

管道的編寫也是用 Python 完成的,這意味着經過配置文件或者其餘元數據進行動態管道生成是與生俱來的。「配置即代碼」 是咱們爲了達到這個目的而堅守的準則。雖然基於 yaml 或者 json 的做業配置方式可讓咱們用任何語言來生成 Airflow 數據管道,可是咱們感受到轉化過程當中的一些流動性喪失了。可以內省代碼(ipython!和集成開發工具)子類和元程序而且使用導入的庫來幫助編寫數據管道爲 Airflow 增長了巨大的價值。注意,只要你能寫 Python 代碼來解釋配置,你仍是能夠用任何編程語言或者標記語言來編輯做業。

你僅需幾行命令就可讓 Airflow 運行起來,可是它的完整架構包含有下面這麼多組件:

  • 做業定義,包含在源代碼控制中。
  • 一個豐富的 命令行工具 (命令行接口) 用來測試、運行、回填、描述和清理你的有向無環圖的組成部件。
  • 一個 web 應用程序,用來瀏覽有向無環圖的定義、依賴項、進度、元數據和日誌。web 服務器打包在 Airflow 裏面而且是基於 Python web 框架 Flask 構建的。
  • 一個 元數據倉庫,一般是一個 MySQL 或者 Postgres 數據庫,Airflow 能夠用它來記錄任務做業狀態和其它持久化的信息。
  • 一組 工做節點,以分佈式的方式運行做業的任務實例。
  • 調度 程序,觸發準備運行的任務實例。

可擴展性

Airflow 自帶各類與 Hive、Presto、MySQL、HDFS、Postgres 和 S3 這些經常使用系統交互的方法,而且容許你觸發任意的腳本,基礎模塊也被設計得很是容易進行擴展。

Hooks 被定義成外部系統的抽象而且共享一樣的接口。Hooks 使用中心化的 vault 數據庫將主機/端口/登陸名/密碼信息進行抽象而且提供了可供調用的方法來跟這些系統進行交互。

操做符 利用 hooks 生成特定的任務,這些任務在實例化後就變成了數據流程中的節點。全部的操做符都派生自 BaseOperator 而且繼承了一組豐富的屬性和方法。三種主流的操做符分別是:

  • 執行 動做 的操做符, 或者通知其它系統去執行一個動做
  • 轉移 操做符將數據從一個系統移動到另外一個系統
  • 傳感器 是一類特定的操做符,它們會一直運行直到知足了特定的條件

執行器(Executors) 實現了一個接口,它可讓 Airflow 組件(命令行接口、調度器和 web 服務器)能夠遠程執行做業。目前,Airflow 自帶一個 SequentialExecutor(用來作測試)、一個多線程的 LocalExecutor、一個使用了 Celery 的 CeleryExecutor 和一個超棒的基於分佈式消息傳遞的異步任務隊列。咱們也計劃在不久後開源 YarnExecutor。

一個絢麗的用戶界面

雖然 Airflow 提供了一個豐富的命令行接口,可是最好的工做流監控和交互辦法仍是使用 web 用戶接口。你能夠容易地圖形化顯示管道依賴項、查看進度、輕鬆獲取日誌、查閱相關代碼、觸發任務、修正 false positives/negatives 以及分析任務消耗的時間,同時你也能獲得一個任務一般在天天何時結束的全面視圖。用戶界面也提供了一些管理功能:管理鏈接、池和暫停有向無環圖的進程。

錦上添花的是,用戶界面有一個 Data Profiling 區,可讓用戶在註冊好的鏈接上進行 SQL 查詢、瀏覽結果集,同時也提供了建立和分享一些簡單圖表的方法。這個製圖應用是由 HighchartsFlask Admin 的增刪改查接口以及 Airflow 的 hooks庫混搭而成的。URL 參數能夠傳遞給你圖表中使用的 SQL,Airflow 的宏是經過 Jinja templating 的方式工做的。有了這些特性和查詢功能,Airflow 用戶能夠很容易的建立和分享結果集和圖表。

一種催化劑

使用 Airflow 以後,Airbnb 的員工進行數據工做的生產率和熱情提升了好幾倍。管道的編寫也加速了,監控和錯誤排查所花費的時間也顯著減小了。更重要的是,這個平臺容許人們從一個更高級別的抽象中去建立可重用的模塊、計算框架以及服務。

說得夠多的了!

咱們已經經過一個啓發式的教程把試用 Airflow 變得極其簡單。想看到示例結果也只須要執行幾個 shell 命令。看一看 Airflow 文檔快速上手教程部分,你能夠在幾分鐘以內就讓你的 Airflow web 程序以及它自帶的交互式實例跑起來!

github.com/airbnb/airf…

airbnb.io 上查看咱們全部的開源項目並 在 Twitter 上關注咱們:@AirbnbEng + @AirbnbData

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索