時序數據庫(II)-預處理

大數據 物聯網 百度雲 Spark 中國大數據 2017-05-20

物聯網領域近期如火如荼,互聯網和傳統公司爭相佈局物聯網。作為物聯網領域數據存儲的首選時序數據庫也越來越多進入人們的視野,早在2016年7月,百度雲在其天工物聯網平臺上發佈了國內首個多租戶的分佈式時序數據庫產品TSDB。前文提到時序數據是一個寫多讀少的場景,對時序數據庫以及數據存儲方面做了論述,數據查詢和聚合運算同樣是時序數據庫必不可少的功能之一。如何支持在秒級對上億數據的查詢分組聚合運算成為了時序數據庫產品必須要面對的挑戰。

本文會從時序數據庫的查詢以及聚合運算角度展開,最後從如何解決時序數據的查詢問題入手深入分析。

1. 時序數據的查詢

用戶對時序數據的查詢場景多種多樣,總的來說時序數據的查詢分為兩種:原始數據的查詢和時序數據聚合運算的查詢。前者是對歷史高精度時序數據的查詢,查詢結果粒度太細,並不利於發現其規律性,趨勢性;也不適合展現給用戶,主要用於大數據分析的元數據。後者主要用來對數據做分析,例如dashboard等UI工具使用聚合查詢展示數據分析結果。通常數據分析的查詢範圍廣,查詢的數據量大,從而導致查詢的延時比較高,而往往分析工具又要求查詢延時低,大數據量低延時是時序數據查詢面臨的主要問題,本文主要探討聚合分析查詢的優化。

2. 時序數據的查詢的優化

從前文可瞭解到,時序數據的存儲主要包含單機和分佈式存儲。時序數據根據分片規則(通常使用metric+tags+時間範圍),將分片存儲在單機或者分佈式環境中。聚合運算查詢時,根據查詢條件查詢所有的數據分片,所有的分片按照時間戳合併形成原始數據結果,當查詢條件包含聚合運算時,會根據採樣窗口對數據進行聚合運算,最後返回運算結果。

數據聚合運算查詢延時的計算可以粗略的描述如下:

聚合運算查詢:數據分片的查詢合併 + 聚合運算 + 數據返回

時序數據庫(II)-預處理

圖1 時序數據查詢流程

針對聚合運算的查詢可以從兩個方向進行優化:分佈式聚合查詢和數據預處理。分佈式聚合查詢通過併發使用多個節點並行查詢和計算來提高性能,減少了分片查詢以及聚合運算的時間,保證了時序數據分析結果秒級返回。而數據預處理則是通過空間換時間的思路,將數據根據查詢規則預先計算,查詢時直接返回少量的聚合運算結果來保證更低的查詢延時。時序數據庫可以分別從二種方式進行查詢優化,本文之後主要針對數據預處理做深入分析。

3. 時序數據查詢預處理

時序數據的預處理根據實時性可以分為二種:批處理和流式處理。

l 批處理

批處理是使用pull的方式查詢時序原始數據,預先進行聚合運算獲取數據結果寫入時序數據庫,當進行聚合查詢時直接返回預處理後數據結果。時序數據庫定期輪詢規則,根據採樣窗口創建預處理任務,任務根據規則信息形成多個任務隊列。隊列內任務順序執行,隊列間任務併發執行,多任務隊列保證了多租戶對計算資源共享。

時序數據庫(II)-預處理

圖2 批處理

預處理任務的執行主要分為二種環境:單機環境以及分佈式環境。

單機環境:任務調度模塊邏輯相對簡單,調度模塊通過進程內消息或者輪詢多個任務隊列,順序獲取隊列內未執行的預處理任務,提交任務到線程池執行。

分佈式環境:多個計算節點共享任務隊列,對預處理任務進行搶佔執行,能夠支持計算節點的線性擴展,分佈式環境可以包含多種實現。

a) 消息隊列方式: 時序數據庫輪詢預處理規則,創建預處理任務時,添加任務消息到消息隊列,同時設置消息分組,相同的規則使用相同的分組。計算節點消費任務消息,組內消息順序執行,組外消息併發執行。

b) 一致性hash方式:多個計算節點通過一致性hash算法,形成一個一致性hash環,預處理任務根據分片算法(使用規則信息)將相同的任務隊列提交到相同的計算節點,保證任務隊列順序執行。

c) 調度模塊方式: 由調度模塊統一進行任務隊列的調度,相同規則任務提交到相同的計算單元,保證其順序執行。

l 流式處理

流式處理框架同樣能夠支持對數據流做聚合運算,不同於批處理方式,時序數據需要路由到流式處理框架例如Spark,Flink等,當數據時間戳到達採樣窗口時,在內存中實時計算,寫入時序數據庫。

時序數據庫(II)-預處理

圖3 流式預處理

流式處理屬於分佈式內存計算,相同的採樣窗口數據需要在同樣的計算單元中聚合運算,因此需要將相同數據流映射到相同的計算單元,數據流任務調度是流式處理需要解決的核心問題。

a)中心化的調度:由調度模塊統一調度數據流,將相同的數據流使用同一的計算單元處理。

b) 一致性hash方法:通過使用分片(使用規則信息),將相同的預處理規則數據流映射到相同的計算單元來保證內存數據計算的正確性。

批處理的優點是支持對歷史時序數據的處理,實現簡單。但是批處理具有查詢數據量大,非實時的缺點。流式處理的優點是數據實時計算,無需查詢原始數據。但是流式處理需要特殊處理寫入的歷史數據,也需要處理運算過程中崩潰的計算單元。批處理和流程處理各有優缺點,通常時序數據庫需要結合二種方式對數據進行預處理。

4. 真實用例

l OpenTsdb時序數據庫

OpenTsdb當前最新版本並不支持數據預處理,但是在OpenTsdb的RoadMap中可以看到,在OpenTsdb2.4以及後續版本中準備使用新的API來支持,主要使用批處理以及流式處理。

批處理:根據採樣窗口,定時查詢原始數據進行聚合運算,存儲計算結果。

流式處理:結合Spark、Flink等流式處理框架,對時序數據流做實時計算。

OpenTsdb期望預處理能夠提供用戶更加高效的查詢體驗,同時解決大數據查詢計算時系統崩潰的問題。

l InfluxDB時序數據庫

InfluxDB支持CQ(continous query)的功能,CQ通過定期pull原始時序數據進行計算,將計算結果存儲在內部特殊metric中。用戶通過創建CQ來實現對數據預處理,InfluxDB的CQ主要參數包含:聚合函數名稱、儲存metric的名稱、查詢度量的名稱、採樣時間窗口以及標籤索引。

SELECT <function[s]> INTO <destination_measurement> FROM <measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>]

5. 結束語

使用預處理能有效的降低採樣聚合函數查詢對系統的瞬時查詢壓力,實現數據計算一次多次查詢,同時也能有效的降低查詢延遲,提高用戶體驗。百度天工時序數據庫平臺也早在2016年末就推出了預處理功能,滿足了物可視對聚合查詢高頻和低時延的需求。

但是對大量原始數據的查詢,時序數據庫依然會遇到性能、高延時等挑戰,後續文章將會對此做深入分析。

相關推薦

推薦中...