性能超越 Clickhouse | 物联网场景中的毫秒级查询案例

news2024/11/26 10:44:51

1 物联网应用场景简介

物联网(Internet of Things,简称 IoT)是指通过各种信息传感、通信和 IT 技术来实时连接、采集、监管海量的传感设备,从而实现对现实世界的精确感知和快速响应,继而实现自动化、智能化管理。在查询 IoT 设备状态的场景下,吞吐量和时延是两个重要的性能指标。

在工业物联网中,常见有以下几种设备时序数据的查询需求:

  • 案例1:查询某个设备最近的记录
  • 案例2:查询某个租户所有设备的最近一条记录
  • 案例3:查询某个设备最近5分钟的统计信息
  • 案例4:查询某个设备最近一天的秒级数据

本教程通过一个工业物联网的案例,来演示 DolphinDB 的序列查询性能,并对比测试了 DolphinDB TSDB 引擎、OLAP 引擎,以及 ClickHouse MergeTree 引擎在上述查询案例上的时延指标。总体来说,DolphinDB TSDB 引擎的性能(时延)对比 DolphinDB OLAP 引擎和 ClickHouse MergeTree 引擎有显著优势。

2 案例数据准备

2.1 数据集说明

本教程参考了某工业物联网 SaaS 平台服务商的数据集,模拟并使用一份高度仿真的数据。该SaaS服务商的主要业务是监控各个地区的噪声情况。表结构如下:

序号字段名称字段类型注释
1tenantIdINT租户ID
2deviceIdINT设备ID
3soundPressureLevelDOUBLE声音分贝
4soundPowerLevelDOUBLE声音功率值
5tsTIMESTAMP数据采集时间戳
6dateDATE日期

一行数据包含租户 ID、设备 ID、声压、噪声功率、采集时间戳和日期共计 6 列数据。每行记录占用 36 字节。该案例数据包含100 个租户,每个租户管理 100 个噪声监控设备,记录了从 2022-01-01 至 2022-01-12,12亿的噪声数据,共计 40G。

2.2 库表设计及数据模拟

使用 DolphinDB TSDB 引擎,创建一个名为 NoiseDB 的数据库,存储噪声数据。TSDB 引擎是 DolphinDB 自 2.00 版本起,专门为物联网场景设计研发的数据存储引擎,具备优秀的写入和序列查询性能。

在噪声监控的 SaaS 服务中,较为频繁的查询场景是以租户为维度,查询某一天某个设备的状态信息。因此设计 noise 表按日期、租户 ID 进行分区,可以有效利用分区剪枝。同时使用区分度较高的设备 ID 和数据采集时间戳作为排序键(查询索引),使查询时能够快速定位对应设备的数据,提升查询性能。具体实现脚本如下。

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]

库表创建完成后,模拟 2022-01-01 至 2022-01-12 的数据,具体代码详见附录 DolphinDB 脚本。

可以通过 SQL 查询验证下数据集大小:

select count(*) from  loadTable(database("dfs://NoiseDB"),"noise") where date between 2022.01.01:2022.01.102> 1260010000

导入完成后,每个分区下生成3个level 0 file,未满足自动合并条件(大于等于10个 levelFile),需要进行手动合并。

chunkIds = exec chunkId from getChunksMeta() where type=1
for (x in chunkIds) {
  triggerTSDBCompaction(x)
}

完成后将案例数据导出数据至 csv 文件,以便后续导入 OLAP 引擎、ClickHouse。在 ClickHouse 中使用OPTIMIZE TABLE noise 合并下 mergeTree。具体过程参照附录 ClickHouse 脚本。

3 SQL 查询

在 DolphinDB 中,可以使用 SQL 快速实现4个设备状态查询需求,并且代码十分简洁。

  • 案例1:查询某个设备最近的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 条件语句中指定了分区列 date 和 tenantId 进行过滤,便于 DolphinDB 系统通过分区剪枝快读定位到对应的分区。同时指定了数据库的 sort key (deviceId) 作为过滤字段,利用 TSDB 的索引机制,可以快速定位到数据块,并按时间顺序取回最新的100条记录。平均一次查询耗时 2ms,未命中缓存的首次查询耗时 14ms

  • 案例2:查询某个租户所有设备最新状态
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 条件语句中同样指定了分区列以快速定位到对应的数据分区。通过 context by 子句来根据设备 ID 将数据进行分组,每组数据通过 csort 子句按时间倒序排列(考虑到物联网存在消息乱序的情况,必须使用csort将数据按采集时间排序)。使用 limit 1 获取每个窗口内的最新的一条记录,从而获取该租户当日所有设备的最新状态。平均一次查询耗时 25ms,首次查询耗时 121ms

  • 案例3:查询某个设备5分钟内的噪声统计值
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

该脚本首先根据 where 指定的过滤条件定位并扫描数据块,取出对应时间段的数据,并按 tenantId, deviceId 进行聚合计算,以获取声音分贝、功率的统计值。平均一次查询耗时 2ms,首次查询耗时 13ms

  • 案例4:查询某个设备最近一天的明细数据
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

该脚本首先根据 where 指定的过滤条件定位并扫描数据块,取出对应时间段的明细数据,并按采集时间排序。平均一次查询耗时 2ms,首次查询耗时 16ms

:首次查询指未命中数据库缓存及操作系统缓存的查询。

4 对比测试

进一步测试 DolphinDB TSDB 引擎与 OLAP 引擎,以及 ClickHouse MergeTree 引擎在上述数据集的时序查询性能。测试过程中尽可能地保持环境变量相同,以保证科学有效。具体测试脚本详见附录。

4.1 测试环境

  • 测试机器配置

操作系统:CentOS 7

CPU: 2 cores

内存:10 G

磁盘:SSD

  • 核心测试参数

对测试中影响性能的关键参数,保持对等一致。

软件信息核心参数库表设计
DolphinDB:2.00.6 单节点memSize=8G TSDB引擎 / OLAP引擎partitioned by tenantId, datesortColumns = [deviceId,ts]
ClickHouse:22.6.1 单节点max_server_memory_usage=8GMergeTree引擎partition by tenantId, dateorder by deviceId, ts

测试时,DolphinDB 和 ClickHouse 均采用单节点,并分配 8G 最大内存。在引擎方面,DolphinDB TSDB 引擎,ClickHouse MergeTree 引擎的内部实现都采用了 LSM-tree。并保持库表设计完全一致。

  • 时间衡量标准

由于端到端的时间,容易受到网络抖动和客户端实现性能的影响,因此本次测试的测量时间设定为从查询引擎接收到请求至计算出结果为止。

4.2 测试结果

三者的具体测试结果为下表,表中数值为平均耗时/首次查询耗时(单位 ms),平均耗时的计算逻辑为:

平均耗时 = ( 首次耗时 + 9次缓存命中耗时 )/ 10

测试用例场景DolphinDB TSDBDolphinDB OLAPClickHouse
case1查询某个设备最新100 条记录2 / 1434 / 5114 / 150
case2查询某个租户所有设备的最新状态25 /12162 / 17073 / 400
case3查询某个设备 5min的噪声统计值2 / 1315 / 13612 / 82
case4查询某个设备最近一天的明细数据2 / 1624 / 22022 / 200

可以看出,OLAP 引擎和 ClickHouse 在不同的查询场景下性能各有其优势和劣势。

而 TSDB 引擎性能均优于 ClickHouse,在相对复杂的点查场景性能差距更大。在场景4下 ,DolphinDB TSDB 引擎比 ClickHouse 的性能高 12.5 倍,首次查询高13倍。在该场景中,TSDB 引擎需要读取对应设备的10000条记录,压缩后的存储大小约为90K。存储在6个连续的Block中,读取效率非常高效。而 ClickHouse 则是 scan 了该分区下1000000条记录的数据块,因此两者的首次查询性能差距较大,而缓存后的性能差距主要取决于两者在计算性能上的差别 。

5 总结

DolphinDB TSDB 引擎在物联网场景有着卓越的点查性能,可以以毫秒级延时迅速响应设备的状态信息,其性能更优于 ClickHouse 的 MergeTree 引擎。

6 附录

  • DolphinDB 脚本
  • ClickHouse 脚本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1097314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DITA-OT 4.0新特性 - PDF themes,定制PDF样式的新方法

随着DITA-OT 4.0的发布,它提供了一种新的定制PDF样式方法,这种方法就是PDF theme。这篇文章来聊一聊这种定制PDF输出的新方法和实验结果。 在进入PDF theme细节之前,为各位读者梳理一下DITA-OT将DITA和Markdown发布成PDF的几种方法。 - 1 …

『Linux升级路』基本指令

🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、认识操作系统 📒1.1什么是操作系统 📒1.2操作系统…

Day15|104.二叉树的最大深度

一、104.二叉树的最大深度 题目链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree/ 文章链接:https://programmercarl.com/0104.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%A4%A7%E6%B7%B1%E5%BA%A6.html#%E7%9B%B8%E5%85%B3%E9%…

Bootstrap的徽章样式设计,徽章常用作作为显示未读内容或动态计数内容

Bootstrap的徽章样式&#xff0c;通过添加类badge来实现。 目录 01-往标题中添加徽章02-给按钮、链接添加徽章03-设置徽章的颜色04-设置胶囊形徽章 01-往标题中添加徽章 通常在<span>标签添加类badge实现。 示例代码如下&#xff1a; <!DOCTYPE html> <html&g…

二维码智慧门牌管理系统:解决公安标准地址与实际楼栋名称的差异

文章目录 前言一、二维码智慧门牌管理系统的核心功能二、广泛应用领域 前言 在当今信息化社会&#xff0c;精准的地标信息是日常生活中不可或缺的部分。特别是在小区管理中&#xff0c;精准的楼栋名称和地址信息显得尤为重要。但实际上&#xff0c;公安标准地址与实际楼栋名称…

JVM 垃圾回收算法详解

目录 1 垃圾回收算法1.1 标记清除算法1.2 复制算法1.3 标记整理算法1.4 分代回收算法1.4.1 对象进入老年代的条件 1 垃圾回收算法 有四种垃圾回收算法&#xff1a; 标记清除算法复制算法标记整理算法分代回收算法 1.1 标记清除算法 标记&#xff1a;遍历内存区域&#xff0…

AlexNet论文阅读

开始之前的简介:这篇论文是王林蓉师姐推荐给我看的第一篇入门级别的cv领域的论文,也算是我入手研究生阶段的第一篇论文.我是打算先看看这一领域的论文,然后写的自己一点随笔.若有错误欢迎指正. 一. 专有词汇 非饱和神经元 dropout 饱和非线性,非饱和非线性 二. 论文结构 三. 核…

10G SDH传输分析仪该如何选择

TFN D450S 传输分析仪 功能全面 使用方便 是 通信人的不二选择

深入了解企业税收违法信息API:实现智能风险评估

引言 企业税收违法是一项严重的经济犯罪&#xff0c;可能导致严重的法律后果和金融损失。为了帮助企业和金融机构识别并预防潜在的税收违法行为&#xff0c;智能风险评估变得至关重要。在这一领域&#xff0c;企业税收违法信息API发挥着重要的作用&#xff0c;提供了关键的数据…

一图读懂「五度情报站」全盘视野,情报智取,先知先行,决策有道!

「五度情报站」是一款集企业情报监测、管理、分析等多功能于一体微信小程序&#xff0c;其依托全体量产业大数据及强大的数据治理能力&#xff0c;收录了商业、市场、竞争、企业、技术、金融等全类别情报信息&#xff0c;构建了面向用户的业务型标签体系&#xff0c;设计了实用…

PyTorch深度学习实战(21)——从零开始实现Faster R-CNN目标检测

PyTorch深度学习实战&#xff08;21&#xff09;——从零开始实现Faster R-CNN目标检测 0. 前言1. Fast R-CNN 目标检测模型组成1.1 锚框1.2 区域提议网络1.3 分类和回归 2. 实现 R-CNN 目标检测2.1 数据处理2.2 模型构建2.3 模型训练与测试 小结系列链接 0. 前言 Faster R-CN…

手机抬手亮屏解锁,用到了哪些硬件?

随着时代发展&#xff0c;智能手机以丰富的功能及便利性&#xff0c;成为了人们必不可少的物品&#xff0c;其中人脸解锁功能是非常有用的功能&#xff0c;广受年轻人的喜爱&#xff0c;那么你知道她是如何实现吗&#xff1f;今天凡小亿带你们探索&#xff01; 手机抬手亮屏解锁…

谨以此篇,纪念我2023年曲折的计算机保研之路

目录 阶段一&#xff1a;迷茫阶段二&#xff1a;准备个人意愿保研材料准备套磁老师5.1日 浙大线上编程测试5.8日 浙大线上面试 —— 一面5.17日 浙大线上面试——二面5.29日 实验室面试结果5.27日 南开线上面试6.20日 华师电话面试 阶段三&#xff1a;旅途北航CS&#xff08;6.…

ebpf的快速开发工具--libbpf-bootstrap

基于ubuntu22.04-深入浅出 eBPF 基于ebpf的性能工具-bpftrace 基于ebpf的性能工具-bpftrace脚本语法 基于ebpf的性能工具-bpftrace实战(内存泄漏) 什么是libbpf-bootstrap libbpf-bootstrap是一个开源项目&#xff0c;旨在帮助开发者快速启动和开发使用eBPF(Extended Berk…

微服务拆分的思考

一、前言 前面几篇文章介绍了微服务核心的两个组件&#xff1a;注册中心和网关&#xff0c;今天我们来思考一下微服务如何拆分&#xff0c;微服务拆分难度在于粒度和层次&#xff0c;粒度太大拆分的意义不大&#xff0c;粒度太小开发、调试、运维会有很多坑。 二、微服务划分…

【初识Linux】:常见指令(2)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

为健康护航的小帮手,dido E55S Pro智能手表体验

现在很多年轻人每天都要长时间工作&#xff0c;没有时间锻炼身体&#xff0c;很容易导致各种健康隐患&#xff0c;工作效率也容易下降&#xff0c;非常有必要通过智能手表等工具&#xff0c;随时监测自己的健康状态。现在支持健康监测的智能手表非常多&#xff0c;用起来也简单…

Java反射使用实例

Java反射&#xff1a;解析类的秘密 Java反射是一项强大的功能&#xff0c;允许开发人员在运行时检查、操作和实例化类、方法、字段以及其他Java程序中的元素。这种能力赋予了Java语言更大的灵活性和动态性&#xff0c;但也需要慎重使用&#xff0c;因为它可能会导致性能问题和…

[Halcon检测] 划痕检测之高斯导数提取

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

带你了解小程序的框架之谜

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《微信小程序 》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;…