Pinterest 開源工作流管理 —— Pinball

oschina發表於2015-04-25

當我們在一個快速動態變化的環境中編譯時,我們需要一個靈活、能滿足我們資料處理需要的工作流管理器;在嘗試了一些選擇後,我們決定自己做一個:Pinball。Pinball能適應從簡單指令碼到複雜的分散式計算的廣泛資料處理需要,今天我們開放pinball的原始碼。Pinball加入了我們其他的開源專案像Secor和Bender,這些都存放在我們的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 和清理資源工作。我們也提出一個條件的概念,允許使用者模型資料之間的依賴關係工作(想想工作被推遲到它需要的資料可用時)。

相關文章