1、華為云實時數據湖查詢優化演講人:孟濤華為高級工程師2023 華為云數據湖介紹Hudi 查詢能力介紹華為云基于hudi的性能優化未來規劃華為云數據湖介紹數據湖基礎架構DGC流式計算FlinkSQL批處理SparkSQL批處理Spark交互式分析HetuEngine貼源層集市層匯總層postgresqlmysqloracle數據源CDMCDLHudihdfsobs數據入湖:歷史存量數據通過CDM一次性搬遷。新增數據通過CDL實時搬遷。數據存儲:選用hudi作為數據湖的基座,支持hdfs/對象存儲obs,數據加工:流式加工:FlinkSQL 增量拉取hudi表數據。批量加工:Spark、SparkS
2、QL 兩種方式。交互式分析:hetu引擎承擔數據湖的查詢出口。Hudi 查詢能力介紹Hudi介紹流式挖掘,增量查詢高效的更新,刪除能力,可插拔索引事務,MVCC,并發控制,schema evolution,time travel豐富的表級別服務:自動小文件合并,數據布局優化clustering,compacion,clean豐富的生態集成,支持flink/spark寫入Presto/hive/spark/flink等 查詢Clustering hudi早在0.7版本就已經提供了clustering 優化數據布局,0.10版本隨著z-order/hilbert高階聚類算法的加入,hudi的數據布
3、局優化日趨強大。hudi 當前提供以下三種不同的聚類方式,針對不同的點查場景,要根據具體的過濾條件來選擇不同的策略數據布局優化配合 FileSkipping才能更好的發揮效果。當我們完成數據布局后,對每個文件的相關列收集統計信息,下圖給個簡單的示例,數據經過排序后寫入表中生成三個文件,指定點查where a 10 下圖可以清楚的看出 a 10 這種就無能為力的。高性能fileList在查詢超大規模數據集是,fileList是不可避免的操作;在hdfs上該操作耗時還可以接受,一旦涉及到對象存儲大規模的fileList效率極其低下,hudi引入metatable 將文件信息直接保存在下來,從而避免
4、了大規模filelist,華為云基于hudi的性能優化Hudi 索引優化索引是為了加快數據檢索速度而創建的一種存儲結構,是一種空間換時間的設計思想,作用可以理解為書的目錄,通過目錄我們可以快速檢索到需要的內容。常見的索引類型有:數據索引(如對數據做分區,sort,z-order),二級索引(lucene、bitmap),前綴索引等等,每種所有都有各自的優缺點。引入這些索引可以極大的提升查詢引擎的查詢能力 數據索引Min-max Lucene 索引 Bitmap 索引 各種索引對比和使用建議基于MDT的Min-max 索引SparkflinkCol_stat_indexFiles&partiti
5、onsMDTData filestimelineobssparkhetuMin-max索引要想效果好,數據入庫后需要采用clustering,按照查詢條件做排序 異步重組數據。讀取時開啟mdt利用hfile高效的點查能力,快速加載索引數據完成 數據文件的裁剪查詢入庫基于MDT的Min-max 索引集成select*from table where id 9luceneLucene 是apache開源的一款搜索工具,具有極其高效的檢索效率。solr和es均基于其進行開發。利用lucene強大的倒排索引能力,可以賦予hudi更高效的多維查詢,文本檢索能力。表某一個列值1,9,4,4,3,1,1,3
6、,8,9分詞分詞文檔文檔id西安1,2大唐不夜城1回民街2文檔文檔id內容內容1西安大唐不夜城2西安回民街正向索引,給每個文檔編號,作為其唯一標識倒排索引,對字段內容做分詞,按分詞和id構建索引分詞(列值,分詞(列值,string類型會分詞)類型會分詞)文檔文檔id(行號)(行號)11,6,792,1043,435,889lucene構建lucene索引要注意的點1)選擇 文件級別構建,我們選擇行號作為docID,全表級別生成行號不現實,而且表里面數據會持續寫入之前行號講不可以。2)異步構建方式,防止阻塞入庫流程。天級別大任務可以選擇同步構建Lucene會生成很多文件,這對hdfs namen
7、ode是有壓力的關于索引大小Lucene 針對string類型,做分詞后產生的索引文件很大,甚至比數據文件都大,18300 行-600M數值類型產生的索引文件相對較小18300-6.6M,可以直接放到內存,加快索引查詢索引的創建和使用/create indexcreate index idx_name on mytable using lucene(c1)options(block_size=1024)/索引執行Call run_build(table=mytable,show_involved_partition=true)bitmapBitmap索引,其索引采用bit數組進行存儲和計算操作
8、,位置編碼的每一位表示鍵值對應的數據行的有無,查詢時直接用索引位圖做運算,即可skipping掉大量數據idnameage1zs212ls223ww334zl345ll22age012342110000220100133001003400010bitmap1bitmap2bitmap3bitmap4將age所有值存成有序數組,根據過濾條件選取對應bitmap 進行交并運算,返回的結構即為具體某些行包含目標數據,如果返回結果位0 直接可以skipping掉整個文件,否則進行做page級別skipping。bitmap索引的創建和使用/create indexcreate index idx_na
9、me on mytable using lucene(c1)options(block_size=1024)/索引執行Call run_build(table=mytable,show_involved_partition=true)構建lucene索引要注意的點1)選擇 文件級別構建,2)異步構建方式,防止阻塞入庫流程。3)等值bitmap 占用空間較大,范圍查詢時非常不友好采用Bit-Slice Range Encoded Bitmap( 入參需要整數,對于string,double,float等類型 可以現在字典 然后再按字典值生成bitmap二級索引構建1)引入新的timeline類型
10、:index (社區已有相應pr,待合入)Index.request-索引計劃生成,可按實際用戶指定的索引類型生成Index.inflight-索引計劃執行Imit-索引數據提交整個索引構建流程按先調度后執行的異步模式執行2)借助index服務,負責索引計劃的執行,解放入庫程序timeCommit timelineinsertinsertindexinsertT1T2T3T4C2|doneC3-index|request C3-index|inflight C3-index|inflight t C3-index|done Index serverPush index planStart ex
11、ecute Finish and commit二級索引集成Lucene/bitmapcoordinatorwork1work2work3Index readerFile1File2File3split1split2split3skippingskippingscanIndexserver索引類型支持:支持 Lucene/bitmap。Bloomfilter 當前社區是直接放到mdt里面的并且實際文件較大,加載耗時較長。因此直接使用了parquet自身的能力替代索引應用:索引在work端生效,由于lucence/bitmap 索引構建出來的索引文件很大,無法放到coordinator里面直接sk
12、ipping 掃描文件。索引獲?。和ㄟ^與index server交互,獲取索引信息的位置,由work端獲取相應的索引文件,做裁剪。實際效果:采用我們采用和ck一樣的SSB數據集進行測試,數據規模1.5T,120億條數據。性能提升3x到11x各種索引對比和使用建議索引索引簡介簡介優點優點缺點缺點sort/z-order(min-max)入庫時指定常用的過濾字段排序。查詢通過文件的min-max值過濾不需要的文件數據本身即索引,無需額外空間。支持范圍查詢,等值查詢;同時對聚合操作可以減少shuffle開銷數據很難保證全局有序,隨著數據的寫入,表的有序性逐漸消失。排序比較耗資源。Bitmap其索引使
13、用bit數組進行存儲。位置編碼的每一位標識該行是否存在,查詢時直接用位圖快速過濾所需數據占用空間較小,創建和使用較快,支持范圍查詢,等值查詢對索引列有基數要求,太高沒優勢,太低空間效率和性能大幅度下降bloomfilterbloomfilter 可以快速判斷一個值是否在目標集合中,利用這個特性,可以很方便的確定文件是否包含目標數據,從而實現過濾等值查詢效率較高,實現簡單假陽性問題,只支持等值查詢,不適合低基數據Lucene利用lucene引擎強大的倒排索引和列式存儲能力,實現多維查詢,文本檢索比較成熟,常見的es和solr都以lucene為基礎。支持文本檢索,前綴查詢,正則匹配海量數據下,存儲
14、空間過大,并且索引文件數過多統計信息優化CBO:當前大數據查詢引擎可以使用基于成本的優化器(CBO)來改進查詢計劃,這對于多表關聯場景具有很好的效果。收集表和列的統計信息,并保證這些信息的實時性對于cbo至關重要。統計信息優化統計信息優化:1)利用hudi的MDT能力,實時收集統計信息并存入MDT,借助MDT和hudi表的強一致性保障對外提供可靠的,實時性統計信息。2)支持同步/異步方式構建統計信息Hudi tableData FilesMDT(statistic info)Metadata apiData locationqueueOptimizerSchedulerCBODataSourc
15、e apiDataSource apiProcessorProcessorProcessorworkerworkerworkerworkerworkerHudi meta client查詢瓶頸分析+索引緩存list filesPrune filesQuery enginedataMDTHudiList candidate filesList index info基于MDT簡單的查詢流程瓶頸點1:MDT的文件大小隨著表大小增長,當表中文件格式上萬甚至幾十萬,單次訪問mdt的性能會下降瓶頸點2:list files 和 list index info 兩個操作分屬于讀mdt表不同分區數據;實際環境
16、中大表每次調用mdt接口都要耗時400ms+,兩次耗時就接近1s,對于亞秒級查詢非常不友好瓶頸點3:MDT的查詢每次都是冷啟動,導致每次查詢都有不必要的開銷瓶頸點4:Parquet 元數據信息,讀取耗時優化:1)Coordinator/driver 側緩存mdt索引數據,減少直接訪問mdt開銷。2)數據入庫后利用callback機制,通知緩存側刷新緩存。查詢瓶頸分析+索引緩存Hudi 索引文件Hudi 數據文件(歷史入庫)Hudi 數據文件新增索引緩存driverexecutorJDBCServer文件裁剪數據讀取Spark增量數據入庫spark歷史數據入庫任務刷新索引寫入數據寫入索引寫入數據寫入通過緩存,查詢數據預熱等手段,日增入庫幾十TB的hudi表,多維查詢穩定在1s2s后續工作未來計劃 熱點數據緩存:緩存熱點數據文件。實時物化視圖:動態收集用戶查詢語句,在入庫時實時構建物化視圖。Mor表讀性能優化:引入delete vectors,平衡hudi讀寫開銷。感謝您的觀看演講人:孟濤華為高級工程師