一、背景
OPPO 大資料平台目前有 20+個服務元件,資料量超 1EB,離線任務數近百萬,實時任務數千,資料開發分析師超千人。這也帶來了系統複雜度的問題,一方面是使用者經常對自己的任務運作狀況“摸不着頭腦”,不管是性能問題,還是參數配置問題,甚至是一些常見的權限報錯問題,都需要咨詢平台給出具體的解決方案;另一方面是平台面對各類繁雜任務,運維人員經常需要對任務故障定位和排除,由于任務鍊路長,元件日志多,運維壓力大。是以急需對任務進行實時監控和診斷,不僅要能夠幫助使用者快速定位異常問題,還需給出具體的建議和優化方案,同時還能治理各類“僵屍”和不合理任務,進而達到降本增效的目的。據調研,目前業界尚無成熟的開源任務診斷平台。為此我們開發了大資料診斷平台,通過診斷平台周優化任務執行個體數超 2 萬,取得了良好的效果。
“羅盤”(Compass)便是基于 OPPO 内部大資料診斷平台的開源項目,可用于診斷 DolphinScheduler、Airflow 等排程平台上所運作的大資料任務。我們希望通過“羅盤”(Compass)回饋開源社群,也希望更多人參與進來,共同解決任務診斷的痛點和難題。
二、羅盤核心功能
羅盤目前已支援以下功能和特性:
- 非侵入式,即時診斷,無需修改已有的排程平台,即可體驗診斷效果。
- 支援多種主流排程平台,例如 DolphinScheduler、Airflow 或自研等。
- 支援多版本 Spark、Hadoop 2.x 和 3.x 任務日志診斷和解析。
- 支援工作流層異常診斷,識别各種失敗和基線耗時異常問題。
- 支援引擎層異常診斷,包含資料傾斜、大表掃描、記憶體浪費等 14 種異常類型。
- 支援各種日志比對規則編寫和異常門檻值調整,可自行根據實際場景優化。
羅盤已支援診斷類型概覽:
(一)非侵入式,即時診斷
這裡以 DolphinScheduler 排程平台為例。
從架構上看,MasterServer 主要負責 DAG 任務切分、任務送出監控并持久化任務執行個體資料到 DB 中,WorkerServer 主要負責任務的執行和提供日志服務,同時在 UI 提供了檢視遠端日志的功能。為了能夠擷取任務中繼資料和相關日志進行診斷,一個方式是在 MasterServer 中監聽任務狀态事件,另一個方式是訂閱 MySQL binlog 日志。為了減少對 DolphinScheduler 的修改,我們采取了第二種方式。
是以隻需要在 DolphinScheduler 建立一個工作流,并運作,等待運作結束,我們便可在羅盤上看到該任務運作失敗等異常。
羅盤不但實作了對排程平台的解耦,還能在任務運作結束後即時診斷,同時提供了豐富的 UI 展示服務。如果您不需要我們提供的 UI 服務,那也可以直接查詢羅盤診斷的中繼資料,展示在需要的地方。
(二)工作流層異常診斷
對于工作流層的任務執行個體,常見問題可分為兩類:一類是失敗的任務,例如首次失敗、最終運作失敗和長期失敗;另一類是耗時異常的任務,例如基線時間異常、基線耗時異常和運作耗時長。
- 診斷失敗的任務
使用者經常忽略首次失敗,甚至加大重試次數,如果不重視,最終可能會演變為最終失敗。羅盤記錄和診斷分析了每次失敗的原因,不僅可以為使用者快速定位問題,還可以在故障回溯時找到根因。對于長期失敗的任務,需要通知使用者整改或清理,避免造成資源浪費。
- 診斷耗時異常的任務
針對需要 SLA 保障的任務,羅盤不僅分析了相對于曆史正常結束時間,是否提前結束或者晚點結束的任務,即基線時間異常,也分析了相對于曆史正常運作時長,是否運作時間過長或者過短的任務,即基線耗時異常。對于運作耗時長的任務,例如超過幾個小時以上的大任務,使用者和平台都需要分析是任務本身的問題,還是平台的問題。
(三)Spark 引擎層異常診斷
對于 Spark 任務,常見的問題可以歸為三類:一類是運作時報錯,另一類是運作時效率,最後一類是資源使用率問題。
- 診斷運作時報錯異常
引擎層常見報錯有 sql 失敗、shuffle 失敗和記憶體溢出等。此類報錯具有明顯的日志特征,可根據關鍵字提取分類,使用已有的知識庫,提供給使用者具體的解決方案,提升使用者體驗和效率。
羅盤提供了 sql 失敗日志分析的規則,通常涉及到操作權限,庫表不存在及文法等問題,此類問題可直接指引使用者去申請權限。
shuffle 問題會嚴重影響任務運作甚至導緻失敗,需要重點關注,如果您目前沒有更好的解決方案,也可以參考 OPPO 開源的高性能遠端 shuffle 服務。
記憶體溢出也是經常導緻任務失敗的一大問題,可提取關鍵日志診斷分析并建議使用者優化記憶體配置參數。
除了以上問題,羅盤還提供了 40+的日志識别規則及建議,也可自行根據實際場景擴充識别規則。
- 診斷運作時效率異常
如果任務執行耗時較長或者突然變慢,使用者直接在排程平台無法判斷是任務自身問題,還是排程平台問題,亦或是計算引擎的問題。為了排查 Spark 引擎,一般需要專業分析 SparkUI,比較不直覺。羅盤對影響引擎執行效率的問題做了全面的檢測,覆寫大表掃描,資料傾斜,Task 長尾,全局排序,OOM 風險,Job/stage 耗時異常,HDFS 卡頓,推測執行 Task 過多等問題。
- 大表掃描
羅盤對執行的 SQL 掃描表行數,直覺呈現在表格中。如果使用者沒有進行分區條件篩選,可能會發生全表掃描,需要提醒使用者優化 SQL,避免導緻記憶體溢出和影響叢集,以提升運作效率。
- 資料傾斜
羅盤檢測每個 Task 的資料處理量并判斷資料是否傾斜。當資料傾斜時,可能會導緻任務記憶體溢出,計算資源使用率低,作業執行時間超出預期。
- Task 長尾
羅盤檢測所有 Task 的耗時,并按 Stage 呈現在柱狀圖中,友善使用者判斷是哪個 Stage 執行耗時異常。形成的原因一般是讀取資料過多或讀取資料慢。如果是資料傾斜造成讀取資料過多,則按資料傾斜方式處理。如果同時 HDFS 發生卡頓,則會導緻讀取資料慢,則需要排查叢集問題。
- 全局排序異常
使用者經常在 SQL 中使用了排序函數卻不加分區限制,會導緻全局排序。如果隻有一個 Task 處理資料,需要建議使用者重新分區,避免造成資源浪費和影響運作效率。
- OOM 預警分析
羅盤檢測執行 SQL 廣播記憶體占比,當廣播資料過大,會導緻 driver 或 executor 出現 OOM 風險,需要提醒使用者禁用廣播或取消強制廣播,必要時申請增加記憶體。
- Job/stage 耗時異常
羅盤計算每個 Job/stage 實際計算時間和空閑時間,一般是資源不足時出現,需要關注叢集資源問題。
- HDFS 卡頓
當出現 HDFS 卡頓時,會影響 Task 讀取資料速率,進而影響執行效率,需要關注 HDFS 叢集運作狀态。
- 推測執行 Task 過多
推測執行(speculative)是指作業執行單元 Task 在同一個 Stage 中的執行時間相比其他 Task 執行時間長,在其他 Executor 發起相同 Task 執行,先完成的 Task 将 Kill 另個 Task, 并取得結果。需要關注叢集運作狀态。
- 診斷資源使用率異常
對于使用者不确定任務 CPU 和記憶體使用情況,不知道怎麼申請多大規格資源的問題,羅盤直覺呈現了 CPU 和記憶體使用占比,友善使用者優化資源配置參數,以節約資源成本。
羅盤還提供了 GC 日志分析功能,可檢視執行過程 GC 是否存在性能問題。
(四)一鍵診斷、報告總覽等功能
除了以上功能,我們還提供了一鍵診斷的功能,為使用者提供詳細的診斷報告。同時還有報告總覽資料和白名單功能等。
三、羅盤技術架構
羅盤主要由同步工作流層任務中繼資料子產品、同步 Yarn/Spark App 中繼資料子產品、關聯工作流層/引擎層 App 中繼資料子產品、工作流任務異常檢測子產品,引擎層異常檢測子產品,Portal 展示子產品組成。
整體架構圖
整體架構分 3 層:
- 第一層為對接外部系統,包括排程器、Yarn、HistoryServer、HDFS 等系統,同步中繼資料、叢集狀态、運作環境狀态、日志等到診斷系統分析;
- 第二層為架構層,包括資料采集、中繼資料關聯&模型标準化、異常檢測、診斷 Portal 子產品;
- 第三層為基礎元件層,包括 MySQL、Elasticsearch、Kafka、Redis 等元件。
具體子產品流程階段:
(1)資料采集階段:從排程系統将使用者、DAG、作業、執行記錄等工作流中繼資料同步至診斷系統;定時同步 Yarn ResourceManager、Spark HistoryServer App 中繼資料至診斷系統,标志作業運作名額存儲路徑,為後續資料處理階段作基礎;
(2)資料關聯&模型标準化階段:将分步采集的工作流執行記錄、Spark App、Yarn App、叢集運作環境配置等資料通過 ApplicationID 媒體進行關聯,此時,工作流層與引擎層中繼資料已關聯完畢,得到資料标準模型 (user, dag, task, application, clusterConfig, time);
(3)工作流層&引擎層異常檢測階段:至此已經獲得資料标準模型,針對标準模型進一步 Workflow 異常檢測流程,同時平台維護着一套沉澱多年的資料治理知識庫,加載知識庫到标準模型,通過啟發式規則,對标準模型的名額資料、日志同時進行異常挖掘,結合叢集狀态及運作是環境狀态,分析得出工作流層、引擎層異常結果;
(4)業務視圖:存儲、分析資料,提供給使用者任務概覽、工作流層任務診斷、引擎層作業 Application 診斷,工作流層展示排程器執行任務引發的異常,如任務失敗、回環任務、基線偏離任務等問題,計算引擎層展示 Spark 作業執行引發的耗時、資源使用、運作時問題;
四、DolphinScheduler & Compass
DolphinScheduler 是一個分布式和可擴充的開源工作流協調平台,具有強大的 DAG 可視化界面,有着豐富的使用場景,提供 Spark、Hive 和 Flink 等 30+種類型的任務,可靠性高和拓展性強。DolphinScheduler 經曆了多年的實踐和積累,已經成為了一個成熟的開源項目,并有着廣泛的使用者群體。
(一)部署體驗
這裡我們以 DolphinScheduler(2.0.6 版本)為例,體驗如何快速內建羅盤。如果你還沒有部署 DolphinScheduler,可參考官網部署指南。如果你已經在使用 DolphinScheduler,那麼隻需要部署羅盤即可。羅盤支援單機和叢集部署,如果你想要快速體驗羅盤的功能,可使用單機部署模式,羅盤依賴 Kafka、Redis、zookeeper 和 ElasticSearch,需要提前安裝,依賴服務完成後即可通過部署腳本進行羅盤部署:
- 代碼編譯
- 修改配置
- 一鍵部署
(二)使用示例
首先在 DolphinScheduler 建立好項目,
然後建立一個 SPARK 任務的工作流,
最後上線該任務和運作。
打開羅盤 Web UI,預設路徑為-,輸入 DolphinScheduler 的賬号密碼,羅盤自動同步了 DolphinScheduler 使用者資訊。
最後進入任務運作頁面,便可以看到所有的異常任務診斷資訊。
五、羅盤開源規劃
- 羅盤主要圍繞離線排程任務、計算引擎兩個方面對問題進行定位分析,使用豐富的知識庫,提供給使用者解決優化方案,同時達到降本增效的目的。
- 目前已開源部分主要包含對任務工作流和 Spark 引擎層的問題診斷,不久将釋出針對 Flink 任務的異常和資源問題診斷。
- 未來将引入更深層次的算法和診斷模型,實作去規則和門檻值,使異常診斷更加智能化。
六、參與貢獻
Github項目名稱:cubefs/compass
歡迎參與貢獻,如果您有需求或建議可以提 issue 到 Github,我們将及時為您解答。
關于安第斯智能雲
OPPO 安第斯智能雲(AndesBrain)是服務個人、家庭與開發者的泛終端智能雲,緻力于“讓終端更智能”。作為 OPPO 三大核心技術之一,安第斯智能雲提供端雲協同的資料存儲與智能計算服務,是萬物互融的“數智大腦”。