自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)時物化視圖:加速大規(guī)模時間序列數(shù)據(jù)查詢的利器

大數(shù)據(jù) 數(shù)據(jù)分析
本文將分享如何在產(chǎn)品中實(shí)現(xiàn)實(shí)時物化視圖,重點(diǎn)聚焦于加速大規(guī)模時間序列數(shù)據(jù)查詢。實(shí)時物化視圖就是一種適用于時間序列數(shù)據(jù)的預(yù)計算加速過程,其核心思想是將歷史物化數(shù)據(jù)與計算結(jié)果保留下來,并在新數(shù)據(jù)到來時進(jìn)行增量更新。在高效地管理和維護(hù)物化操作的同時,減少計算的開銷。

一、為什么需要物化視圖

日常生活中,我們每天都會產(chǎn)生大量的數(shù)據(jù)。根據(jù)統(tǒng)計,僅在2020年,人類每天就產(chǎn)生了約2.5EB(即2.5 x 10^18字節(jié))的數(shù)據(jù)。而預(yù)計到2025年,這個數(shù)字將會達(dá)到463EB(即463 x 10^18字節(jié)),增長速度非??捎^。隨著數(shù)據(jù)規(guī)模的不斷擴(kuò)大,數(shù)據(jù)分析查詢變得更加復(fù)雜和耗時,加速查詢成為分析的關(guān)鍵任務(wù)。

圖片

常用的分析查詢加速手段主要包括以下幾種:

  • 緩存:通過將數(shù)據(jù)從慢存儲介質(zhì)緩存到快存儲介質(zhì),例如內(nèi)存中,可以在分析數(shù)據(jù)過程中獲得更快的數(shù)據(jù)讀取響應(yīng),從而實(shí)現(xiàn)加速效果。
  • 并行計算和分布式計算:將計算任務(wù)分解為多個子任務(wù)并行處理,充分利用計算資源,提高分析查詢的速度和效率。
  • 數(shù)據(jù)分區(qū)和索引:減少查詢時需要掃描和分析的數(shù)據(jù)量,從而達(dá)到加速的效果。
  • 預(yù)計算:提前對數(shù)據(jù)進(jìn)行計算和聚合,并將結(jié)果物化存儲,以便在查詢時直接使用計算好的結(jié)果來進(jìn)行加速。物化視圖是預(yù)計算的一種重要實(shí)現(xiàn)方式。

二、什么是實(shí)時物化視圖

物化視圖是預(yù)先計算出常用耗時或復(fù)雜查詢的結(jié)果集,使得在查詢時能夠快速訪問和使用這些預(yù)先計算的結(jié)果。如下圖左表是一張商品訂單信息表,包含簡單的商品售賣信息。傳統(tǒng)方式下,每次需要計算每個商品的總銷售額時,都要從左邊原始數(shù)據(jù)表中讀取數(shù)據(jù)并進(jìn)行計算,這既耗時又消耗系統(tǒng)資源。通過物化視圖,我們可以事先對數(shù)據(jù)進(jìn)行預(yù)計算,并將計算結(jié)果存儲為右側(cè)的結(jié)果表。下一次查詢時,只需直接從右表物化視圖中讀取數(shù)據(jù),無需再進(jìn)行復(fù)雜的計算操作,節(jié)省了大量時間和資源開銷,大幅提升查詢的效率和響應(yīng)速度。

圖片

然而在實(shí)際場景中,隨著時間的增長,數(shù)據(jù)量也會持續(xù)增加。不同時間查詢商品總銷售額時,結(jié)果也會相應(yīng)地發(fā)生變化,存儲下來的物化數(shù)據(jù)也需要隨著時間的推移進(jìn)行更新。從時間序列數(shù)據(jù)中進(jìn)行全量數(shù)據(jù)更新十分耗時,且物化結(jié)果會隨著新數(shù)據(jù)的產(chǎn)生而失效。但時間序列數(shù)據(jù)通常具有Append-only特性,即已經(jīng)存在的數(shù)據(jù)幾乎不會發(fā)生變化。在物化數(shù)據(jù)和計算過程中,可以重復(fù)使用歷史的物化計算結(jié)果,當(dāng)新數(shù)據(jù)到來時,只需對原有的物化預(yù)計算數(shù)據(jù)進(jìn)行增量更新。

實(shí)時物化視圖就是一種適用于時間序列數(shù)據(jù)的預(yù)計算加速過程,其核心思想是將歷史物化數(shù)據(jù)與計算結(jié)果保留下來,并在新數(shù)據(jù)到來時進(jìn)行增量更新。在高效地管理和維護(hù)物化操作的同時,減少計算的開銷。

圖片

在時間序列上實(shí)現(xiàn)實(shí)時物化視圖的關(guān)鍵點(diǎn)主要有三個:

  • 存儲:在實(shí)時物化視圖中,需要定義好物化表的結(jié)構(gòu),將物化數(shù)據(jù)存儲下來。存儲可以采用適當(dāng)?shù)拇鎯橘|(zhì)和數(shù)據(jù)結(jié)構(gòu),以滿足查詢性能和存儲需求。通過合理的存儲設(shè)計,加上合適的索引壓縮方式,可以確保物化數(shù)據(jù)的高效訪問和使用。
  • 更新:實(shí)時物化視圖需要進(jìn)行定期更新或事件驅(qū)動的增量更新。定期更新意味著根據(jù)一定的時間間隔,例如每小時、每天或每周對物化數(shù)據(jù)進(jìn)行更新。事件驅(qū)動更新則是根據(jù)數(shù)據(jù)的變化事件觸發(fā)更新操作。通過定期更新或事件驅(qū)動更新,可以保持物化數(shù)據(jù)與原始數(shù)據(jù)的一致性,并確保查詢結(jié)果的準(zhǔn)確性。
  • 預(yù)計算:在實(shí)時物化視圖中,預(yù)計算是一個重要環(huán)節(jié),需要提供增量更新下的預(yù)計算方式。

三、怎樣實(shí)現(xiàn)實(shí)時物化視圖    

炎凰產(chǎn)品本身是一個面向可觀測性數(shù)據(jù)的分析平臺,可觀測數(shù)據(jù)天然帶有時間戳,分析時會自然而然給查詢帶上查詢時間窗。炎凰產(chǎn)品在設(shè)計實(shí)時物化視圖時,期望物化視圖的查詢能適應(yīng)任意的時間窗口,并得到準(zhǔn)確的查詢結(jié)果?;谶@樣的目標(biāo)進(jìn)行了如下實(shí)現(xiàn)。

對隨著時間增長的原始時間數(shù)據(jù),通常會拆分成小的數(shù)據(jù)塊分片存儲。分片規(guī)則通常基于導(dǎo)入時間范圍、累積數(shù)據(jù)量、其他標(biāo)簽信息等進(jìn)行分片。針對每個原始時間數(shù)據(jù)分片分別進(jìn)行預(yù)計算得到對應(yīng)的物化數(shù)據(jù)分片,當(dāng)有新數(shù)據(jù)來臨時,只需要對新數(shù)據(jù)進(jìn)行物化預(yù)計算操作。

得到每個原始數(shù)據(jù)分片對應(yīng)的預(yù)計算物化數(shù)據(jù)分片后,查詢時通常要把這些物化分片合并再聚合。該過程類似于常見的Map-reduce計算框架:Map過程將數(shù)據(jù)拆分成小數(shù)據(jù)塊,分發(fā)到不同計算節(jié)點(diǎn)進(jìn)行計算,得到部分?jǐn)?shù)據(jù)的部分聚合結(jié)果。Reduce階段將部分結(jié)果合并再聚合得到最終結(jié)果返回給請求端。實(shí)時物化視圖的實(shí)現(xiàn)中,對每個原始數(shù)據(jù)分片進(jìn)行物化預(yù)計算操作類似于Map操作。這意味著每個分片都會獨(dú)立進(jìn)行預(yù)計算,生成部分聚合結(jié)果。而在查詢結(jié)果時,需要將這些物化數(shù)據(jù)分片進(jìn)行合并聚合,類似于Reduce操作。

需要注意的是,實(shí)時物化視圖的實(shí)現(xiàn)過程中,每個數(shù)據(jù)分片進(jìn)行預(yù)計算的時機(jī)是靈活的。它可以根據(jù)需要隨著時間的增長而分別進(jìn)行一些預(yù)計算操作。這意味著不同的分片可能會在不同的時間點(diǎn)進(jìn)行預(yù)計算,根據(jù)數(shù)據(jù)的變化和更新情況來動態(tài)地進(jìn)行預(yù)計算操作。

圖片

圖片

以價格的平均值為例,如上圖所示,基于原始數(shù)據(jù)表①求價格的平均值,通常會先求和再計數(shù),將中間預(yù)計算結(jié)果②存儲下來。依此類推,對每個原始時間序列數(shù)據(jù)分片計算對應(yīng)的部分?jǐn)?shù)據(jù)的部分聚合計算操作。查詢結(jié)果時只需要從表②中讀取部分聚合結(jié)果,對其合并得到如表③的平均值。

在查詢時,查詢時間范圍通常不會覆蓋完整的物化分片所對應(yīng)的時間范圍,可能只包含某些物化分片的部分時間范圍,也可能包含正在導(dǎo)入的數(shù)據(jù)或沒有物化數(shù)據(jù)的時間范圍。為了適應(yīng)不同時間范圍的查詢,我們期望預(yù)計算物化數(shù)據(jù)保留一定的時間性。上述商品訂單信息①中,會天然帶有時間戳信息,得到的部分聚合結(jié)果②,是十分單薄的數(shù)據(jù)表總和和數(shù)量值,完全喪失了時間信息。在此基礎(chǔ)上對預(yù)計算數(shù)據(jù)進(jìn)行時間分桶,例如將②中結(jié)果進(jìn)行一小時的分桶,得到右下方綠色表的中間結(jié)果。該預(yù)計算中間結(jié)果帶有時間信息,包含每一小時時間桶下部分?jǐn)?shù)據(jù)的部分聚合結(jié)果。

將上述計算價格平均值A(chǔ)VG的過程抽象成計算表達(dá)式:在預(yù)計算過程中會保留SUM和COUNT值,在最后請求查詢結(jié)果的時候通常會對SUM求和之后再除以SUM數(shù)量值,這樣就得到了最后查詢請求結(jié)果SUM(SUM)/SUM(COUNT)。在這個基礎(chǔ)上想要對預(yù)先物化數(shù)據(jù)進(jìn)行時間分桶,相當(dāng)于在預(yù)計算步驟中加上GROUP BY操作。具體見下圖。

至此,我們得到了每個原始數(shù)據(jù)分片對應(yīng)的預(yù)計算物化結(jié)果分片,每個物化分片包含了時間桶信息。查詢物化視圖時,查詢時間窗口可能包含完整的物化分片范圍,也可能包含正在導(dǎo)入的或者沒有物化的數(shù)據(jù)分片的時間范圍。如上圖所示,將時間窗口按照是否已預(yù)計算物化進(jìn)行劃分。在物化分片4-7對應(yīng)的時間范圍上,可以采用預(yù)計算好的物化分片中的存儲結(jié)果參與計算,這作為第一部分P1。對于右側(cè)正在導(dǎo)入的數(shù)據(jù),還在內(nèi)存中未進(jìn)行數(shù)據(jù)分片落盤,需要直接從原始數(shù)據(jù)中讀取數(shù)據(jù)參與計算,這作為第二部分P2。對于左側(cè)剩余時間范圍,包含了物化分片3的部分時間范圍,由于物化分片3上的數(shù)據(jù)已經(jīng)進(jìn)行了部分聚合操作,喪失了完整的原始時間信息,因此沒有辦法完全利用物化分片完整的部分聚合結(jié)果參與計算。將這部分?jǐn)?shù)據(jù)按照時間分桶進(jìn)行拆分,落在完整時間桶中的數(shù)據(jù)可以從物化分片結(jié)果中讀取數(shù)據(jù)參與計算,作為第三部分P3。沒有落在完全時間桶范圍中的時間范圍,只能從原始數(shù)據(jù)分片中讀取數(shù)據(jù)參與計算,作為第四部分P4。通常P1加P3占查詢時間范圍比例比較高,當(dāng)我們在查詢物化視圖時,對這部分?jǐn)?shù)據(jù)進(jìn)行了預(yù)計算加速,從而加速整個查詢。

圖片

P3、P4部分的劃分略顯抽象,假設(shè)查詢起始時間為11:22,給定時間分桶大小是1小時(1h),物化分片3占用的時間分桶為10:00到14:00。那么以12:00為分界限,則12:00-14:00部分時間已經(jīng)落入完整時間桶范圍即是P3部分。而11:22-12:00沒有完整落入時間桶范圍,必須從原始數(shù)據(jù)中讀取時間參與計算,即為P4部分。

圖片

以上,我們將查詢時間范圍劃分成了四個部分。第一部分是包含完整物化分片所在時間范圍的數(shù)據(jù)。第二部分是沒有物化的數(shù)據(jù)的時間范圍。這里可以是正在導(dǎo)入的數(shù)據(jù)時間范圍,也可能是創(chuàng)建完物化視圖之后還沒有來得及進(jìn)行物化預(yù)計算的數(shù)據(jù)時間范圍。第三部分是已經(jīng)物化的數(shù)據(jù)但只取了部分時間桶里的數(shù)據(jù)結(jié)果。第四部分雖然已經(jīng)進(jìn)行過物化但由于丟失部分時間信息,沒辦法從時間桶的部分聚合結(jié)果中直接使用參與計算?;谶@四部分時間窗口的劃分,對P2和P4的時間窗口的數(shù)據(jù),需要在查詢時進(jìn)行預(yù)計算相關(guān)的操作,例如AVG需要進(jìn)行SUM/COUNT的計算。對于P1和P3數(shù)據(jù)已經(jīng)做了聚合操作,直接從物化分片中讀取聚合結(jié)果就可以了。得到這兩部分?jǐn)?shù)據(jù)再將所有SUM和COUNT進(jìn)行聚合就得到了最終的查詢結(jié)果。這樣就完成了查詢物化視圖適應(yīng)任何時間窗口的目標(biāo),并保證結(jié)果一致性。

炎凰產(chǎn)品提供SQL接口進(jìn)行查詢分析,針對上述實(shí)現(xiàn)定義了物化視圖創(chuàng)建的DDL。如上圖所示,在DDL中給定WITH語句,提供了創(chuàng)建物化視圖的兩個參數(shù)。前文中四個時間窗口中未物化數(shù)據(jù)部分,是需要從原始數(shù)據(jù)中去讀取數(shù)據(jù)的,當(dāng)物化程度比較高時,這部分?jǐn)?shù)據(jù)所占比例會非常小,當(dāng)請求端不需要非常準(zhǔn)確的查詢結(jié)果時,往往可以忽略這部分?jǐn)?shù)據(jù)不參與計算,DDL建模時可以通過指定MATERIALIZED_ONLY=true在查詢中忽略這部分?jǐn)?shù)據(jù),進(jìn)一步加速查詢分析。TIME_BUCKET即是前述時間桶的配置,該參數(shù)需要根據(jù)常用查詢的時間范圍和數(shù)據(jù)的時間分布來自定義。另外,在創(chuàng)建物化視圖時,如果不需要關(guān)注過去數(shù)據(jù)的情況,就可以指定WITH NO DATA,不對過去數(shù)據(jù)進(jìn)行后臺的預(yù)計算操作。同時,炎凰產(chǎn)品提供了SHOW MATERIALIZED VIEW語句來展示物化視圖的基本信息和狀態(tài)。

上圖在炎凰產(chǎn)品中定義了一個簡單的數(shù)據(jù)集,查詢本身帶有時間窗口。點(diǎn)開每條數(shù)據(jù)可以看到數(shù)據(jù)上的每個字段。在這個數(shù)據(jù)集上創(chuàng)建一個時間桶大小為1小時的物化視圖,計算平均值,如下所示。

圖片

通過SHOW語句可以看到物化視圖的基本信息,并提供了對應(yīng)物化進(jìn)度的狀態(tài)展示,物化進(jìn)度是通過已經(jīng)物化的數(shù)據(jù)分片占所有需要物化數(shù)據(jù)分片的比例來表達(dá)的。

圖片

在炎凰產(chǎn)品中,預(yù)計算結(jié)果存成了Parquet數(shù)據(jù)格式。Parquet是一種網(wǎng)格存儲,使用了高效的壓縮算法和數(shù)據(jù)編碼方式實(shí)現(xiàn)數(shù)據(jù)精簡,能夠減少數(shù)據(jù)IO,同時提高性能。實(shí)時物化視圖更新是系統(tǒng)自動維護(hù)的,是數(shù)據(jù)變化事件驅(qū)動更新。當(dāng)有新數(shù)據(jù)到達(dá)或滿足某些特定條件時候系統(tǒng)會自動觸發(fā)相應(yīng)預(yù)計算和更新操作,更新操作范圍是以數(shù)據(jù)分片為單位的,這種事件驅(qū)動方式使物化視圖能夠靈活響應(yīng)數(shù)據(jù)變化和查詢請求,保持物化視圖的實(shí)時性。前文中描述的例子多以聚合為主,物化視圖的定義也可以使用非聚合的查詢,當(dāng)我們只需要某部分字段或者某些過濾條件下的特定數(shù)據(jù)時,也可以創(chuàng)建物化視圖來加速查詢分析。

這種實(shí)現(xiàn)下物化視圖的性能,與數(shù)據(jù)的時間分布、查詢的時間范圍,以及分片大小、時間分桶的大小等因素息息相關(guān)。這里我們用產(chǎn)品進(jìn)行一個簡單的性能測試,在炎凰系統(tǒng)中打開調(diào)試debug日志,每天大約能收集到1億條數(shù)據(jù),占用1000個數(shù)據(jù)分片。在這樣的數(shù)據(jù)上查詢每個數(shù)據(jù)集被使用的次數(shù)時,需要40s。

分別在該數(shù)據(jù)集上創(chuàng)建分桶大小為1小時和1天的實(shí)時物化視圖。如下圖可以看到查詢性能有明顯改善,時間分桶大小為1天的物化視圖查詢效率優(yōu)于1小時,這是由于查詢的時間窗口大小為1天和時間桶大小一致。原始數(shù)據(jù)分片存儲大小為15M/Slice,不同時間分桶下的物化分片在存儲上的優(yōu)勢相當(dāng),這得益于parquet的高性能存儲。

四、展望和總結(jié)

前文介紹了產(chǎn)品中對實(shí)時物化視圖的實(shí)現(xiàn)。我們還會對物化視圖進(jìn)行進(jìn)一步的探索:

  • 智能路由:當(dāng)查詢原始數(shù)據(jù)時,利用了物化視圖中的一些聚合邏輯或過濾邏輯時,系統(tǒng)可以自動將基于原始數(shù)據(jù)的查詢改寫成基于物化視圖的查詢,進(jìn)行智能路由,自動為查詢加速。
  • 分層物化:文中提到的物化存儲主要是按時間范圍劃分的,但實(shí)際上,物化結(jié)果物理表的存儲,可以按特定條件進(jìn)行進(jìn)一步分區(qū),從而進(jìn)一步加速。
  • 另一種ETL:物化視圖的維護(hù)過程是從原始數(shù)據(jù)中讀取數(shù)據(jù),進(jìn)行預(yù)計算操作,再將預(yù)計算結(jié)果存儲下來,這一過程是非常類似于ETL的。在系統(tǒng)中針對數(shù)據(jù)的所有計算操作都可以用DLL來表達(dá),包括索引過程、查詢過程等。

圖片

本次主要分享了實(shí)時物化視圖的實(shí)現(xiàn)。實(shí)時物化視圖通過預(yù)先物化和存儲物化數(shù)據(jù),使得查詢操作可以從物化視圖中直接獲取數(shù)據(jù),而不需要重新在原始時間序列數(shù)據(jù)上執(zhí)行復(fù)雜操作,從而大大提高了查詢性能。實(shí)現(xiàn)中將數(shù)據(jù)進(jìn)行時間分桶,以數(shù)據(jù)事件觸發(fā)自動維護(hù)更新,保持了物化視圖查詢與原始數(shù)據(jù)查詢的實(shí)時一致性。但實(shí)時物化視圖會帶來額外的存儲空間以及維護(hù)成本,使用物化視圖需要結(jié)合實(shí)際場景,充分考慮查詢的時間窗口范圍、數(shù)據(jù)時間分布,來定制分析加速。

圖片

在物化視圖方面還有很多值得探索的方面,期待以后有機(jī)會和大家交流分享。

五、Q&A

Q1:物化視圖能替換現(xiàn)有報表模型嗎?

A:會在報表中利用物化視圖加速。很多時候會去頻繁查看報表,報表背后的查詢通常會使用物化視圖查詢,加速報表展示。

Q2:這里提到具體物化視圖的實(shí)現(xiàn),具體是用哪個框架實(shí)現(xiàn)的?

A:這是炎凰產(chǎn)品自己的物化視圖實(shí)現(xiàn),沒有依賴于其他框架。

Q3:這里涉及的聚合函數(shù)有什么要求嗎?

A:在整個分享過程中,講述了實(shí)時物化視圖的基本實(shí)現(xiàn)思路。預(yù)計算過程和系統(tǒng)底層的計算引擎相關(guān)。當(dāng)計算引擎能支持聚合計算預(yù)計算(pre-aggregation)和后處理(post-aggregation)的操作分解時,在實(shí)時物化視圖中都可以使用。通常而言,物化視圖不支持非確定聚合計算、非線性聚合計算、依賴于動態(tài)參數(shù)的聚合計算等。

責(zé)任編輯:姜華 來源: DataFunTalk
相關(guān)推薦

2023-09-18 07:23:45

2010-07-30 17:46:46

DB2物化視圖

2010-07-27 14:26:08

DB2數(shù)據(jù)庫物化視圖

2010-08-02 13:25:23

DB2物化視圖

2016-09-18 15:54:57

百度FPGASQL

2010-08-19 17:17:08

DB2數(shù)據(jù)庫

2010-08-13 10:29:35

DB2數(shù)據(jù)庫

2010-08-20 13:33:50

DB2物化視圖

2022-06-13 11:25:38

SketchQuantile算法

2009-05-06 11:09:10

Oracle物化視圖數(shù)據(jù)庫

2024-01-31 23:22:35

vaexPython

2024-03-06 09:30:13

PostgreSQL子查詢視圖

2009-11-17 15:59:25

Oracle物化視圖

2011-08-22 16:23:47

SQL Server數(shù)視圖復(fù)雜的數(shù)據(jù)查詢

2010-05-20 11:18:39

2024-04-03 09:12:03

PostgreSQL索引數(shù)據(jù)庫

2024-04-17 07:21:52

物化視圖查詢加速器數(shù)據(jù)倉庫

2024-04-02 14:29:12

網(wǎng)絡(luò)安全數(shù)據(jù)泄露
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號