- 原文地址:Airflow: a workflow management platform
- 原文作者:Maxime Beauchemin
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者:yqian1991
- 校對者:Park-ma DerekDick
Airbnb 是一個快速增長的、資料啟示型的公司。我們的資料團隊和資料量都在快速地增長,同時我們所面臨的挑戰的複雜性也在同步增長。我們正在擴張的資料工程師、資料科學家和分析師團隊在使用 Airflow,它是我們搭建的一個可以快速推進工作,保持發展優勢的平臺,因為我們可以自己編輯、監控和改寫 資料管道。
今天,我們非常自豪地宣佈我們要 開源 和 共享 我們的工作流程管理平臺:Airflow。
有向無環圖(DAGs)呈綻放之勢
當與資料打交道的工作人員開始將他們的流程自動化,那麼寫批處理作業是不可避免的。這些作業必須按照一個給定的時間安排執行,它們通常依賴於一組已有的資料集,並且其它的作業也會依賴於它們。即使你讓好幾個資料工作節點在一起工作很短的一段時間,用於計算的批處理作業也會很快地擴大成一個複雜的圖。現在,如果有一個工作節奏快、中型規模的資料團隊,而且他們在幾年之內要面臨不斷改進的資料基礎設施,並且手頭上還有大量複雜的計算作業網路。那這個複雜性就成為資料團隊需要處理,甚至深入瞭解的一個重要負擔。
這些作業網路通常就是 有向無環圖(DAGs),它們具有以下屬性:
- 已排程: 每個作業應該按計劃好的時間間隔執行
- 關鍵任務: 如果一些作業沒有執行,那我們就有麻煩了
- 演進: 隨著公司和資料團隊的成熟,資料處理也會變得成熟
- 異質性: 現代化的分析技術棧正在快速發生著改變,而且大多數公司都執行著好幾個需要被粘合在一起的系統
每個公司都有一個(或者多個)
工作流程管理 已經成為一個常見的需求,因為大多數公司內部有多種建立和排程作業的方式。你總是可以從古老的 cron 排程器開始,並且很多供應商的開發包都自帶排程功能。下一步就是建立指令碼來呼叫其它的指令碼,這在短期時間內是可以工作的。最終,一些為了解決作業狀態儲存和依賴的簡單框架就湧現了。
通常,這些解決方案都是 被動增長 的,它們都是為了響應特定作業排程需求的增長,而這通常也是因為現有的這種系統的變種連簡單的擴充套件都做不到。同時也請注意,那些編寫資料管道的人通常不是軟體工程師,並且他們的任務和競爭力都是圍繞著處理和分析資料的,而不是搭建工作流程管理系統。
鑑於公司內部工作流程管理系統的成長總是比公司的需求落後至少一代,作業的編輯、排程和錯誤排查之間的 摩擦 製造了大量低效且令人沮喪的事情,這使得資料工作者和他們的高產出路線背道而馳。
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 查詢、瀏覽結果集,同時也提供了建立和分享一些簡單圖表的方法。這個製圖應用是由 Highcharts、Flask Admin 的增刪改查介面以及 Airflow 的 hooks 和 巨集庫混搭而成的。URL 引數可以傳遞給你圖表中使用的 SQL,Airflow 的巨集是通過 Jinja templating 的方式工作的。有了這些特性和查詢功能,Airflow 使用者可以很容易的建立和分享結果集和圖表。
一種催化劑
使用 Airflow 之後,Airbnb 的員工進行資料工作的生產率和熱情提高了好幾倍。管道的編寫也加速了,監控和錯誤排查所花費的時間也顯著減少了。更重要的是,這個平臺允許人們從一個更高階別的抽象中去建立可重用的模組、計算框架以及服務。
說得夠多的了!
我們已經通過一個啟發式的教程把試用 Airflow 變得極其簡單。想看到示例結果也只需要執行幾個 shell 命令。看一看 Airflow 文件 的快速上手和教程部分,你可以在幾分鐘之內就讓你的 Airflow web 程式以及它自帶的互動式例項跑起來!
在 airbnb.io 上檢視我們所有的開源專案並 在 Twitter 上關注我們:@AirbnbEng + @AirbnbData
如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。