OPPO實時計算平臺基於雲原生的作業彈性伸縮設計與實踐
文章大綱:
一、背景
二、技術方案
-
2.1 整體架構 -
2.2 方案詳述:
1.縱向伸縮:
2.橫向伸縮
三、方案實踐及效果
3.1 彈性伸縮
3.2 自動診斷
四、後續規劃
-
資源初始固定。任務需要在提交之前明確資源用量且作業執行過程中不會自動調整 -
任務常駐。由於資料來源多為無界流式資料。一旦有新的流資料進入任務,它會立刻發起並進行一次計算任務,因此整個過程是持續進行的; -
負載呈週期性變化。實時作業流量和負載會隨著時間的變化出現明顯的波峰波谷
-
調優困難。通常,使用者需要花費大量的時間進行作業調優。例如,新上線一個作業,需要考慮如何配置該作業的資源、併發數、TaskManager個數及大小等 -
資源用量無法匹配負載的變化。由於實時作業的負載往往隨著流量的變化而變化,初始設定的資源量容易過多或太少,從而造成資源浪費或者資源不足而導致作業延時。而解決這個問題使用者往往需要手動重啟作業再次設定資源用量,而這種操作繁瑣的同時也是滯後的

-
SmartResource負責根據作業上報的指標、使用者自定義的監控規則、全鏈路診斷規則來判斷當前作業的執行的健康度,作業是否需要伸縮均源於此。 -
Flink 計算框架使用自研自適應排程器RescaleMonitor,自動感知資源的變化,動態改變運算元的並行度,並重新排程作業。
整體流程如下:
使用者配置自定義的伸縮策略到 SmartResource
SmartResource 將相關的策略轉化為告警規則並配置到雲監控上
雲監控的資料來自 Flink 叢集上報的作業相關的各種指標
雲監控觸發告警時回撥指定的 SmartResource 介面,SR 根據告警資訊,在任務鏈路打上優化建議Tag;此外,需要調整資源的,結合使用者配置的伸縮規則自動計算需要伸縮的副本數,並告知後端服務
後端服務收到伸縮請求後,再次將此請求在診斷聯調上應用一遍來確認是否是個有效的請求,如果是會在資料庫中儲存一個狀態為 pending 的伸縮請求
當作業的 Checkpoint 完成後,會通知 ostream backend 然後開始執行Flink計算資源的伸縮

-
當 TaskManager增減的時候 JobManager 以及已經申請的 TaskManager不能丟失,也就是怎麼保持已申請的資源? -
當 TaskManager增減的時候 JobManager 要快速感知新增的 slot,也就是如何感知資源變化並快速排程Job?
-
雲原生一鍵部署; -
自動推斷資源引數; -
自研KSA Resourcemanager管理已申請資源; -
與現有管理平臺無縫整合 -
通過k8s的watch機制自動追蹤資源狀態;
-
快速部署 。只要有外部資源增加的時候,RescaleMonitor會判斷是否滿足排程作業的最小資源,如果滿足就會立刻部署 jobgraph,不滿足會一直等待。 -
快速失敗 。當有外部資源減少的時候,依賴於Kubernetes的watch機制可以快速感知資源的變化,無需等待資源超時。此處我們以pod名字作為Resource ID,可以在內部快速定位資源建立連線,進而執行各種操作。 -
安全恢復 。當有外部資源增減的時候不會立即執行,Pending下來等待checkpoint完成的時候會檢查是否存在資源增減的Request,如果由才會立即執行重新部署JobGrap並從當前完成的checkpoint恢復,這樣在保證作業不丟的情況下,儘量減少重複消費資料的可能。 -
可固定併發 。支援固定某些運算元的最大併發,這在作業類似是消費 kafka 的時候特別有用。 -
UI聯動 。當資源變化的時候會實時通知web前端實時顯示最新的資源用量。

彈性伸縮效果圖如下,通過途中可以看出,作業在cpu利用率低時,自動降低的併發。
我們記錄了每次伸縮的事件,包括時間、觸發原因,伸縮前後的資源等,方便平臺跟使用者跟蹤資源的變化和排查問題。
通過我們的智慧診斷服務可以自動優化整個作業的資源配比,在不重啟作業的情況下完成TM的動態調整。
優化後的效果如下
-
batch任務的自適應排程 -
基於機器學習的自動化診斷 -
流批一體的錯峰排程
附錄
https://nightlies.apache.org/flink/flink-docs-master/zh/docs/deployment/elastic_scaling/
https://cwiki.apache.org/confluence/display/FLINK/FLIP-159%3A+Reactive+Mode
https://cwiki.apache.org/confluence/display/FLINK/FLIP-160%3A+Adaptive+Scheduler
https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/
作者簡介
John,OPPO實時計算平臺高階研發工程師,Apache Flink Contributor,長期專注於大資料計算領域。
本文分享自微信公眾號 - OPPO數智技術(OPPO_tech)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。
- OPPO實時計算平臺基於雲原生的作業彈性伸縮設計與實踐
- OPPO實時計算平臺基於雲原生的作業彈性伸縮設計與實踐
- 多元技術,多元宇宙,OPPO 如何打造虛實共生的數智生活
- OPPO在FaaS領域的探索與思考
- OPPO在FaaS領域的探索與思考
- Shuttle Alluxio 加速記憶體Shuffle起飛
- OPPO資料湖統一儲存技術實踐
- Quarkus-雲原生時代Java的曙光?
- Quarkus-雲原生時代Java的曙光?
- Shuttle:高可用 高效能 Spark Remote Shuffle Service
- Shuttle:高可用 高效能 Spark Remote Shuffle Service
- OPPO自研雲原生分散式任務排程平臺
- OPPO自研雲原生分散式任務排程平臺
- GTC 2022:GPU推理加速在OPPO NLP場景的優化落地
- OPPO雲資料庫訪問服務技術揭祕
- 全鏈路非同步Rest客戶端 ESA RestClient
- 全鏈路非同步Rest客戶端 ESA RestClient
- OPPO唐黎:零程式碼技能平臺技術實踐探索!
- MySQL 分散式事務的“路”與“坑”
- PendingIntent重定向:一種針對安卓系統和流行App的通用提權方法——BlackHat EU 2021議題詳解(上)