本文主要介紹百度搜索內容存儲團隊應對海量互聯網數據分析計算需求時,在構建HTAP表格存儲系統方向上的一些技術思考。
GEEK TALK
01
業務背景
百度搜索內容存儲團隊主要負責各類數據,如網頁、圖片、網頁關系等,的在線存儲讀寫(OLTP)、離線高吞吐計算(OLAP)等工作。
原有架構底層存儲系統普通采用百度自研表格存儲(Table)來完成數據的讀、寫、存工作,此存儲系統更偏向于OLTP業務場景。隨著近幾年大數據計算、AI模型訓練的演進,對存儲系統OLAP業務場景的依賴越來越重,如數據關系分析、全網數據分析、AI樣本數據管理篩選。在OLTP存儲場景的架構下,支持OLAP存儲需求對資源成本、系統吞吐、業務時效帶來了巨大挑戰。為此我們在百度自研表格存儲之外,結合業務實際workflow針對性優化,增加構建了一套符合業務需求的HTAP表格存儲系統。
以下我們將主要介紹在百度內容HTAP表格存儲系統設計落地中的一些技術思考,文中的優劣歡迎各位積極交流探討。
GEEK TALK
02
存儲設計
2.0 需求分析
整套存儲設計需要解決的核心問題是——如何在OLTP存儲系統中支持OLAP workflow?OLAP workflow在OLTP存儲系統上帶來的兩個最主要的問題是:嚴重的IO放大率、存算耦合。
嚴重的IO放大率。IO放大率主要來自兩方面,如下圖,數據行篩選、數據列篩選。
數據行篩選。在表格存儲中,數據按照主鍵從小到大排列,OLAP workflow根據條件篩選過濾出符合條件的數據行,會帶來嚴重的IO放大。
數據列篩選。表格存儲是寬表結構,業務在一次查詢中只會獲取部分列,但數據是以行結構保存,需要獲取整行再提取出需要的字段,依舊會帶來嚴重的IO放大。
△圖2.1
存算耦合。存算耦合主要來自兩方面,如下圖,存儲節點資源冗余、存儲空間放大。
存儲節點資源冗余。在一個存儲節點中,OLTP vs OLAP占用的計算資源占比是3:7,為滿足OLAP需要,就需要對存儲節點進行擴容,然而存儲節點的擴容又不僅僅是計算資源。同時,OLAP任務是間歇性的,就會造成忙時供給不足,閑時資源冗余等情況。
存儲空間放大。為支持每一個OLAP任務的數據訪問,存儲引擎需要為每一個workflow創建對應的Snapshot,保證workflow完成前所依賴的所有數據文件均有效。當OLAP workflow耗時過長時,會導致Compaction后數據文件無法及時清理的情況,造成存儲空間放大。
△圖2.2 Node
2.1 架構設計
△圖2.3
1.架構采用業界HTAP主流設計思想,將OLTP和OLAP workflow拆分到兩套存儲系統中,如F1 Lightning、ByteHTAP,在SDK層根據任務類型分發到不同的存儲系統中。
2.OLTP存儲系統——Neptune,采用Multi-Raft分布式協議組建存儲集群,采用本地磁盤(SSD/HDD等) + 百度分布式文件系統?AFS組成存儲介質。
3.OLAP存儲系統——Saturn,Serverless?設計模式,無常駐Server,即用即加載,貼合OLAP workflow的不確定性和間歇性。
4.OLTP與OLAP存儲系統間,采用數據文件硬鏈的方式進行數據同步,全版本替換,成本低、速度快,充分貼合Saturn Serverless設計模式。
如上架構設計圖,可將OLTP與OLAP workflow拆分到兩套獨立的系統中,解決上述提到的存算耦合問題。
解決存儲空間放大問題??臻g放大主要帶來的問題是存儲節點成本,Workflow分離的架構將OLAP需要的數據文件采用AFS低成本存儲,減少了對存儲節點存儲空間的壓力。
△圖2.4
OLAP存儲系統的數據寫入并沒有使用常見的log redo或raft learner模式,最主要還是在保證OLAP存儲系統的Serverless特性的同時,又能實時感知到OLTP系統的最新寫入結果。
解決存儲節點資源冗余問題。拆分后,分布式存儲節點將大量重型OLAP workflow轉移到OLAP存儲——Saturn中,將極大減少存儲節點的計算壓力。同時,OLAP存儲的Serverless設計模式又可貼合workflow的不確定性和間歇性。
△圖2.5 Saturn Serverless模型
計算節點可以部署在任意計算集群中,如Map-Reduce、自研計算節點Pioneer等,在SDK中直接初始化存儲引擎,從AFS中訪問對應分片的數據文件。計算節點可充分利用云原生系統(PaaS)的彈性資源,解決資源常駐冗余問題。
2.2 存儲引擎優化思路
結合上面的分析以及設計思路,已有效地解決了存算耦合問題。在本節中,我們將重點介紹解決IO放大率問題的一些優化思路。
2.2.1 數據行分區
數據行分區思想在很多OLAP存儲系統中很常見,如當前比較流行的一些數據湖架構,ClickHouse、IceBerg等。在表格存儲中,數據行分區的好處是可以極大減少在數據行篩選過程中IO放大率。以下是我們在存儲引擎中支持數據行分區的設計思路:
△圖2.6
數據行分區的思想在OLTP和OLAP存儲引擎中都有使用,OLTP存儲引擎以數據行分區構建的數據文件可直接被OLAP存儲引擎加載,減少了OLAP存儲的數據構建工作。
數據行分區在Write、Read、Scan場景下的處理流程分別為:
1.Write操作。Write時會根據請求中的特殊Region描述,如分區鍵,找到需要寫入的Region-Index和Region上下文,前者保存Key的分區索引信息,后者中保存實際數據,操作記錄由WAL中保存。
2.Read操作。Read操作相比通常直接訪問數據,需要多進行一次分區索引訪問,為減少多一次訪問帶來的性能折損,我們將分區索引信息全內存化。由于索引數據非常小,因此全內存化是可接受的。
3.Scan操作。Scan操作相比之下沒有任何變更,但在Scan特殊分區場景下可大量減少IO放大。因為相比之前的行過濾模式,可直接跳過大量不需要的數據。
在業務存儲支持時,合理設置數據行分區,可極大減少數據行篩選過程中的IO放大率。
2.2.2 增量數據篩選
在實際業務中,有很大一個場景時獲取近期(如近幾個小時、近一天)有值變化的數據,常規的做法是Scan全量數據,以時間區間作為過濾條件,篩選出符合條件的結果。但如此的篩選邏輯會帶來嚴重的IO放大,因為滿足條件的結果只占全量結果的一小部分。為此,我們在引擎層調整優化Compaction時機以及調整篩選流程,減少增量數據篩選過程中需要訪問的數據文件集合,降低IO放大,業務提速。
△圖2.7 LSMT
2.2.3 動態列結構
在OLAP存儲引擎中,還存在一類訪問場景會帶來IO放大問題,數據列篩選。在表格存儲系統中,一個Key可以包含多個列族(Column Family),一個列族中可以包含任何多個數據字段,這些字段以行結構存儲在同一物理存儲(Locality Group)中,當篩選特定數據列時,需要進行整行讀取,然后過濾出需要的字段,這也將帶來IO放大問題。
同時,OLAP workflow的訪問不確定性導致存儲層無法及時調整數據在物理存儲中的結構。為此,我們引入動態列結構的概念,在邏輯層對業務透明,在物理層根據近期OLAP workflow特性及時調整物理結構。
△圖2.8
如上圖,在邏輯存儲中,分為兩個LG,根據workflow特性,把業務常用的訪問字段在Compaction階段存放在同一物理存儲結構中,反之,這樣可以減少字段篩選階段的IO放大率。
動態列結構只在OLAP存儲引擎中生效,我們在原有OLAP存儲中引入workflow收集以及compaction任務,將從OLTP存儲中同步的數據構建成更適合OLAP場景的存儲結構。
GEEK TALK
03
計算與調度
在本節,我們將介紹在此HTAP表格存儲系統基礎上,如何設計實現任務計算和調度系統,簡化業務使用成本,提升業務效率。
在大量搜索內容OLAP workflow中,從表格存儲系統中提取篩選數據只占全部任務的一小部分,大量任務需要對數據進行加工處理得到需要的結果。常規的做法是多任務串聯,這樣做的缺陷是大量中間臨時數據存儲開銷。
為此我們為HTAP表格存儲系統構建了一套計算與調度系統,系統兩大特點:任務開發SQL化、數據處理FaaS化。
3.1 SQL化與FaaS化
我們充分貼合上述存儲系統特性,自研了一套數據查詢語言——KQL,KQL類似于SQL Server語法。同時,又結合存儲系統特性以及計算框架,支持一些特殊語言能力,最主要的是能支持原生FaaS函數定義,當然也支持外部FaaS函數包依賴。
如下是一段KQL語句例子以及說明:
function classify = { #定義一個Python FaaS函數 def classify(cbytes, ids): unique_ids=set(ids) classify=int.from_bytes(cbytes, byteorder=‘little’, signed=False) while classify != 0: tmp = classify & 0xFF if tmp in unique_ids: return True classify = classify 》》 8 return False } declare ids = [2, 8]; declare ts_end = function@gettimeofday_us(); # 調用Native Function獲取時間 declare ts_beg = @ts_end - 24 * 3600 * 1000000; # 四則運算 select * from my_table region in timeliness # 利用存儲分區特性,從my_table中的timeliness分區獲取數據 where timestamp between @ts_beg and @ts_end # 利用存儲增量區間特性,篩選增量數據 filter by function@classify(@cf0:types, @ids) # 在Filter階段調用自定義FaaS函數 convert by json outlet by row; desc: # 對計算框架進行特殊描述 --multi_output=true;
3.2 任務生成與調度
1.任務生成。在任務生成階段將KQL語句解析優化成相關的調度任務,一個Job包含多個Task。
2.任務調度。
任務調度的計算節點可以是Map-Reduce,也可以是自研計算集群Pioneer,負責不同計算場景。
任務運行容器負責數據依賴部署和運行計算框架。
計算框架采用插件化設計思想,依托KQL語言進行差異化描述。計算框架的最大特點是,可在數據處理節點執行用戶自定義FaaS函數。
GEEK TALK
04
總結
當前HTAP表格存儲系統已在全網網頁數據離線加速、AI模型訓練數據管理、圖片存儲以及各類在線離線業務場景落地,數據存儲規模達》15P,業務提速》50%。
與此同時,隨著大模型時代的到來,對存儲系統帶來了更多的挑戰,我們也將繼續深度優化,設計更高性能、高吞吐的HTAP表格存儲系統。
-
耦合
+關注
關注
13文章
582瀏覽量
100856 -
存儲系統
+關注
關注
2文章
409瀏覽量
40852 -
大模型
+關注
關注
2文章
2423瀏覽量
2641
原文標題:百度搜索內容HTAP表格存儲系統
文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論