1 物聯(lián)網(wǎng)應(yīng)用場(chǎng)景簡(jiǎn)介
物聯(lián)網(wǎng)(Internet of Things,簡(jiǎn)稱 IoT)是指通過(guò)各種信息傳感、通信和 IT 技術(shù)來(lái)實(shí)時(shí)連接、采集、監(jiān)管海量的傳感設(shè)備,從而實(shí)現(xiàn)對(duì)現(xiàn)實(shí)世界的精確感知和快速響應(yīng),繼而實(shí)現(xiàn)自動(dòng)化、智能化管理。在查詢 IoT 設(shè)備狀態(tài)的場(chǎng)景下,吞吐量和時(shí)延是兩個(gè)重要的性能指標(biāo)。
在工業(yè)物聯(lián)網(wǎng)中,常見(jiàn)有以下幾種設(shè)備時(shí)序數(shù)據(jù)的查詢需求:
- 案例1:查詢某個(gè)設(shè)備最近的記錄
- 案例2:查詢某個(gè)租戶所有設(shè)備的最近一條記錄
- 案例3:查詢某個(gè)設(shè)備最近5分鐘的統(tǒng)計(jì)信息
- 案例4:查詢某個(gè)設(shè)備最近一天的秒級(jí)數(shù)據(jù)
本教程通過(guò)一個(gè)工業(yè)物聯(lián)網(wǎng)的案例,來(lái)演示 DolphinDB 的序列查詢性能,并對(duì)比測(cè)試了 DolphinDB TSDB 引擎、OLAP 引擎,以及 ClickHouse MergeTree 引擎在上述查詢案例上的時(shí)延指標(biāo)??傮w來(lái)說(shuō),DolphinDB TSDB 引擎的性能(時(shí)延)對(duì)比 DolphinDB OLAP 引擎和 ClickHouse MergeTree 引擎有顯著優(yōu)勢(shì)。
2 案例數(shù)據(jù)準(zhǔn)備
2.1 數(shù)據(jù)集說(shuō)明
本教程參考了某工業(yè)物聯(lián)網(wǎng) SaaS 平臺(tái)服務(wù)商的數(shù)據(jù)集,模擬并使用一份高度仿真的數(shù)據(jù)。該SaaS服務(wù)商的主要業(yè)務(wù)是監(jiān)控各個(gè)地區(qū)的噪聲情況。表結(jié)構(gòu)如下:
序號(hào) | 字段名稱 | 字段類型 | 注釋 |
---|---|---|---|
1 | tenantId | INT | 租戶ID |
2 | deviceId | INT | 設(shè)備ID |
3 | soundPressureLevel | DOUBLE | 聲音分貝 |
4 | soundPowerLevel | DOUBLE | 聲音功率值 |
5 | ts | TIMESTAMP | 數(shù)據(jù)采集時(shí)間戳 |
6 | date | DATE | 日期 |
一行數(shù)據(jù)包含租戶 ID、設(shè)備 ID、聲壓、噪聲功率、采集時(shí)間戳和日期共計(jì) 6 列數(shù)據(jù)。每行記錄占用 36 字節(jié)。該案例數(shù)據(jù)包含100 個(gè)租戶,每個(gè)租戶管理 100 個(gè)噪聲監(jiān)控設(shè)備,記錄了從 2022-01-01 至 2022-01-12,12億的噪聲數(shù)據(jù),共計(jì) 40G。
2.2 庫(kù)表設(shè)計(jì)及數(shù)據(jù)模擬
使用 DolphinDB TSDB 引擎,創(chuàng)建一個(gè)名為 NoiseDB 的數(shù)據(jù)庫(kù),存儲(chǔ)噪聲數(shù)據(jù)。TSDB 引擎是 DolphinDB 自 2.00 版本起,專門(mén)為物聯(lián)網(wǎng)場(chǎng)景設(shè)計(jì)研發(fā)的數(shù)據(jù)存儲(chǔ)引擎,具備優(yōu)秀的寫(xiě)入和序列查詢性能。
在噪聲監(jiān)控的 SaaS 服務(wù)中,較為頻繁的查詢場(chǎng)景是以租戶為維度,查詢某一天某個(gè)設(shè)備的狀態(tài)信息。因此設(shè)計(jì) noise 表按日期、租戶 ID 進(jìn)行分區(qū),可以有效利用分區(qū)剪枝。同時(shí)使用區(qū)分度較高的設(shè)備 ID 和數(shù)據(jù)采集時(shí)間戳作為排序鍵(查詢索引),使查詢時(shí)能夠快速定位對(duì)應(yīng)設(shè)備的數(shù)據(jù),提升查詢性能。具體實(shí)現(xiàn)腳本如下。
db1 = database(,VALUE,1000..2000)
db2 = database(, VALUE, 2022.01.01..2022.12.30)
// TSDB for iot
dbNoise = database("dfs://NoiseDB",COMPO,[db1,db2], engine="TSDB")
create table "dfs://NoiseDB"."noise"(
tenantId INT,
deviceId INT,
soundPressureLevel INT,
soundPowerLevel DOUBLE,
ts TIMESTAMP,
date DATE
)
partitioned by tenantId, date
sortColumns=[`deviceId,`ts]
庫(kù)表創(chuàng)建完成后,模擬 2022-01-01 至 2022-01-12 的數(shù)據(jù),具體代碼詳見(jiàn)附錄?DolphinDB 腳本。
可以通過(guò) SQL 查詢驗(yàn)證下數(shù)據(jù)集大?。?/p>
select count(*) from loadTable(database("dfs://NoiseDB"),"noise") where date between 2022.01.01:2022.01.102> 1260010000
導(dǎo)入完成后,每個(gè)分區(qū)下生成3個(gè)level 0 file,未滿足自動(dòng)合并條件(大于等于10個(gè) levelFile),需要進(jìn)行手動(dòng)合并。
chunkIds = exec chunkId from getChunksMeta() where type=1
for (x in chunkIds) {
triggerTSDBCompaction(x)
}
完成后將案例數(shù)據(jù)導(dǎo)出數(shù)據(jù)至 csv 文件,以便后續(xù)導(dǎo)入 OLAP 引擎、ClickHouse。在 ClickHouse 中使用OPTIMIZE TABLE noise
?合并下 mergeTree。具體過(guò)程參照附錄 ClickHouse 腳本。
3 SQL 查詢
在 DolphinDB 中,可以使用 SQL 快速實(shí)現(xiàn)4個(gè)設(shè)備狀態(tài)查詢需求,并且代碼十分簡(jiǎn)潔。
- 案例1:查詢某個(gè)設(shè)備最近的100條記錄:
noise = loadTable(database("dfs://NoiseDB"),"noise")
select * from noise
where date=2022.01.01 and tenantId=1055 and deviceId=10067
order by ts desc
limit 100
# timer(10) select ...
Time elapsed: 24.33 ms
腳本的 where 條件語(yǔ)句中指定了分區(qū)列 date 和 tenantId 進(jìn)行過(guò)濾,便于 DolphinDB 系統(tǒng)通過(guò)分區(qū)剪枝快讀定位到對(duì)應(yīng)的分區(qū)。同時(shí)指定了數(shù)據(jù)庫(kù)的 sort key (deviceId) 作為過(guò)濾字段,利用 TSDB 的索引機(jī)制,可以快速定位到數(shù)據(jù)塊,并按時(shí)間順序取回最新的100條記錄。平均一次查詢耗時(shí)?2ms,未命中緩存的首次查詢耗時(shí)?14ms。
- 案例2:查詢某個(gè)租戶所有設(shè)備最新?tīng)顟B(tài)
noise = loadTable(database("dfs://NoiseDB"),"noise")
select * from noise
where date=2022.01.01 and tenantId=1055
context by deviceId
csort ts desc
limit 1
# timer(10) select ...
Time elapsed: 246.619 ms
該腳本在 where 條件語(yǔ)句中同樣指定了分區(qū)列以快速定位到對(duì)應(yīng)的數(shù)據(jù)分區(qū)。通過(guò) context by 子句來(lái)根據(jù)設(shè)備 ID 將數(shù)據(jù)進(jìn)行分組,每組數(shù)據(jù)通過(guò) csort 子句按時(shí)間倒序排列(考慮到物聯(lián)網(wǎng)存在消息亂序的情況,必須使用csort將數(shù)據(jù)按采集時(shí)間排序)。使用 limit 1 獲取每個(gè)窗口內(nèi)的最新的一條記錄,從而獲取該租戶當(dāng)日所有設(shè)備的最新?tīng)顟B(tài)。平均一次查詢耗時(shí)?25ms,首次查詢耗時(shí)?121ms。
- 案例3:查詢某個(gè)設(shè)備5分鐘內(nèi)的噪聲統(tǒng)計(jì)值
noise = loadTable(database("dfs://NoiseDB"),"noise")
select
min(ts) as startTs
,max(ts) as endTs
,max(soundPressureLevel)
,avg(soundPressureLevel)
,max(soundPowerLevel)
,avg(soundPowerLevel)
from noise
where date=2022.01.01 and tenantId=1055 and deviceId=10067 and ts between 2022.01.01T00:50:15.518:2022.01.01T00:55:15.518
group by tenantId, deviceId
# timer(10) select ...
Time elapsed: 22.168 ms
該腳本首先根據(jù) where 指定的過(guò)濾條件定位并掃描數(shù)據(jù)塊,取出對(duì)應(yīng)時(shí)間段的數(shù)據(jù),并按 tenantId, deviceId 進(jìn)行聚合計(jì)算,以獲取聲音分貝、功率的統(tǒng)計(jì)值。平均一次查詢耗時(shí)?2ms,首次查詢耗時(shí)?13ms。
- 案例4:查詢某個(gè)設(shè)備最近一天的明細(xì)數(shù)據(jù)
noise = loadTable(database("dfs://NoiseDB"),"noise")
select *
from noise
where date=2022.01.01 and tenantId=1055 and deviceId=10067
order by ts
# timer(10) select ...
Time elapsed: 23.261 ms
該腳本首先根據(jù) where 指定的過(guò)濾條件定位并掃描數(shù)據(jù)塊,取出對(duì)應(yīng)時(shí)間段的明細(xì)數(shù)據(jù),并按采集時(shí)間排序。平均一次查詢耗時(shí)?2ms,首次查詢耗時(shí)?16ms。
注:首次查詢指未命中數(shù)據(jù)庫(kù)緩存及操作系統(tǒng)緩存的查詢。
4 對(duì)比測(cè)試
進(jìn)一步測(cè)試 DolphinDB TSDB 引擎與 OLAP 引擎,以及 ClickHouse MergeTree 引擎在上述數(shù)據(jù)集的時(shí)序查詢性能。測(cè)試過(guò)程中盡可能地保持環(huán)境變量相同,以保證科學(xué)有效。具體測(cè)試腳本詳見(jiàn)附錄。
4.1 測(cè)試環(huán)境
- 測(cè)試機(jī)器配置
操作系統(tǒng):CentOS 7
CPU: 2 cores
內(nèi)存:10 G
磁盤(pán):SSD
- 核心測(cè)試參數(shù)
對(duì)測(cè)試中影響性能的關(guān)鍵參數(shù),保持對(duì)等一致。
軟件信息 | 核心參數(shù) | 庫(kù)表設(shè)計(jì) |
---|---|---|
DolphinDB:2.00.6 單節(jié)點(diǎn) | memSize=8G TSDB引擎 / OLAP引擎 | partitioned by tenantId, datesortColumns = [deviceId,ts] |
ClickHouse:22.6.1 單節(jié)點(diǎn) | max_server_memory_usage=8GMergeTree引擎 | partition by tenantId, dateorder by deviceId, ts |
測(cè)試時(shí),DolphinDB 和 ClickHouse 均采用單節(jié)點(diǎn),并分配 8G 最大內(nèi)存。在引擎方面,DolphinDB TSDB 引擎,ClickHouse MergeTree 引擎的內(nèi)部實(shí)現(xiàn)都采用了 LSM-tree。并保持庫(kù)表設(shè)計(jì)完全一致。
- 時(shí)間衡量標(biāo)準(zhǔn)
由于端到端的時(shí)間,容易受到網(wǎng)絡(luò)抖動(dòng)和客戶端實(shí)現(xiàn)性能的影響,因此本次測(cè)試的測(cè)量時(shí)間設(shè)定為從查詢引擎接收到請(qǐng)求至計(jì)算出結(jié)果為止。
4.2 測(cè)試結(jié)果
三者的具體測(cè)試結(jié)果為下表,表中數(shù)值為平均耗時(shí)/首次查詢耗時(shí)(單位 ms),平均耗時(shí)的計(jì)算邏輯為:
平均耗時(shí) = ( 首次耗時(shí) + 9次緩存命中耗時(shí) )/ 10
測(cè)試用例 | 場(chǎng)景 | DolphinDB TSDB | DolphinDB OLAP | ClickHouse |
---|---|---|---|---|
case1 | 查詢某個(gè)設(shè)備最新100 條記錄 | 2 / 14 | 34 / 51 | 14 / 150 |
case2 | 查詢某個(gè)租戶所有設(shè)備的最新?tīng)顟B(tài) | 25 /121 | 62 / 170 | 73 / 400 |
case3 | 查詢某個(gè)設(shè)備 5min的噪聲統(tǒng)計(jì)值 | 2 / 13 | 15 / 136 | 12 / 82 |
case4 | 查詢某個(gè)設(shè)備最近一天的明細(xì)數(shù)據(jù) | 2 / 16 | 24 / 220 | 22 / 200 |
可以看出,OLAP 引擎和 ClickHouse 在不同的查詢場(chǎng)景下性能各有其優(yōu)勢(shì)和劣勢(shì)。
而 TSDB 引擎性能均優(yōu)于 ClickHouse,在相對(duì)復(fù)雜的點(diǎn)查場(chǎng)景性能差距更大。在場(chǎng)景4下 ,DolphinDB TSDB 引擎比 ClickHouse 的性能高 12.5 倍,首次查詢高13倍。在該場(chǎng)景中,TSDB 引擎需要讀取對(duì)應(yīng)設(shè)備的10000條記錄,壓縮后的存儲(chǔ)大小約為90K。存儲(chǔ)在6個(gè)連續(xù)的Block中,讀取效率非常高效。而 ClickHouse 則是 scan 了該分區(qū)下1000000條記錄的數(shù)據(jù)塊,因此兩者的首次查詢性能差距較大,而緩存后的性能差距主要取決于兩者在計(jì)算性能上的差別 。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-723383.html
5 總結(jié)
DolphinDB TSDB 引擎在物聯(lián)網(wǎng)場(chǎng)景有著卓越的點(diǎn)查性能,可以以毫秒級(jí)延時(shí)迅速響應(yīng)設(shè)備的狀態(tài)信息,其性能更優(yōu)于 ClickHouse 的 MergeTree 引擎。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-723383.html
6 附錄
- DolphinDB 腳本
- ClickHouse 腳本
到了這里,關(guān)于性能超越 Clickhouse | 物聯(lián)網(wǎng)場(chǎng)景中的毫秒級(jí)查詢案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!