預(yù)降采樣
預(yù)降采樣可以在數(shù)據(jù)寫入時就按指定時間粒度對數(shù)據(jù)進(jìn)行預(yù)計算并單獨(dú)存儲,降采樣查詢時可以自動查詢匹配到的預(yù)降采樣數(shù)據(jù),以降低訪問延遲。本文介紹預(yù)降采樣的概念,創(chuàng)建和管理預(yù)降采樣規(guī)則的方法,查詢預(yù)降采樣數(shù)據(jù)的方法,以及預(yù)降采樣的最佳實(shí)踐。
前提條件
時序引擎版本為3.4.19以上。
功能介紹
預(yù)降采樣
預(yù)降采樣是一種預(yù)計算的方法。在數(shù)據(jù)寫入時根據(jù)配置的預(yù)降采樣規(guī)則將數(shù)據(jù)降低精度后單獨(dú)存儲,查詢時按查詢條件中指定的降采樣精度自動查詢最接近預(yù)降采樣精度的數(shù)據(jù),然后交由執(zhí)行引擎進(jìn)行后續(xù)處理,以減少實(shí)時查詢需要計算的數(shù)據(jù)量,降低訪問延遲。
與連續(xù)查詢相比,預(yù)降采樣主要有以下優(yōu)勢:
寫入即可見,無需連續(xù)查詢的執(zhí)行等待時間。
性能高,對于寫入性能無影響,寫入時實(shí)時轉(zhuǎn)存數(shù)據(jù)。
預(yù)降采樣數(shù)據(jù)和原始數(shù)據(jù)存儲在同一張表中,預(yù)降采樣查詢時自動匹配最佳規(guī)則的數(shù)據(jù),規(guī)則不匹配時,自動切換到原始數(shù)據(jù)查詢。
預(yù)降采樣規(guī)則
預(yù)降采樣規(guī)則定義了預(yù)降采樣的時間粒度和數(shù)據(jù)的聚合方式。例如,假設(shè)1分鐘產(chǎn)生一條原始數(shù)據(jù),預(yù)降采樣規(guī)則可以定義按1小時數(shù)據(jù)的平均值進(jìn)行預(yù)降采樣。預(yù)降采樣規(guī)則分為數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則和表級別預(yù)降采樣規(guī)則,它們都可以實(shí)現(xiàn)預(yù)降采樣,但有部分區(qū)別,具體請參見下圖。
創(chuàng)建預(yù)降采樣規(guī)則
預(yù)降采樣規(guī)則對于之前已經(jīng)寫入的數(shù)據(jù)不生效。
創(chuàng)建表級別的預(yù)降采樣規(guī)則(SQL方式)
示例
設(shè)置預(yù)降采樣精度為1小時,并對預(yù)降采樣周期執(zhí)行sum和max預(yù)計算。
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `max`) ON sensor;
設(shè)置預(yù)降采樣的數(shù)據(jù)有效期(TTL)為90天。
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `max`) TTL `90d` ON sensor;
語法參考
創(chuàng)建數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則(API方式)
請求路徑和方法
請求路徑 | 請求方法 | 描述 |
/api/database |
| 為指定數(shù)據(jù)庫創(chuàng)建預(yù)降采樣規(guī)則。 如果數(shù)據(jù)庫已經(jīng)存在(例如默認(rèn)數(shù)據(jù)庫default),請使用PUT方法來更新預(yù)降采樣規(guī)則。 如果想在創(chuàng)建數(shù)據(jù)庫時,同時創(chuàng)建預(yù)降采樣規(guī)則,請使用POST方法。 |
請求參數(shù)
名稱 | 是否必需 | 描述 |
name | 是 | 數(shù)據(jù)庫名稱。 例如:default。 |
downsampleRules | 是 | 預(yù)降采樣規(guī)則列表,格式為JSON。每次更新規(guī)則時為全量更新。 |
預(yù)降采樣規(guī)則參數(shù)
名稱 | 是否必需 | 描述 | 舉例 |
aggregator | 是 | 聚合函數(shù)。 取值:sum、count、max、min、first、last、median。 關(guān)于聚合函數(shù)的詳情,請參見CREATE PREDOWNSAMPLE。 重要
| "aggregator": "sum" |
intervals | 是 | 預(yù)降采樣的時間粒度列表,聚合時間窗口列表。支持的單位:s代表秒,m代表分鐘,h代表小時,d代表天。 | "intervals": [ "10m","1h" ],表示按10分鐘和1小時分別進(jìn)行預(yù)降采樣。 |
請求示例
PUT /api/database
{
"name": "default",
"downsampleRules": {
"rules": [
{
"aggregator": "sum",
"intervals": [
"1m",
"1h"
]
},
{
"aggregator": "max",
"intervals": [
"1m",
"1h"
]
}
]
}
}
響應(yīng)說明
響應(yīng)狀態(tài)碼為200。
查詢預(yù)降采樣規(guī)則
數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則和表級別的預(yù)降采樣規(guī)則的查詢方法不同。數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則需要通過API查詢,表級別的預(yù)降采樣規(guī)則需要通過SQL查詢。
查詢表級別的預(yù)降采樣規(guī)則(SQL方式)
示例
查詢數(shù)據(jù)庫所有的預(yù)降采樣規(guī)則。
SHOW PREDOWNSAMPLES;
查詢指定數(shù)據(jù)表sensor的預(yù)降采樣規(guī)則。
SHOW PREDOWNSAMPLES ON sensor;
語法參考
查詢數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則(API方式)
請求路徑和方法
請求路徑 | 請求方法 | 描述 |
/api/database | GET | 查詢已經(jīng)創(chuàng)建的預(yù)降采樣規(guī)則。 |
返回示例
[{
"name": "default",
"downsampleRules": {
"rules": [
{
"aggregator": "sum",
"intervals": [
"1m",
"1h"
]
},
{
"aggregator": "max",
"intervals": [
"1m",
"1h"
]
}
]
}
}]
響應(yīng)說明
響應(yīng)狀態(tài)碼為204。
刪除預(yù)降采樣規(guī)則
數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則和表級別的預(yù)降采樣規(guī)則的刪除方法不同。數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則需要通過API刪除,表級別的預(yù)降采樣規(guī)則需要通過SQL刪除。
刪除預(yù)降采樣規(guī)則后,已經(jīng)生效的預(yù)降采樣數(shù)據(jù)不會立即被刪除,但在查詢時不會命中已經(jīng)刪除的預(yù)降采樣數(shù)據(jù)。預(yù)降采樣的數(shù)據(jù)會在數(shù)據(jù)過期后(即超過TTL后)自動刪除。
刪除表級別的預(yù)降采樣規(guī)則(SQL方式)
示例
DROP PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `max`) ON sensor;
語法參考
刪除數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則(API方式)
刪除數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則,請求路徑、請求方法、請求參數(shù)和響應(yīng)說明,與創(chuàng)建數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則相同,區(qū)別為需要將downsampleRules的值置為空。請求路徑等詳細(xì)信息,請參見創(chuàng)建數(shù)據(jù)庫級別的預(yù)降采樣規(guī)則(API方式)。
請求示例
PUT /api/database
{
"name": "default",
"downsampleRules": {
}
}
查詢預(yù)降采樣數(shù)據(jù)
預(yù)降采樣數(shù)據(jù)查詢的匹配原則
當(dāng)同時存在數(shù)據(jù)庫級別規(guī)則和表級別規(guī)則時,預(yù)降采樣查詢數(shù)據(jù)時優(yōu)先匹配表級別規(guī)則。
當(dāng)查詢請求指定的降采樣粒度與預(yù)降采樣數(shù)據(jù)的時間粒度不能精確匹配時,時序引擎會自動查詢最優(yōu)的預(yù)降采樣粒度。推薦設(shè)置預(yù)降采樣時間粒度為1m、10m、1h、1d,可以滿足絕大多數(shù)的降采樣查詢場景。
說明最優(yōu)的預(yù)降采樣粒度是指能夠整除查詢請求的降采樣粒度的最大值。例如,預(yù)降采樣數(shù)據(jù)的時間粒度有1m、5m、8m和15m,查詢請求的降采樣粒度為10m,則最優(yōu)預(yù)降采樣粒度為5m。
當(dāng)沒有滿足條件的預(yù)降采樣時間粒度時,從原始數(shù)據(jù)中進(jìn)行降采樣查詢。
查詢方法
通過SQL或者兼容時間序列數(shù)據(jù)庫TSDB的接口都可以查詢預(yù)降采樣數(shù)據(jù)。推薦使用SQL查詢。如果是已有的openTSDB應(yīng)用或時間序列數(shù)據(jù)庫TSDB應(yīng)用,可以選擇TSDB兼容查詢。
SQL查詢預(yù)降采樣數(shù)據(jù)
默認(rèn)情況下,降采樣查詢數(shù)據(jù)是從原始數(shù)據(jù)中進(jìn)行查詢。如果要從預(yù)降采樣數(shù)據(jù)中查詢數(shù)據(jù)需要在查詢語句中使用Hint(/*+ PREDOWNSAMPLE */)。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature) from sensor
WHERE time >= 1619074800000 AND time <= 1619085600000
SAMPLE BY 1h;
TSDB兼容查詢預(yù)降采樣數(shù)據(jù)
兼容時間序列數(shù)據(jù)庫TSDB的接口支持通過API多值查詢、API單值查詢、SDK查詢?nèi)N方式查詢預(yù)降采樣數(shù)據(jù)。
SDK多值查詢預(yù)降采樣數(shù)據(jù)
查詢降采樣數(shù)據(jù)時,需要在MultiFieldSubQuery Builder設(shè)定downsampleDataSource參數(shù)。
示例
long startTime = 1619074800000L;
long endTime = 1619085600000L;
final String metric = "wind";
final String field = "speed";
MultiFieldSubQueryDetails fieldSubQueryDetails = MultiFieldSubQueryDetails
.field(field)
.aggregator(Aggregator.SUM)
.downsample("1h-sum")
.build();
MultiFieldSubQuery subQuery = MultiFieldSubQuery
.metric(metric)
.fieldsInfo(fieldSubQueryDetails)
// 從預(yù)降采樣查詢
.downsampleDataSource(DownsampleDataSource.DOWNSAMPLE)
.build();
MultiFieldQuery query = MultiFieldQuery.
start(startTime).
end(endTime).
sub(subQuery).
build();
List<MultiFieldQueryResult> result = tsdb.multiFieldQuery(query);
參數(shù)說明
DownsampleDataSource 參數(shù)的取值說明:
DOWNSAMPLE:預(yù)降采樣數(shù)據(jù)查詢。
RAW:原始數(shù)據(jù)查詢。如果參數(shù)沒有被指定,默認(rèn)為RAW。
SDK多值的更多內(nèi)容,請參見SDK多值讀取。
API多值查詢預(yù)降采樣數(shù)據(jù)
使用API進(jìn)行多值查詢時,添加downsampleSource參數(shù)并定義參數(shù)為downsample,即可查詢預(yù)降采樣數(shù)據(jù)。具體操作,請參見多值數(shù)據(jù)查詢。
請求路徑和方法
請求路徑 | 請求方法 | 描述 |
/api/mquery | GET | 查詢預(yù)降采樣數(shù)據(jù)。 |
請求參數(shù)
名稱 | 是否必須 | 描述 | 示例 |
downsampleSource | 否 | 指定查詢數(shù)據(jù)源。取值:
| downsample |
請求示例
POST /api/mquery
{
"start": 1346846400000,
"end": 1346846402000,
"queries": [
{
"downsampleDataSource" : "downsample",
"metric": "wind",
"fields" : [
{
"field" : "speed",
"aggregator" : "none",
"downsample" : "1h-sum"
}
],
"tags":{
"sensor":"IOTE_8859_0002"
}
}
]
}
預(yù)降采樣的最佳配置
秒級采樣頻率場景
對于秒級采樣頻率的場景,推薦配置1m、1h、1d粒度的預(yù)降采樣規(guī)則來滿足任意分鐘、任意小時、任意天級別的降采樣查詢需求。
預(yù)降采樣規(guī)則的示例
配置sum、count、min、max4種常用聚合函數(shù)在1m、1h、1d粒度的預(yù)降采樣規(guī)則。
CREATE PREDOWNSAMPLE `1m` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
CREATE PREDOWNSAMPLE `1d` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
預(yù)降采樣查詢的示例
基于分鐘粒度的預(yù)降采樣規(guī)則,滿足任意分鐘級別的降采樣查詢。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619085600000 SAMPLE BY <N>m;
基于小時粒度的預(yù)降采樣規(guī)則,滿足任意小時級別的降采樣查詢。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619085600000 SAMPLE BY <N>h;
基于天粒度的預(yù)降采樣規(guī)則,滿足任意天級別的降采樣查詢。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619600400000 SAMPLE BY <N>d;
分鐘級采樣頻率場景
對于分鐘級采樣頻率的場景,推薦配置1h、1d粒度的預(yù)降采樣規(guī)則來滿足任意小時、任意天級別的降采樣查詢需求。
預(yù)降采樣規(guī)則的示例
配置sum、count、min、max4種常用聚合函數(shù)在1h、1d粒度的預(yù)降采樣規(guī)則。
CREATE PREDOWNSAMPLE `1h` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
CREATE PREDOWNSAMPLE `1d` AGGREGATORS (`sum`, `count`, `min`, `max`) ON sensor;
預(yù)降采樣查詢的示例
基于小時粒度的預(yù)降采樣規(guī)則,滿足任意小時級別的降采樣查詢。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619085600000 SAMPLE BY <N>h;
基于天粒度的預(yù)降采樣規(guī)則,滿足任意天級別的降采樣查詢。
SELECT /*+ PREDOWNSAMPLE */ sum(temperature), max(temperature) FROM sensor WHERE time >= 1619074800000 AND time <= 1619600400000 SAMPLE BY <N>d;