導語
作為 Kylin 的忠實使用者,58 集團從最初的 Kylin 1.5.3 到今年上半年實現的 1.5 版本 Cube 到 2.6 版本的遷移工作,已經使用 Kylin 近五年了。但隨著業務的快速增長,58 集團面臨著 HBase 叢集的運維壓力和機房無法擴容的負載壓力等新的挑戰。透過下文中的方案,58 集團現已有效解決了上述問題。讓我們跟隨 58 集團大資料部的楊正一起來共同學習探討 Kylin 跨叢集維護的最佳實踐吧!
01
Kylin 在 58 集團的現狀與發展歷程
1. 使用現狀
58 集團自 16 年開始引進 Kylin,服務於多個業務線與商業資料產品,被廣泛應用於流量、使用者行為、推薦等分析場景中。目前生產環境部署的是基於社群 2.6.0 修改的內部版本,已有 600 個 Cube,320 T 儲存,每日輸入資料量 120 億條,使用的 HBase 表 1 萬多張,5 萬多 Region,單日最高 25 萬次查詢,90% 左右的查詢響應時間小於 0.5s。
2. 發展歷程
16 年開始使用 Kylin 1.5.3,19 年初開始使用 Kylin 2.6.0,2020 年上半年完成 1.5 版本 Cube 到 2.6 版本的遷移工作。主要工作如下:
多租戶支援最佳化Kylin 的排程、監控和管理系統動態使用者載入 (KYLIN-4241)可選擇任務構建點 (KYLIN-4249)節點服務發現 (KYLIN-4256)增加 http 監控指標介面 (KYLIN-4294)引入新版 Hive 全域性字典新特性支援跨叢集儲存查詢能力......02
Kylin 跨叢集專案背景
目前在 58 集團有兩個 HBase 叢集,分別部署在 A 機房和 B 機房。Kylin 一直使用的是 A 機房的 HBase 叢集,但是 A 機房的機架數達到了物理上限,沒辦法繼續擴容。
隨著 Kylin 業務的快速增長,HBase 叢集以每月 1000 左右張表,5000 左右個 Region 的增速在上漲,A 機房 HBase 叢集的運維壓力越來越大。
為了應對快速增長的業務需求,我們希望將 Kylin 的部分預計算資料儲存到 B 機房的 HBase 叢集。如果將 Kylin 的所有預計算資料遷移到 B 機房的 HBase 叢集,遷移成本會過高,並且以後可能還會遇到單機房機器增長瓶頸,於是我們開始實現 Kylin 的多 HBase 叢集儲存與查詢的方案。
03
Kylin 跨叢集實現原理
1. 可插拔的架構
如上圖所示,Kylin 使用了可插拔的架構,支援 Hive、Kafka 和 REBMS 等資料來源,對外支援 REST、JDBC/ODBC 介面,使用 Hive、MR、Spark 等多種計算引擎計算各個維度組合下的聚合值,最後將預計算的資料儲存到 HBase 中( Kylin 4.0 以前預設使用 HBase 作為儲存引擎)。
一些基礎概念:
Cuboid:一種維度組合Cube:資料立方體,即所有維度組合,由所有 Cuboid 組成Segment:一個 Cube 一般根據時間分區劃分為多個 Segment2. 跨叢集儲存
Segment 構建流程:
Segment 合併流程:
涉及到與 HBase 連線相關的步驟有:
建立 HBase 表;Cuboids 資料轉 HFile 檔案(需要獲取 HBase 配置);BulkLoad 任務;Lookup 表的儲存與查詢;Merge 任務垃圾清理時,刪除無用的 HTable;獲取 HBase 的 HDFS 儲存的地方;以上步驟都需要獲取 HBase 連線,然後再做相應的操作,如建立表、獲取 HBase 配置等。再獲取 HBase 連線時,會根據系統配置 kylin.storage.url 來建立 Connection,單一的 Connection 顯然無法滿足跨叢集儲存的需要。
因此我們修改了這部分邏輯,再獲取 HBase Connection 時,我們根據 Cube 的配置來建立 Connection,並放入快取池中。這樣不同的 Cube 即可以使用不同的 HBase 叢集來做相應的操作。
配置重寫說明:
Kylin 除了 $KYLIN_HOME/conf/ 目錄下的全域性配置外,同時支援專案級別和 Cube 級別的配置重寫。配置重寫的優先順序關係為:Cube 級別配置重寫 > 專案級別配置重寫 > 全域性配置檔案。
將 Segment 所屬叢集寫入元資料:
構建 Segment 時,會根據當前 Cube 的 storage url 配置來選擇 HBase 叢集進行儲存,構建結束時,會更新元資料,此時我們將 Segment 所屬 HBase 叢集寫入到 Segment 的元資料資訊中,便於展示。查詢時也會用到這個元資料資訊。
3. 跨叢集查詢
Kylin 查詢流程:
如上是一個 Kylin 完整的查詢流程,紅色方框代表 HBase 查詢部分。一次查詢可能會向 HBase 傳送多個 Scan 請求,將從多個 Segment 掃描得到的資料,做進一步的聚合得到結果返回給使用者。
我們的跨叢集版本,是支援同一個 Cube 不同 Segment 儲存在不同的 HBase 叢集的。既然 Segment 儲存在不同的叢集,那麼也必須具備一次查詢從多個 HBase 叢集掃描結果的能力。
如上圖所示,一次查詢可能會分為多個 Scan 任務,根據元資料中 Segment 所屬叢集,向對應的 HBase 表傳送 Scan 請求,最後對所有 Scan 的結果做進一步處理。
協處理器適配問題:
Kylin 使用了 HBase 協處理器來最佳化查詢效能。Cube 構建到建立表時,會為表部署協處理器。
初期,我們的兩個 HBase 叢集版本不一致,分別為 1.0 和 1.4 版本。使用同一個 corprocess jar 包,發現不能同時相容兩個叢集。於是我們分別基於 HBase1.0 和 HBase1.4 編譯了兩個版本的 kylin-corprocess.jar,建立 HBase 表時,選擇對應版本的 kylin-corprocess.jar 進行部署。
04
跨叢集支援工作
1. 叢集負載與跨叢集資訊視覺化
我們在 Kylin 管理平臺頁面,添加了跨叢集資訊展示,比如 Kylin 表所在 RsGroup 的負載情況,所有 Segment 的分佈情況,所有 Cube 當前使用的儲存叢集和一些明細資訊。Kylin 管理員可以快速瞭解到 HBase 整體負載情況,和某個 Cube 的 Segment 分佈情況等資訊。
2. 清理工具升級
Kylin 執行一段時間後,有部分資料會因為不再使用而變成垃圾資料,這些資料會佔用 HDFS,HBase,kylin-meta 表的空間,有必要進行清理。跨叢集功能上線後,垃圾資料也會儲存在多個叢集,因此清理工具我們也做了修改,比如遍歷找到兩個 HBase 叢集所有無用的表,再清理。
05
總結與展望
Kylin 跨叢集儲存與查詢的實現,有效的解決了我們因機房無法擴容帶來的負載壓力。支援同一個 Cube 的多個 Segment 儲存到不同的 HBase 叢集,同時支援 Cube 級別 / 專案級別和全域性配置預設的儲存叢集,可以根據叢集負狀態,靈活的進行 HBase 叢集的切換,並且完全對使用者透明。
使用 HBase 作為 Kylin 的預計算結果儲存還有諸多問題,例如不支援二級索引、不是真正的列式儲存、無法做到分散式查詢等問題,限制了 Kylin 的一些能力。目前 Kylin 4.0 Alpha 版本已經發布,此版本開始使用 Parquet 作為儲存,SparkSQL 作為查詢和構建引擎,可以極大的提升 Kylin 的效能和穩定性,我們也正在積極的參與到 4.0 的開發中,期待早日落地。
參考文章
http://kylin.apache.org/docs/小米Kylin平滑遷移 HBase 實踐Apache Kylin 原理介紹與新架構分享(Kylin On Parquet)以下文章來源於58知享號,作者楊正