十分鐘看懂時序資料庫(V) 分布式計算

2021-08-17 00:22:32 字數 2977 閱讀 9348

前文提到資料查詢特別是大資料量的聚合分析查詢是時序資料庫需要解決的乙個主要問題,之前的文章介紹了通過預處理資料的方法,用空間換時間的思路,降低了大資料量聚合分析的延時。

本文將從分布式計算方向思考,從併發的角度介紹時序資料庫如何降低資料查詢的延時。

1. 單機時序資料的聚合計算

我們先來看看單機是如何支援單聚合函式的計算。單機聚合計算非常簡單,使用者查詢資料時,計算節點查詢獲取時間範圍內的所有時序資料,節點按照時序使用聚合函式對資料進行計算,生成計算結果。

分析查詢也經常會使用巢狀聚合,巢狀聚合函式使用不同的時間視窗,內部函式通常使用小時間視窗,外部使用更大的時間視窗。那巢狀聚合查詢在單機如何計算呢?和單一聚合函式類似,巢狀聚合函式的計算是在內部聚合函式計算的結果之上,根據時間再次計算,獲取結果。如下圖查詢月平均氣溫最低的一周以及平均氣溫。總體來說,單機時序資料的巢狀和非巢狀聚合函式的實現過程簡單直接,很容易理解。

單機計算有什麼特徵呢?從單機的計算過程,我們可以看到單機需要查詢獲取所有原始時序資料,原始資料查詢的io成本和計算成本非常高,整個查詢的延時會很高,但是聚合運算後的結果往往資料量很少。

2. 分布式聚合計算

分布式計算是一種計算方法,與之相對的是集中式計算,是通過使用多個計算資源在分布式的環境中併發執行計算的方法。在時序資料庫領域,隨著資料的增長,時序資料會越來越多,單機的儲存、查詢和聚合分析io時間成本非常高,雖然使用更加高效的硬體也能夠緩解,但是有處理上限,基於成本等因素的考慮,分布式聚合查詢仍然是時序資料庫自然而然的選擇。

當時序資料庫儲存的資料越來越多時,聚合查詢不可避免,這也是olap分析查詢中最常見操作之一,使用預處理可以提高查詢效能,但是不夠靈活。分布式聚合計算則是能夠使用分布式的特性,通過多個計算資源平行計算,再對結果進行合併返回,通過併發提高聚合查詢效能。

3. 分布式時序資料聚合計算

時序資料的分布式聚合計算需要多個節點平行計算,邏輯上也是乙個map/reduce的過程,map過程需要對原始時序資料進行分片,分別聚合計算。reduce過程則是對多個分片計算結果的合併。往往聚合運算的結果和原始資料有著明顯資料量的差距,其次分布式計算可以更多的考慮資料的本地化,因此使用分布式聚合計算顯然能夠有效提高查詢效能。

時序資料要進行分布式計算需要解決兩個基本問題:時序資料計算分片以及計算結果的合併。

3.1 時序資料計算分片

時序資料聚合計算的分片可以分為幾個維度考慮:儲存分片、聚合函式時間視窗以及查詢條件。

首先,時序資料聚合查詢包含多種條件,對時序資料進行分組聚合查詢也是一種常用查詢,不同的分組原始時序資料不同,因此可以通過查詢分組對時序資料計算進行分片,不同的分組使用不同節點併發計算。

其次,時序資料聚合查詢函式通常都包含時間視窗,相同時間視窗的原始資料聚合計算為乙個資料點,不同的時間視窗用於計算的時序原始資料不同,因此也同樣可以通過時間視窗對時序資料計算進行時間維度的分片,不同的節點計算不同時間視窗的資料。

第三,按照儲存分片進行計算。我們先來回憶一下前文說描述的時序資料的儲存,時序資料由於儲存的資料量很大,單機並不能滿足需求,因此需要對時序資料進行分片儲存,分片(shard)通常使用metric+tags的方式進行,不同的分片儲存在不同的儲存節點,分片儲存著原始時序資料,使用儲存分片進行分片計算,也是一種自然而然的選擇。如下圖先對shard進行分片計算查詢,最後對結果進行合併。

分布式聚合查詢在實現時,往往多種計算分片方式同時使用,聚合計算盡量保證本地化、 盡量多的併發執行。

3.2 時序資料計算結果的合併

時序資料聚合計算結果的合併和計算分片的方式有相關性,不同分片方式結果的合併方式也不同。

首先,對於分組聚合查詢結果的合併來說,不同的分組查詢結果屬於不同的分組,按照分組聚合查詢條件合併結果,就能形成計算結果。

其次,對於聚合函式時間視窗分片查詢的合併來說,不同的時間視窗的計算結果雖然屬於同乙個分組,但是結果在時間是上有序的,因此只需要對分片計算結果按照時序排序合併,就能獲取最終計算結果。

第三,對於儲存分片進行分片計算結果的合併來說,合併相對複雜,因為在同乙個時間視窗內,可能會包含多個分片,多個分片上同一時間視窗需要聚合運算為乙個資料點。聚合運算結果的合併就需要分析聚合函式的特性來進行,例如在a和b兩個儲存分片的同一時間視窗內sum聚合函式,顯然計算結果可以直接累加sum(au b) = sum(a) + sum(b),但是並不是所有的聚合函式都滿足這一特性,需要根據聚合函式的特性做一一的分類。

當使用多種分片方式進行聚合查詢時,相應結果的合併也同樣更為複雜。

3.3 時序資料巢狀聚合運算

巢狀聚合查詢也是資料分析的常用方式,巢狀聚合運算往往多個聚合函式巢狀而成,每個聚合函式的計算屬性並不完全相同。在考慮計算分片時,可以考慮將外部巢狀函式和內部巢狀函式分開計算,選擇更加有利的分片方式。例如考慮diff(sum(a, 1day))巢狀聚合函式(diff聚合函式是計算前後時間序列結果的差值),既可以使用按照時間視窗的方式分片計算,也同樣可以考慮將diff的計算和sum的計算拆分開來,先使用儲存分片的方式聚合計算sum(a,1day)的結果,結果合併時計算diff巢狀聚合函式的結果,儲存分片的分布式計算能夠充分利用資料本地化的特性,因此使用後者顯然更加高效。巢狀聚合函式的資料如何分片計算,需要根據聚合函式特性以及場景具體分析,這仍然是乙個需要深入考慮的問題。

3.4 計算任務的排程和優化

時序資料分布式計算除了計算分片和資料合併問題以外,同樣需要處理任務排程和sql查詢優化的問題,現有的很多開源框架spark、presto、mongodb(注1)、hive(注2)都有相應的解決方案,這裡就不做深入討論了。

4. 時序資料聚合查詢的難題

時序資料分布式聚合計算仍然有很多難題,例如count(distinct field),這類聚合函式的特點是在計算結果時內部需要儲存大量的中間資料用於計算,需要消耗大量計算和儲存資源。雖然很多大資料領域分布式查詢引擎等通過演算法都嘗試做了部分優化,但是仍然未能完全解決所有問題。

5. 總結

在時序資料庫大資料量聚合分析查詢中,聚合運算直接影響著查詢效能,使用分布式計算的方法,能夠有效的提高查詢效能,相比較於預處理查詢更加的靈活。本文主要從分片以及如何併發的角度做了討論,但是一些特殊巢狀聚合場景的優化仍舊是需要深入思考課題。

注1:注2:

十分鐘看懂時序資料庫(III) 壓縮

壓縮對於時序資料庫是至關重要的。因為時序資料庫面對的物聯網場景每天都會產生上億條資料。眾所周知,在大資料時代的今天資料的重要性是不言而喻的,資料就是公司的未來。但如果無法對這些時序資料進行很好的管理和壓縮,那將給客戶帶來非常高的成本壓力。如前文提到的,工業物聯網環境監控方向的客戶,一年產生1p的資料...

十分鐘看懂時序資料庫(III) 壓縮

壓縮對於時序資料庫是至關重要的。因為時序資料庫面對的物聯網場景每天都會產生上億條資料。眾所周知,在大資料時代的今天資料的重要性是不言而喻的,資料就是公司的未來。但如果無法對這些時序資料進行很好的管理和壓縮,那將給客戶帶來非常高的成本壓力。如前文提到的,工業物聯網環境監控方向的客戶,一年產生1p的資料...

十分鐘看懂時序資料庫(IV) 分級儲存

本文將介紹通過對資料進行分級儲存,從使用不同儲存介質,以及減少資料的副本數的方面,介紹如何在保證時序資料的查詢效能的前提下,降低時序資料的儲存成本。1.分級儲存 分級儲存,就是按某一特徵,將資料劃分為不同的級別,每個級別的資料儲存在不同成本的儲存介質上。為什麼需要對資料進行分級儲存?為什麼不把所有的...