i 技術會筆記 | Druid在愛奇藝的實踐和技術演進
- 導讀 -
愛奇藝大資料服務團隊評估了市面上主流的OLAP引擎,最終選擇Apache Druid時序資料庫來滿足業務的實時分析需求。本文將介紹Druid在愛奇藝的實踐情況、最佳化經驗以及平臺化建設的一些思考。
愛奇藝大資料OLAP服務
愛奇藝大資料OLAP服務在2015年前主要以離線分析為主,主要基於Hive+MySQL、HBase等。2016年起引入Kylin和Impala分別支援固定報表和Ad-hoc查詢。2018年以來引入Kudu和Druid支援實時分析需求。
在引入Druid之前,業務的一些場景無法透過離線分析滿足,如廣告主想要實時基於投放效果調整投放策略、演算法工程師調整模型推到線上A/B要隔天離線報表才能看到效果。這些場景都可以歸納為對海量事件流進行實時分析,經典的解決方案有如下幾種:
離線分析:
實時分析:
用ElasticSearch或OpenTSDB,由於資料結構本質是行儲存,聚合分析速度都比較慢;可以透過查詢快取、OpenTSDB預計算進行最佳化,但不根本解決問題; 用流任務(Spark/Flink)實時地計算最終結果,儲存在MySQL提供進一步服務;問題是每當需求調整,如維度變更時,則需要寫新的流任務程式碼; 使用Kudu和Impala結合能夠做到實時分析。在實踐過程中發現,Kudu受限於記憶體和單機分割槽數,支撐海量資料成本很大;
Lambda架構:
實時可見:訊息攝入後分鍾級查詢可見 互動查詢:查詢延時在秒級,核心思想為記憶體計算和平行計算 維度靈活:支援幾十個維度任意組合,僅在索引時指定的維度查詢可見 易於變更:需求變更後調整索引配置立馬生效; 流批一體:新版本KIS模式可實現Exactly Once語義
上圖為Druid架構圖,大體分為幾個模組:
MiddleManager:索引節點,負責實時處理訊息,將其轉成列式儲存,並透過Rollup精簡資料量;索引節點定期將記憶體中資料持久化為不可修改的檔案(Segment),儲存至HDFS保證資料不會丟失; Historical:歷史節點,將Segment載入到本地,負責大部分查詢的計算;
Broker:查詢節點,將查詢分解為實時和離線部分,轉發給索引節點和歷史節點,並彙總最終的查詢結果; Overlord:負責索引任務管理; Coordinator:負責負載均衡,確保Segment在歷史節點之間儘量均衡;
Druid在愛奇藝的實踐
Druid很好地填補了愛奇藝在實時OLAP分析領域的空白,隨著業務實時分析需求的增加,Druid叢集和業務規模也在穩步增長。目前叢集規模在數百個結點,每天處理數千億條訊息,Rollup效果在10倍以上。平均每分鐘6千條查詢,P99延時一秒內,P90延時在200毫秒內。在建設Druid服務過程中,我們也不斷遇到規模增長帶來的效能瓶頸和穩定性問題。
當時的挑戰是實時索引任務經常被阻塞。Druid的Handoff總結如下,索引節點將Segment持久化到HDFS,然後Coordinator制定排程策略,將計劃釋出到ZooKeeper。歷史節點從ZooKeeper獲取計劃後非同步地載入Segment。當歷史節點載入完Segment索引節點的Handoff過程才結束。這個過程中,由於Coordinator制定計劃是單執行緒序列的,如果一次觸發了大量Segment載入,執行計劃制定就會很慢,從而會阻塞Handoff過程,進而索引節點所有的Slot均會被用滿。
• 歷史節點因硬體故障、GC、主動運維退出
• 調整Segment副本數、保留規則
分析清楚原因後,很容易瞭解到Druid新很容易瞭解到Druid新版本提供了新的負載均衡策略(druid.coordinator.balancer.strategy = CachingCostBalancerStrategy),應用後排程效能提升了10000倍,原先一個歷史節點當機會阻塞Coordinator1小時到2小時,現在30秒內即可完成。
4.Tranquility vs KIS
剛使用Druid時,當時主力模式是Tranquility。Tranquility本質上仍然是經典的Lambda架構,實時資料透過Tranquility攝入,離線資料透過HDFS索引覆蓋。透過離線覆蓋的方式解決訊息延遲的問題,缺點是維護兩套框架。對於節點失敗的問題,Tranquility的解決方案是鏈路冗餘,即同時在兩個索引節點各起一份索引任務,任一節點失敗仍有一份能夠成功,缺點是浪費了一倍的索引資源。自0.14版本起,Druid官方建議使用KIS模式索引資料,它提供了Exactly Once語義,能夠很好地實現流批一體。
和Tranquility的Push模式不同,KIS採取Pull模式,索引任務從Kafka拉取訊息,構建Segment。關鍵點在於最後持久化Segment的時候,KIS任務有一個資料結構記錄了上一次持久化的Offset位置,如圖例左下角所示,記錄了每個Kafka Partition消費的Offset。在持久化時會先檢查Segment的開始Offset和元資訊是否一致。如果不一致,則會放棄本次持久化,如果一致,則觸發提交邏輯。提交中,會同時記錄Segment元資訊和Kafka Offset,該提交過程為原子化操作,要麼都成功,要麼都失敗。
以下是KIS在愛奇藝的一個例項,左下圖為業務訊息量和昨天的對比圖,其中一個小時任務持久化到HDFS失敗了,看到監控曲線有一個缺口。之後Druid後臺啟動了一個新的KIS任務,一段時間後,隨著KIS補錄資料完成,曲線圖恢復到右下圖所示。那麼,如果業務不是一直盯著曲線看,而是定期檢視的話,完全感受不到當中發生了異常。
基於Druid的實時分析平臺建設
資料攝入需要撰寫一個索引配置,除了對資料自身的描述(時間戳、維度和度量),還需要配置Kafka資訊、Druid叢集資訊、任務最佳化資訊等 查詢的時候需要撰寫一個JSON格式的查詢,語法為Druid自定義,學習成本高 返回結果為一個JSON格式的資料,使用者需自行將其處理成最終圖表、告警 報錯資訊不友好,上述所有配置均透過JSON撰寫,一個簡單的逗號、格式錯誤都會引起報錯,需花費大量時間排查
全向導配置:業務無需手寫ETL任務 計算儲存透明:業務無需關心底層OLAP選型 豐富報表型別:支援常見的線圖、柱狀圖、餅圖等 資料延時低:從APP資料採集到生成視覺化報表的端到端延時在5分鐘內,支援資料分析師、運營等業務實時統計分析UV、VV、線上使用者數等 秒級查詢:大部分查詢都是秒以內 靈活變更:更改維度後重新上線即可生效
未來展望
參考資料
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945252/viewspace-2701599/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 前端技術演進(六):前端專案與技術實踐前端
- 大神講解微服務治理的技術演進和架構實踐微服務架構
- 智慧安全3.0實踐|SASE技術架構的演進之路架構
- jaeger的技術演進之路
- 前端技術演進(七):前端跨棧技術前端
- 技術沙龍 | 雲時代下的架構演進—企業雲及雲原生技術落地實踐架構
- 前端技術演進(一):Web前端技術基礎前端Web
- 高德AR & 車道級導航技術演進與實踐
- 技術架構演進的思考架構
- 跨平臺技術演進
- 移動端技術演進
- 會話技術 cookie和session 學習筆記會話CookieSession筆記
- ByteHouse實時匯入技術演進
- 技術架構分享:美團配送系統架構演進實踐架構
- 微博推薦實時大模型的技術演進大模型
- 飛豬Flutter技術演進及業務改造的實踐與思考總結Flutter
- 日均處理萬億資料!Flink在快手的應用實踐與技術演進之路
- 融合通訊技術趨勢和演進方向
- 前端技術演進:參考文章前端
- OTN技術的進展及演進趨勢
- 在實際的專案需求中瞭解技術架構的演進架構
- CSS技術筆記CSS筆記
- Tungsten Fabric架構和最新技術進展丨TF成立大會演講實錄架構
- 大型網站技術架構的演進網站架構
- 技術筆記(8)git的部分進階功能筆記Git
- 快手萬億級別Kafka叢集應用實踐與技術演進之路Kafka
- 阿里技術專家詳解Dubbo實踐,演進及未來規劃阿里
- 大資料技術 - Druid大資料UI
- 容器技術在企業落地的最佳實踐
- UI自動化技術在高德的實踐UI
- 小菜前端的技術棧是如何規劃和演進的前端
- 前端技術演進(九):參考文章前端
- 頁面靜態化技術演進
- 技術實踐的主流方向
- 技術門檻高?來看 Intel 機密計算技術在龍蜥社群的實踐 | 龍蜥技術Intel
- 【雲棲大會】Redis技術的實踐與探索Redis
- 進博會,安保技術天團在這裡
- 分散式資料庫技術的演進和發展方向分散式資料庫