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

这篇具有很好参考价值的文章主要介绍了性能超越 Clickhouse | 物联网场景中的毫秒级查询案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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服务商的主要业务是监控各个地区的噪声情况。表结构如下:

序号 字段名称 字段类型 注释
1 tenantId INT 租户ID
2 deviceId INT 设备ID
3 soundPressureLevel DOUBLE 声音分贝
4 soundPowerLevel DOUBLE 声音功率值
5 ts TIMESTAMP 数据采集时间戳
6 date DATE 日期

一行数据包含租户 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。并保持库表设计完全一致。

  • 时间衡量标准

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

性能超越 Clickhouse | 物联网场景中的毫秒级查询案例,clickhouse,物联网,时序数据库,iot,database,数据分析,数据库

4.2 测试结果

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

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

测试用例 场景 DolphinDB TSDB DolphinDB OLAP ClickHouse
case1 查询某个设备最新100 条记录 2 / 14 34 / 51 14 / 150
case2 查询某个租户所有设备的最新状态 25 /121 62 / 170 73 / 400
case3 查询某个设备 5min的噪声统计值 2 / 13 15 / 136 12 / 82
case4 查询某个设备最近一天的明细数据 2 / 16 24 / 220 22 / 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 引擎。文章来源地址https://www.toymoban.com/news/detail-723383.html

6 附录

  • DolphinDB 脚本
  • ClickHouse 脚本

到了这里,关于性能超越 Clickhouse | 物联网场景中的毫秒级查询案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据场景下clickhouse查询时长优化sop

    ClickHouse的优化需要结合实际的数据特点和查询场景,从多个方面进行综合优化,以提高系统的性能和可靠性。 数据模型设计 :在使用ClickHouse之前,需要充分考虑数据模型的设计,因为数据模型的设计对查询性能有很大的影响。通常来说,ClickHouse适合存储大量的、高维度的

    2024年02月16日
    浏览(39)
  • 优化索引粒度参数提升ClickHouse查询性能

    当对高基数列进行过滤查询时,总是希望尽可能跳过更多的行。否则需要处理更多数据、需要更多资源。ClickHouse缺省在MergeTree表读取8192行数据块,但我们可以在创建表时调整该 index_granularity 参数。本文通过示例说明如何调整该参数优化查询性能。 下面示例,创建表并插入

    2024年02月11日
    浏览(45)
  • 从 Clickhouse 到 Apache Doris:有赞业务场景下性能测试与迁移验证

    本文导读: 当前,电商运营的主要痛点不仅来自多变的市场和客户需求,也受困于碎片化用户触达等带来的竞争与挑战。为了深度挖掘用户价值、培养用户忠诚度、实现业绩增长,有赞为商家搭建了全方位 OLAP 分析系统,提供实时与离线分析报表、智能营销与人群圈选等 S

    2024年02月09日
    浏览(51)
  • ClickHouse为何能超越Elasticsearch?

    Elasticsearch是一个强大的分布式全文检索和数据分析引擎,也是日志分析系统经常使用的一种实现方案,但近年来随着ClickHouse的发展,Elasticsearch在日志分析领域的地位逐渐被取代,许多公司已经将自己的日志分析解决方案从ES迁移到了ClickHouse,比如阿里、bilibili、快手等公司

    2024年02月05日
    浏览(34)
  • 物联网场景中的边缘计算解决方案有哪些?

    在物联网场景中,边缘计算是一种重要的解决方案,用于在物联网设备和云端之间进行实时数据处理、分析和决策。HiWoo Box作为工业边缘网关设备,具备边缘计算能力,包括单点公式计算、Python脚本编程以及规则引擎,它为物联网场景中的边缘计算提供了多种解决方案。 物联

    2024年02月15日
    浏览(51)
  • MySQL 中的 SQL 查询性能调优

            通过 MySQL 中的索引加速 SQL 查询。安装、分析查询并使用存储过程以获得最佳结果。         在本文中,我们将了解索引表列如何帮助提高 SQL 查询的快速响应时间。我们将介绍安装 MySQL、创建存储过程、分析查询以及了解索引的影响的步骤。         我在

    2024年02月12日
    浏览(44)
  • Elasticsearch如何做到数十亿数据查询毫秒级响应?

    如果面试的时候碰到这样一个面试题:ES 在数据量很大的情况下(数十亿级别)如何提高查询效率? 这个问题说白了,就是看你有没有实际用过 ES,因为啥?其实 ES 性能并没有你想象中那么好的。 很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑

    2024年02月03日
    浏览(38)
  • <Java物联网> 从主动到被动:Java中的BACnet设备属性查询

    目录 BACnet 使用软件 资源 模拟器 使用Java主动查  引入maven 创建网络对象 获取远程设备 获取设备属性 使用DeviceEventAdapter订阅 初始化本地BACnet设备和IP网络配置: 启动本地设备和添加监听器: 搜寻远程设备: 发送订阅COV报文: 修改值并等待: SubscribeDevice监听器: BACnet(

    2024年02月15日
    浏览(38)
  • EMQ X与RabbitMQ:MQTT消息服务器在物联网中的性能对比

    在物联网中,消息传递是实现设备之间通信的关键。MQTT(Message Queuing Telemetry Transport)作为一种轻量级的消息传递协议,被广泛应用于物联网领域。EMQ X和RabbitMQ是两个常见的MQTT消息服务器,它们在性能方面有所差异。本文将对它们进行性能对比,并提供相应的源代码。 EMQ

    2024年04月16日
    浏览(41)
  • ClickHouse(一):ClickHouse介绍及OLAP场景特征

    目录 1. ClickHouse与其特性 ​​​​​​​2. 什么是ClickHouse ​​​​​​​3. OLAP场景的特征 进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 在大数据处理场景中,流处理和批处理使用到的技术大致如下: 批处理会将源业务系统

    2024年02月14日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包