Pinterest 開源工作流管理 —— Pinball

g4mm 9年前發布 | 40K 次閱讀 Pinball 工作流引擎

當我們在一個快速動態變化的環境中編譯時,我們需要一個靈活、能滿足我們數據處理需要的工作流管理器;在嘗試了一些選擇后,我們決定自己做一個:PinballPinball能適應從簡單腳本到復雜的分布式計算的廣泛數據處理需要,今天我們開放pinball的源碼。Pinball加入了我們其他的開源項目像SecorBender,這些都存放在我們的Github上;

建立高度定制化的工作流管理器

新的產品特性的開發通常受限于獲得的數據的有效性。通常來自于日志的尚未加工的數據,在到達下游應用處理前往往已經在多個維度被分割、合并或者篩選過。因此,數據轉換處理常常用工作流來建立模型,通過工作流把數據抽象成直觀的、由表示處理步驟的節點和描述運行依賴的邊界組成的圖。

工作流可以是任意復雜的。在現實環境中遇到一個由數百個節點組成的工作流也是不罕見的。建設,運行和維護那樣復雜的工作流需要用專門的工具。一個bash腳本做不了。

嘗試了幾個開源的工作流管理軟件后,我們發現沒有一個軟件有足夠的靈活性來適應我們在數據處理解決方案上不斷變化的需求。特別是,當前可用的解決方案不是只支持一個特定類型的工作(例如Apache Oozie來優化Hadoop計算)或太過抽象難以擴展(例如單一的Azkaban)。考慮到上述的情況,我們開始構建一個高度可定制的工作流管理器,這種管理器可以用來從執行基本的shell命令到在Hadoop, Hive 和Spark之上實現ETL-風格的計算在內的廣泛的數據處理用戶需求。

我們所有的工程團隊都在用Pinball。它基本上每天都要在我們的Hadoop集群中處理百來個工作流,上千個作業,大概3 PB的數據。最大的工作流包含超過500個作業。這些工作流可以生成分析報告,構建用于搜索的索引,訓練機器學習模型,以及完成大量其他類型的任務。

平臺 VS 最終產品

Pinball提供完備的、開箱即用的端到端解決方案。同時,它基于智能組件的設計使得其易于修改維護。Pinball的工作流管理層構建在實現了原子性狀態更新的抽象概念之上。

概念上,Pinball的架構采用的是master-worker(或master-client以避免跟我們下面介紹的一種特殊的客戶類型相混 淆)架構,帶狀態的中央master給無狀態的client提供當前系統狀態的信息。Clients可以是各種各樣的,從負責任務執行的 workers, 到控制什么時候一個工作流應該運行的scheduler,以及允許用戶和系統交互的UI,到命令行工具。所有的clients都使用由 master設定的同樣的語言(協議)通訊,并且他們不能直接通訊。 所以,clients是獨立的,可以很容易的用其他的方案來替代。因為 Pinball設計的靈活性,它被用來構建定制的工作流管理方案的平臺。

Pinterest 開源工作流管理 —— Pinball

雖然定制是可能的,值得一提的是Pinball默認設置是允許用戶來定義clients,運行和監控工作流。

工作流的生命周期

工作流被定義為一個配置文件或者是一個UI工作流生成器,或者甚至是從其他的工作流中導入。Pinball提供了一個插件化的解析器概念讓用戶將他們的工作流表達的格式化。解析器將一組不透明的工作流定義成token(令牌)合集,并呈現出一種Pinball能理解的工作流格式。(請閱讀更多關于Pinball的特性

工作流通過命令行工具或者UI組件來部署。部署從工作流中調用解析器,提取調度token并將其儲存在主配置中。調度令牌中包含了像工作流配置的位置的元數據、工作流的運行時間、復發的處理和溢出的策略。策略描述了如果以前的工作流還沒有結束而且一個新的工作流又開始的情況下系統表現如何。示例策略允許廢棄當前正在運行的工作流并同時開始另一個工作流示例,這是為了運行一個工作流或者在先前的工作流運行結束前延遲工作流。

Pinterest 開源工作流管理 —— Pinball

當運行時間到時,調度器使用存儲在調度令牌中的信息來定位工作流配置,解析它并生成 job 令牌來標定工作流程。工作令牌以一個特定的工作流實例 ID 提交到 master。工作流實例彼此能夠獨立地控制。使得用戶能夠靈活地并行運行多個相同的工作流實例。

Pinterest 開源工作流管理 —— Pinball

Job 令牌被空閑 worker 請求和執行。Job 是在命令行中描述的在子進程中運行。子進程的輸出被捕捉并顯示到 UI 中。Pinball 解釋特殊格式的日志傳遞到 UI 或轉移給下游的任務。這允許我們直接在 Pinball UI 的 Hadoop 作業跟蹤器頁面中嵌入一個鏈接或從上游任務工作到下游任務中傳遞參數。

Pinterest 開源工作流管理 —— Pinball

當工作失敗需要進行后處理時 (例如:有人需要刪除部分的輸出), Pinball 提供了針對工作設置的強制清理命令的功能。 即使此工作已經被定義為在執行中已經中止,清理命令依然能夠保證被執行。

Pinterest 開源工作流管理 —— Pinball

失敗的工作能夠自動或手動的進行重啟。用戶能夠在工作流圖中選擇相關的子工作進行重新啟動。擴展的操作能夠在大型的工作層次中明顯的提升可用性。

當工作實例結束時(不管成功或失敗),能夠選擇是否發送emal通知工作流的發起人。

工作流配置與工作模版

致終端用戶、工作流管理器通常是一個靈活安排和執行他們的工作的黑盒,但需 要以這樣或那樣的方式定義工作流本身。在設計 Pinball 時,我們做了一個慎重的選擇,不使配置一部分語法系統的核心為了給開發人員提供了很大的靈活性在最有意義在一個給定的設置來定義工作流配置的方式。同時, 我們想要提供一個完整的包和較低的準入門檻。所以,我們決定簡化包括解析器和工作模板的版本,我們使用我們的開源版本。

開箱即用的,我們支 持基于 python 工作流配置語法。我們還提供許多工作模板配置簡單的 shell 腳本以及在 Hadoop 平臺上更復雜的計算。我們提供本機支持 EMR 和 Qubole 平臺的動力特性,比如嵌入工作鏈接失敗后的 PinballUI 和清理資源工作。我們也提出一個條件的概念,允許用戶模型數據之間的依賴關系工作(想想工作被推遲到它需要的數據可用時)。

試試我們的項目,讓我們知道你的想法!如果你有興趣從事這樣的項目從里面,加入我們的團隊

 本文由用戶 g4mm 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!