寫在前面: 博主是一名軟件工程系大數據應用開發專業大二的學生,暱稱來源於《愛麗絲夢遊仙境》中的Alice和自己的暱稱。作爲一名互聯網小白,
寫博客一方面是爲了記錄自己的學習歷程,一方面是希望能夠幫助到很多和自己一樣處於起步階段的萌新
。由於水平有限,博客中難免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!個人小站:http://alices.ibilibili.xyz/ , 博客主頁:https://alice.blog.csdn.net/
儘管當前水平可能不及各位大佬,但我還是希望自己能夠做得更好,因爲一天的生活就是一生的縮影
。我希望在最美的年華,做最好的自己
!
在上一篇博客中,博主已經爲大家介紹瞭如何進行kylin的增量構建。在最後也討論了增量構建會導致Segment越來越多,進而降低數據查詢的效率。本篇博客,爲大家帶來的就是如何對Cube進行碎片化的管理
碼字不易,先贊後看
Cube碎片管理
增量構建的問題
日積月累,增量構建的Cube中的Segment越來越多,該Cube的查詢性能也會越來越慢,因爲需要在單點的查詢引擎中完成越來越多的運行時聚合。爲了保持查詢性能:
- 需要定期地將某些Segment合併在一起
- 或者讓Cube根據Segment保留策略自動地淘汰那些不會再被查詢到的陳舊Segment
管理Cube碎片
上述案例,每天都會生成一個Segment,對應就是HBase中的一張表。增量構建的Cube每天都可能會有新的增量。這樣的Cube中最終可能包含上百個Segment,這將會導致Kylin性能受到嚴重的影響
- 從執行引擎的角度來說,運行時的查詢引擎需要聚合多個Segment的結果才能返回正確的查詢結果
- 從存儲引擎的角度來說,大量的Segment會帶來大量的文件,給存儲空間的多個模塊帶來巨大的壓力,例如Zookeeper、HDFS Namenode等
因此,有必要採取措施控制Cube中Segment的數量。
手動觸發合併Segment
Kylin提供了一種簡單的機制用於控制Cube中Segment的數量:合併Segments。在Web GUI中選中需要進行Segments合併的Cube。
操作步驟:
1、單擊Action→Merge
2、選中需要合併的Segment,可以同時合併多個Segment,但是這些Segment必須是連續的
單擊提交後系統會提交一個類型爲“MERGE”的構建任務,它以選中的Segment中的數據作爲輸入,將這些Segment的數據合併封裝成爲一個新的Segment。新的Segment的起始時間爲選中的最早的Segment的起始時間,它的結束時間爲選中的最晚的Segment的結束時間。
待到運行完畢,我們可以發現Cube內部的Segment文件已經合併爲一個
注意事項:
- 在MERGE類型構建完成之前,系統將不允許提交這個Cube上任何類型的其他構建任務
- 在MERGE構建結束之前,所有選中用來合併的Segment仍然處於可用的狀態
- 當MERGE構建結束的時候,系統將選中合併的Segment替換爲新的Segment,而被替換下的Segment等待將被垃圾回收和清理,以節省系統資源
講完了合併Segment,我們來談談如何刪除Segment
刪除Segment
同樣的,我們也可以使用WebUI刪除Cube的segment
操作步驟:
1、disable Cube
2、點擊 delete Segment,刪除指定的segment
如果使用Postman發送請求刪除Segment
屬性 | 值 |
---|---|
URL | http://node1:7070/kylin/api/cubes/{cubeName}/segs/{segmentName} |
請求方式 | DELETE |
自動合併
手動維護Segment很繁瑣,人工成本很高,Kylin中是可以支持自動合併Segment。
在Cube Designer的“Refresh Settings”的頁面中有:
- Auto Merge Thresholds
- Retention Threshold
兩個設置項可以用來幫助管理Segment碎片。這兩項設置搭配使用這兩項設置可以大大減少對Segment進行管理的麻煩。
1、Auto Merge Thresholds
- 允許用戶設置幾個層級的時間閾值,層級越靠後,時間閾值就越大
- 每當Cube中有新的Segment狀態變爲 READY的時候,會自動觸發一次系統自動合併
- 合併策略
達到了閾值就跳過,沒有達到閾值就合併到這個閾值,沒滿足不合並。
嘗試最大一級的時間閾值,例如:針對(7天、28天)層級的日誌,先檢查能否將連續的若干個Segment合併成爲一個超過28天的大Segment。
- 如果有個別的Segment的時間長度本身已經超過28天,系統會跳過Segment
- 如果滿足條件的連續Segment還不能夠累積超過28天,那麼系統會使用下一個層級的時間閾值重複尋找
這裏爲了方便大家理解,舉一個例子
- 假設自動合併閾值設置爲7天、28天
- 如果現在有A-H8個連續的Segment,它們的時間長度爲28天(A)、7天(B)、1天(C)、1天(D)、1天(E)、1天(F)、1天(G)、1天(H)
- 此時,第9個Segment I加入,時間長度爲1天
自動合併策略爲:
2、配置自動合併
首先設置閾值,可以使一個也可以使多個。
設置完Cube後,我們build進行構建,然後等待
運行完畢以後,生成一天的數據
接着我們提交下一個一天的數據(1014-1015)
待到構建完畢,我們可以發現新的Segment已經與之前的Segment合併了
若設置多層次的合併級別,最好是每個層次之間是整倍數關係
既然能自動合併,那肯定有辦法自動刪除,接下來我們就來嘮嘮
自動刪除
自動合併是將多個Segment合併爲一個Segment,以達到清理碎片的目的。自動刪除Segment則是及時清理不再使用的Segment。
在很多場景中,只會對過去一段時間內的數據進行查詢,例如:
- 對於某個只顯示過去1年數據的報表
- 支撐它的Cube其實只需要保留過去一年類的Segment即可
- 由於數據在Hive中已經存在備份,則無需在Kylin中備份超過一年的歷史數據
可以將Retention Threshold設置爲365。每當有新的Segment狀態變爲READY的時候,系統會檢查每一個Segment。如果它的結束時間距離最晚的一個Segment的結束時間已經大於等於“Retention Threshold”,那麼這個Segment將被視爲無需保留。系統會自動地從Cube中刪除這個Segment。
總結
本篇博客爲大家介紹瞭如何進行Cube的碎片化管理,包括手動合併,刪除,以及自動合併,刪除。下一篇博客,將爲大家介紹如何使用JDBC連接Kylin,敬請期待😎
如果以上過程中出現了任何的紕漏錯誤,煩請大佬們指正😅
受益的朋友或對大數據技術感興趣的夥伴記得點贊關注支持一波🙏