- 原文地址:What we learned migrating off Cron to Airflow
- 原文做者:Katie Macias
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:cf020031308
- 校對者:yqian1991
去年秋天,VideoAmp 數據工程部門正在進行重大變革。當時的團隊由三名數據工程師和一名與咱們密切合做的系統工程師組成。咱們集體肯定了如何優化公司的技術債。前端
當時,數據團隊是全部批處理做業的惟一全部者,這些做業從咱們的實時競價倉庫獲取反饋,提供給 Postgres 數據庫,由 Postgres 數據庫向 UI 填充。若是這些做業失敗,UI 就會過期,咱們的內部交易員和外部客戶將只有陳舊數據可供依據。所以,知足這些做業的服務等級協議對於平臺的成功相當重要。大多數這些做業都是用 Scala 構建的,而且使用了 Spark。這些批處理做業經過 Cron(一種內置於 Linux 的調度工具)被精心地編排。android
Cron 的優勢ios
咱們發現 Cron 形成的一些主要的痛點甚至蓋過了其帶來的好處。 Cron 內置於 Linux 中,無需安裝。此外,Cron 至關可靠,這使它成爲一個吸引人的選擇。所以,Cron 是項目概念證實的絕佳選擇。但成規模使用時效果並很差。git
Crontab 文件:之前如何安排應用程序github
Cron 的缺點數據庫
Cron 的第一個問題是對 crontab 文件的更改不容易追蹤。 crontab 文件包含了在該計算機上運行的做業的調度計劃,這些計劃是跨項目的,但不會在源碼管理中跟蹤,也不會集成到單個項目的部署過程當中。相反,工程師會隨須要進行編輯,但不記錄時間或項目依賴。後端
第二個問題是做業效果不透明。 Cron 的日誌是輸出到運行做業的服務器上 —— 而不是集中到某處一塊兒。開發人員如何知道做業是成功仍是失敗?不論開發人員是本身瀏覽,仍是須要暴露給下游工程團隊使用,解析日誌獲取這些細節都是昂貴的。bash
最後,從新運行失敗的做業是權宜且困難的。默認狀況下,Cron 只設置了一些環境變量。新手開發人員常常會驚訝地發現存儲在 crontab 文件中的 bash 命令不會產生與其終端相同的輸出,由於他們的 bash 配置文件中的設置並不存在於 Cron 環境中。這要求開發人員構建出執行命令的用戶環境的全部依賴關係。服務器
很明顯,須要在 Cron 之上構建許多工具才能得到成功。雖然咱們略微解決了一些,但咱們知道有許多功能更強大的開源選項可用。咱們整個團隊使用過的編排工具統共有 Luigi、Oozie 和其餘定製解決方案等,但最終這些經歷仍讓咱們以爲不滿。而 AirBnB 的 Airflow 能入選 Apache 孵化器,這正意味着它衆望所歸。ide
設置和遷移
以典型的黑客方式,咱們祕密地從現有技術棧中獲取資源,經過設置 Airflow metadb 和主機來證實咱們的想法。
此 metadb 包含了重要的信息,如單向無環圖(DAG)和任務清單、做業的效果和結果,以及用於向其餘任務發送信號的變量。 Airflow metadb 能夠構建在諸如 PostgreSQL 或 SQLite 之類的關係數據庫之上。經過這種依賴,Airflow 能夠擴展到單個實例以外。咱們就挪用了 Amazon RDS 平臺上咱們另外一個團隊用於開發的 PostgreSQL 虛擬機(他們的開發衝刺結束了,他們再也不使用這個實例)。
Airflow 主機安裝在咱們的 spark 開發虛擬機上,是咱們 spark 集羣的一部分。該主機上配置了 LocalExecutor,並運行着調度程序和用於 Airflow 的 UI。安裝在咱們的 spark 集羣中的一個實例上後,咱們的做業具備了執行所須要的 spark 依賴項的權限。這是成功遷移的關鍵,也是以前嘗試失敗的緣由。
從 Cron 遷移到 Airflow 帶來了特殊的挑戰。因爲 Airflow 自帶任務調度,咱們不得不修改咱們的應用程序以獲取新格式的輸入。幸運的是,Airflow 經過變量爲調度腳本提供必要的元信息。咱們還去除了咱們在其中構建的大部分工具的應用程序,例如推送警報和信號。最後,咱們最終將許多應用程序拆分爲較小的任務,以遵循 DAG 範例。
Airflow UI:開發人員能夠清楚地從 UI 中辨別出哪些 Dags 是穩定的,哪些不那麼健壯,須要強化。
獲得的教訓
五個月後,VideoAmp 的數據工程團隊規模幾乎增長了兩倍。咱們管理着 36 個 DAG,而且數量還在增長! Airflow 通過擴展可以讓咱們全部的工程師爲咱們的批處理流程作出貢獻和支持。該工具的簡單性使得新工程師上手相對無痛。該團隊正在快速開發改進,例如對咱們的 slack 頻道進行統一的推送告警、升級到 Python3 Airflow、轉移到 CeleryExecutor,以及利用 Airflow 提供的強大功能。
有任何疑問或意見可在這裏直接詢問,或在下面分享你的經驗。
若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。