使用 Apache IoTDB 构建工业时序数据
管理解决方案的实践
黄向东
清华大学软件学院 助理研究员
Apache member
Apache IoTDB PMC Chair
提纲
• Apache IoTDB 简介
• 怎么接数据
• 怎么存数据(建模、接口)
• 怎么用数据
• 基于 IoTDB 的工业解决方案
物联网中的时序数据
101606001风机的
风速数据序列
风速
时间
草帽风
物联网时序数据是工业设备物理量的数字化记录,在轨道交
通、能源管控、智能制造等领域有广泛应用。
面向工业物联网的高性能轻量级时序数据库
Apache顶级项目官方认证
用户覆盖德国、美国、中国一批工业互联网厂商和智能制造厂商
Apache
IoTDB
n首个入选Apache的工业物联网时序数据库项目
n首个由中国高校开源并运营的Apache顶级项目
2017年3月
在Github公开
2018年11月经投票
进入Apache孵化器
2020年9月经投票
晋升为Apache顶级项目
“清华数为”
IoTDB
2011年
863计划攻关
历练于工业用户、
成长成熟于开源社区
IoTDB:数据模式从后台定义到边缘设备定义
风场 加装感应器
27993 | 时间, 转向角(整型), 发电量……
27993 | 时间,风速,转向角(整型),发电量……
设备号 时间 转向角 发电量
27993 15:58:26 5 35
27993 15:58:44 5 36
27993 | 时间,风速,转向角(浮点型) ,发电量……
协议升级
35236 | 时间,转速,……
接入新型号设
备
新增测点
格式变化
全新模式
设备号 时间 转向角 发电量
27993 15:58:44 5 35
设备号 时间 转向角 发电量 风速
27993 15:58:44 5 35 5.3
设备号 时间 发电量 风速 转向角
27993 15:58:44 35 5.3 5.3
设备号 时间 转速
35236 15:58:44 73
边缘设备快速迭代升级与加速联网 物联网场景下数据库模式演进
数据模式源头在边缘侧 云侧适配边缘侧
定义时序
用户 写入数据 使用数据 开发应用
时序数据库
弱模式/
无模式
IoTDB:从后端处理到前后端协同处理
编码
压缩
解码
解压
重组
数据
存储 数据库
处理系
统
云端
终端
一份数据 两次处理
TsFile: 部署在嵌入式终端设备的
时序“数据文件”
为时序数据而生的zip文件
支持高性能写入,高压缩比
存储,支持简单查询
编码成
TsFile
终端
直接
落盘
分析
应用
云端
一次处理 端云共用
IoTDB:从时序数据查询到时序数据处理
select s1 from root.sg.device1
原始数据查询 时间范围、值过滤
where time > ? and s1>?
时间维度聚合
group by ([?, ?, 1m])
降采样:按需获取多粒度级别数据 时频变换:多维深度分析 序列分割:语义分析
子序列匹配:历史分析
深度挖掘时序数据的内涵价值
数据质量是头等大事
摘要表[2]
min:1
max:4
count:4
min:5
max:8
count:4
min:9
max:10
count:2
摘要
快速构建
灵活聚合
高效查询
时间分区树[3]
FlatFIT [1]
滑动窗口聚合
多级索引
一级索引
快速构建
高效查询
任意窗口
IoTDB:从规则负载到复杂负载
复杂负载
规则负载
设备ID 时间 测点1 测点2 … 测点1000
设备测点少,一张表建模
采集频率低
表202001
表202003
…
采样规则简单
时间 测点1 测点2 测点3
t1 v v v
t2 v v v
…
tn v v v
各测点独立采集,时间不齐
单设备数万测点
超高频采样频率
!乱序写入!
IoTDB:开源生态集成
采集阶段 处理阶段
应用阶段
分析阶段
管理阶段
产品形态:灵活适配“端-边-云”计算环境
终端(端)
部署在嵌入式终端设备的时序
“数据文件”
为时序数据而生的zip文件
支持高性能写入,高压缩比存
储,支持简单查询
场控(边)
部署在工控机等边缘计算设备
的时序“数据库”
高效丰富的时间序列查询引擎
提供增删改查,以及聚合查询
时序对齐等高级功能
数据中心(云)
部署在云端数据中心的
时序“数据仓库”
与大数据分析框架无缝集成
支持时序数据处理,挖掘分析
与机器学习
产品特性:高吞吐、高压缩、低延迟、丰富查询
• 多种服务形式
• 终端
• 本地控制器
• 数据中心
• 灵活部署
• 开箱即用
• 支持数据实时写入/写出
• 支持便捷友好的分析
高效的数据持久化 扩展的时间序列操作
收集
存储
处理
学习
应用
覆盖数据全生命周期 丰富/低延迟的数据查询 与现有生态系统集成
• 高速写入
• 每秒3000万点(单机)
• 高压缩比
• 1.37bits/点 [1]
• 有损和无损压缩
• 支持百万时间序列
• 快速过滤数据
• TB级数据百毫秒
查询
• 聚合查询数据
• 十亿点数十毫秒
查询
• 时序分段
• 时序表达
• 子序列匹配
• 时频转换
• 可视化
• MatLab
• Spark
• MapReduce
• Grafana
• Kafka
用户交互友好:工作台、命令行、可视化
命
令
行
工
作
台
可
视
化
编程接口丰富:文件API与SQL语言
20
文件
API
像使用CSV一样存储和访问数据
SQL
(OLTP)
像使用MySQL一样存储和查询数据
SQL
(OLAP)
使用
AI引擎
分析数据
性能(0.11)
Apache IoTDB 发行历史
• 2017, 0.7 最后一个非Apache发行版
• 2019.08,0.8 第一个Apache 发行版
• 2019.12, 0.9 乱序数据整理
• 2020.06,0.10 查询性能提升
• 2020.12,0.11 全新内存控制
• 2021.4,0.12.0
(InfluxDB的备胎,青海电力能源平台)
(高写入吞吐,长期稳定,上海地铁)
(容忍大量乱序数据,大唐电厂)
(查询性能大幅提升)
(拒绝OOM)
工业时序数据生命周期
应用阶段
感知/预警
查询/检索
转换/度量
决策/预测
工业:KMX
气象:BDIPS
遥感:DATACUBE
采集阶段
企业门户
手机端
传感器
数据中心
高端装备
嵌入式终端
管理阶段
关系
键值数据
时序数据
图数据
非结构化
处理阶段
分析阶段
深度学习
迁移学习
数据画像
异常检测
数据修复
协议处理
时空学习
环保:Data-X
领域大数据平台
能源:KSTONE
!" #$ %$ &' ()
五阶段大数据生命周期
怎
么
接
数
据
怎
么
存
储
数
据
怎
么
使
用
数
据
提纲
• Apache IoTDB 简介
• 怎么接数据
• 怎么存数据(建模、接口)
• 怎么用数据
• 基于 IoTDB 的工业解决方案
物联网场景下,如何接数据到IoTDB
• 我需要Kafka/Pulsar等消息队列吗?
• 我需要MQTT服务器吗?
• 我需要Flink、Storm吗?
• 我是将设备直连数据库进行写入吗?
物联网场景下,如何接数据到IoTDB
• 我需要Kafka/Pulsar等消息队列吗?
• 我需要MQTT服务器吗?
• 我需要Flink、Storm吗?
• 我是将设备直连数据库进行写入吗?
It depends.
物联网场景下,如何接数据到IoTDB
• 我需要Kafka/Pulsar等消息队列吗?
- 数据 7 * 24 ? 还是有波峰?
- 是否有多次消费需求?
- 是否想尽可能解耦?
- 是否在边缘端使用IoTDB?
• 我需要MQTT服务器吗?
- 是否需要非常复杂的转发机制?
- 是否需要互传数据/命令?
IoTDB的MQTT接口
IoTDB 的触发器机制
物联网场景下,如何接数据到IoTDB
• 我需要Flink、Storm吗?
- 是否有解码需求?
- 是否还要多次转发?
IoTDB 的触发器机制
物联网场景下,如何接数据到IoTDB
• 我是设备直连吗?
- 网络安全?
- 工厂?公有云?
提纲
• Apache IoTDB 简介
• 怎么接数据
• 怎么存数据(建模、接口)
• 怎么用数据
• 基于 IoTDB 的工业解决方案
基础模型:一元/多元序列
多元序列
时间 lon lat
数据 数据 数据
一元序列
温度 速度
数据 数据
时间 值 值
时间 值 时间 值
灵活的树形模式
河南 北京 河北 湖南
root
类型
区域
设备ID
燃油车 新能源车 新能源车
VID1
VIN2
VIN3
VIN4
时间序列
速
度
油
量
加
速
度
角
速
度 GPS 陀螺仪
经
度
纬
度 x y
GPS 陀螺仪
经
度
纬
度 x y
GPS 陀螺仪
经
度
纬
度 x y
油耗
XXX品牌
烟厂案例
root
B1
温度
A1
产量
A2
B2 C2
Tag 测点
Time root.A1.B1.C1.温度 root.A2.B2.C2.温度 root.A2.B3.C3.温度
1606377709000 0.074767 11.026245 0.000000
烟厂 OPC 数据示例 IoTDB 建模:属性为路径
IoTDB 查询结果:按Time对齐
时间
Tag Tag Tag Field Field
车间 产线 制造单元 温度 产量
1 A1 B1 C1 16.9 142
1 A1 B1 C1 16.5 108
2 A2 B2 C2 13.0 130
3 A2 B3 C3 13.5 80
C1
温度
产量
C3
温度
产量
B3
建模指南
• 存储组个数 * 虚拟存储组 (v0.12)(virtual_storage_group_num) = 机器核数
• 1G 内存最多管理20万序列,1000序列最佳(conf/iotdb-env.sh: MAX_HEAP_SIZE)
1G内存管理超过 10 万序列,将 primitive_array_size 调小到 16
• 自动注册时间序列:enable_auto_create_schema
默认的存储组级别:default_storage_group_level (root 为 0 层)
字符串数据模式推断配置:floating_string_infer_type ...
更多参考:https://my.oschina.net/u/3664598/blog/4759767
建模接口
• 设备超多,采集模式相同
ü CREATE TEMPLATE (未正式发布)
• 多测点同时采集
ü aligned timeseries (多元时间序列) (未正式发布)
• 直接使用INSERT
ü 自动推断数据类型,采用默认压缩方式
ü 更精确控制,使用CREATE TIMESERIES
写入接口
• 推荐原生接口 Session,避免拼SQL、解SQL
• 接口性能 insertTablets(多设备多行同列) >
insertTablet(单设备多行同列) >
insertRecordsOfOneDevice (单设备多行不同列) >
insertRecords(Object value) (多设备多行不同列) >
insertRecords(String value) (多设备多行不同列) >
insertRecord(单设备一行)
https://github.com/apache/iotdb/blob/master/example/session/src/main/java/org/apache/iotdb
/SessionExample.java
RecordsOfOneDevice
(类似多 insert SQL)
按时间对齐有空值
设备1
Time 测点1 测点2 测点3
1 a
2 b c
3 a c
按时间对齐无空值
设备1
Time 测点1 测点2 测点3
1 a b c
2 a b c
3 a b c
Tablet
(类似一张子表)
写入接口
写入接口
Records(Object value)
Time 设备 测点1 测点2 测点3
1 d1 1.1f
2 d2 2d "ss"
3 d3 1.2f "ss"
客户端指定类型
Records(String value)
Time 设备 测点1 测点2 测点3
1 d1 "1.1"
2 d2 "2" "boolean"
3 d3 "1.2" "boolean"
服务器通过字符串格式推断类型
写入推荐
- 使用 Session 连接池复用连接:SessionPool
- 同一个设备,尽量数据按顺序写入连接复用
- 手动关闭查询结果ResultSet
- 内存参数优化
https://github.com/apache/iotdb/blob/master/example/session/src/main/java/org
/apache/iotdb/SessionPoolExample.java
提纲
• Apache IoTDB 简介
• 怎么接数据
• 怎么存数据(建模、接口)
• 怎么用数据
• 基于 IoTDB 的工业解决方案
查询优化
开启层级合并(期待社区多反馈问题)
0层数据块点数:min(avg_series_point_number_threshold, IoTDB总内存*0.4*0.4/4/16/总序列数)
目标数据块点数: 0层数据块点数*(seq_file_num_in_each_levelseq_level_num)
查询范围内数据块尽量少
查询优化
查询最新数据点
SELECT last *
FROM root
WHERE time >= T
最新数据缓存
批量数据缓冲区
海量历史数据
内存
磁盘
SELECT
last_value(left_temp)
last_value(right_temp)
FROM
root.device1
GROUP BY
( [ now() – 10h,
now()),1m)
FILL
(ALL[PREVIOUS, 5m])
按分钟粒度降
采样并对齐
按前5分钟内
数据填充空值
时间
时间
车辆速度
车辆速度
补值
补值
查询优化
一行SQL实现分段、采样、对齐、补值
工业数据质量分析算法库
在IoTDB中使用工业数据质量算法库
github.com/thulab/iotdb-quality
https://thulab.github.io/iotdb-quality
虚警过滤
IoTDB-Quality UDF应用案例
github.com/thulab/iotdb-quality
虚警过滤
n 报警:观测值低于指定阈值
n 问题:频繁报警
n 思路:
p 利用时间序列相似度匹配技术
p 历史上出现过的类似真警情况,直接报警
p 历史上出现过的类似虚警情况,不再报警
n 效果:
车号 应用虚警过滤
前报警次数
应用虚警过滤后
报警次数*
下降百分比
10053 25 3 88.0%
10821 863 87 89.9%
11210 860 145 83.1%
0
1
2
3
4
5
6
7
8
1
203
405
607
809
1011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
5455
5657
5859
6061
6263
6465
6667
6869
7071
7273
7475
7677
7879
8081
8283
8485
8687
8889
9091
9293
9495
9697
9899
10101
10303
10505
10707
10909
11111
11313
11515
11717
11919
12121
12323
12525
12727
12929
13131
13333
13535
13737
13939
14141
14343
14545
14747
10053水温数据
value threshold
0
0.5
1
1.5
2
2.5
3
3.5
4
1
174
347
520
693
866
1039
1212
1385
1558
1731
1904
2077
2250
2423
2596
2769
2942
3115
3288
3461
3634
3807
3980
4153
4326
4499
4672
4845
5018
5191
5364
5537
5710
5883
6056
6229
6402
6575
6748
6921
7094
7267
7440
7613
7786
7959
8132
8305
8478
8651
8824
8997
9170
9343
9516
9689
9862
10035
10208
10381
10554
10727
10900
11073
11246
11419
11592
11765
11938
12111
12284
12457
12630
11210异常数据
value threshold
github.com/thulab/iotdb-quality
虚警过滤方案
n 1. 跳变清除:删除速度、加速度异常单点
p ksigma
n 2. 阈值过滤:查找低于阈值的疑似子序列(一分钟长度)
p range
n 3. 匹配真警:疑似子序列匹配真实报警库(历史观测到的真实报警子序列)
p pattern_match
n 4. 异常过滤:疑似子序列LOF异常度计算(历史出现过的类似低电压子序列不属于异常)
p lof
n 5. 异常报警:返回异常度最高的疑似子序列(供人工确认,如属实,则加入报警库)
p max_value
github.com/thulab/iotdb-quality
0
1
2
3
4
5
6
7
8
1
395
789
1183
1577
1971
2365
2759
3153
3547
3941
4335
4729
5123
5517
5911
6305
6699
7093
7487
7881
8275
8669
9063
9457
9851
10245
10639
11033
11427
11821
12215
12609
13003
13397
13791
14185
14579
10053水温值
0
1
2
3
4
5
6
7
8
1
381
761
1141
1521
1901
2281
2661
3041
3421
3801
4181
4561
4941
5321
5701
6081
6461
6841
7221
7601
7981
8361
8741
9121
9501
9881
10261
10641
11021
11401
11781
12161
12541
12921
13301
13681
14061
10053过滤跳变单点后
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
1
12
23
34
45
56
67
78
89
100
111
122
133
144
155
166
177
188
199
210
221
232
243
254
265
276
287
298
309
320
331
342
353
364
水温值
时间序列ID
10053疑似子序列
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
LOF值
序列序号
25段异常序列LOF值
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
1
12
23
34
45
56
67
78
89
100
111
122
133
144
155
166
177
188
199
210
221
232
243
254
265
276
287
298
309
320
331
342
353
364
水温值
时间序列ID
10053疑似子序列
真实报警
子序列库
1、跳变清除
2、阈值过滤
4、异常度计算
5、异常报警
人工确认
0
0.1
0.2
0.3
0.4
0.5
0.6
1 2 3 4 5 6 7 8 9 10 11 12 13
水温值
时间点
匹配历史真警
疑似子序列 真警
3、匹配真警
阈值表
输入
数据
github.com/thulab/iotdb-quality
1. 跳变清除
n 删除值异常的点
n select ksigma(s, k=3.0) from root.test.d1
p 输出:取值在k-sigma范围之内的数据点组成的时间序列
0
0.02
0.04
0.06
0.08
0.1
0.12
1
387
773
1159
1545
1931
2317
2703
3089
3475
3861
4247
4633
5019
5405
5791
6177
6563
6949
7335
7721
8107
8493
8879
9265
9651
10037
10423
10809
11195
11581
11967
12353
12739
10821水温值
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
1
383
765
1147
1529
1911
2293
2675
3057
3439
3821
4203
4585
4967
5349
5731
6113
6495
6877
7259
7641
8023
8405
8787
9169
9551
9933
0315
0697
1079
1461
1843
2225
2607
10821过滤跳变单点后
0
1
2
3
4
5
6
7
8
1
391
781
1171
1561
1951
2341
2731
3121
3511
3901
4291
4681
5071
5461
5851
6241
6631
7021
7411
7801
8191
8581
8971
9361
9751
10141
10531
10921
11311
11701
12091
12481
12871
13261
13651
14041
10053过滤跳变单点后
0
1
2
3
4
5
6
7
8
1
405
809
1213
1617
2021
2425
2829
3233
3637
4041
4445
4849
5253
5657
6061
6465
6869
7273
7677
8081
8485
8889
9293
9697
10101
10505
10909
11313
11717
12121
12525
12929
13333
13737
14141
14545
10053水温值
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
1
376
751
1126
1501
1876
2251
2626
3001
3376
3751
4126
4501
4876
5251
5626
6001
6376
6751
7126
7501
7876
8251
8626
9001
9376
9751
0126
0501
0876
1251
1626
2001
2376
11210过滤跳变单点后
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
1
388
775
1162
1549
1936
2323
2710
3097
3484
3871
4258
4645
5032
5419
5806
6193
6580
6967
7354
7741
8128
8515
8902
9289
9676
10063
10450
10837
11224
11611
11998
12385
12772
11210水温值
github.com/thulab/iotdb-quality
2. 阈值过滤
n 查找低于阈值的疑似子序列
n select range(s, upper_bound=ub) from root.test.d2
p 输出:数据值小于upper_bound的数据点组成的时间序列
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
1
10
19
28
37
46
55
64
73
82
91
100
109
118
127
136
145
154
163
172
181
190
199
208
217
226
235
244
253
262
271
280
289
298
307
316
325
334
343
352
361
370
水温值
点序号
10053疑似子序列
value threshold
0
0.5
1
1.5
2
2.5
3
3.5
4
1
279
557
835
1113
1391
1669
1947
2225
2503
2781
3059
3337
3615
3893
4171
4449
4727
5005
5283
5561
5839
6117
6395
6673
6951
7229
7507
7785
8063
8341
8619
8897
9175
9453
9731
10009
10287
10565
10843
11121
11399
11677
11955
12233
水温值
点序号
11210疑似子序列
value threshold
0
0.5
1
1.5
2
2.5
3
1
290
579
868
1157
1446
1735
2024
2313
2602
2891
3180
3469
3758
4047
4336
4625
4914
5203
5492
5781
6070
6359
6648
6937
7226
7515
7804
8093
8382
8671
8960
9249
9538
9827
10116
10405
10694
10983
11272
11561
11850
12139
12428
12717
水温值
点序号
10821疑似子序列
value threshold
github.com/thulab/iotdb-quality
3. 匹配真警
n 疑似子序列匹配真实报警库(历史观测到的真实报警子序列,若有)
n select pattern_match(s, t) from root.test.d3
p s表示疑似子序列, t表示真实报警库中的序列
p 输出:s在每个窗口内的子序列和t的相似度
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
1
6
11
16
21
26
31
36
41
46
51
56
61
66
71
76
81
86
91
96
101
106
111
116
121
126
131
136
141
146
151
156
161
166
171
176
181
186
191
196
201
206
211
216
221
226
231
236
241
246
251
256
261
266
271
276
281
286
291
296
301
306
311
316
321
326
331
336
341
346
351
水温值
点序号
10053疑似子序列
value threshold
0
0.1
0.2
0.3
0.4
0.5
0.6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
水温值
点序号
10053人工确认后的真实报警(若有)
异常序列 真警
github.com/thulab/iotdb-quality
4. 异常过滤
n 疑似子序列LOF异常度计算(历史出现过的类似低电压子序列未报真警,即异常度低)
n select lof(s, k=1, threshold=f, window=w) from root.test.d4
p lof计算时间序列s中所有长度为window的子序列异常度,其中,k表示使用第k距离计算局部
离群子序列因子
p 输出:每个时刻对应的子序列的lof值
0
0.5
1
1.5
2
2.5
3
3.5
4
1
163
325
487
649
811
973
1135
1297
1459
1621
1783
1945
2107
2269
2431
2593
2755
2917
3079
3241
3403
3565
3727
3889
4051
4213
4375
4537
4699
4861
5023
5185
5347
5509
5671
5833
5995
6157
6319
6481
6643
6805
6967
7129
7291
7453
7615
7777
7939
8101
8263
8425
8587
8749
8911
9073
9235
9397
9559
9721
9883
10045
10207
10369
10531
10693
10855
11017
11179
11341
11503
11665
11827
11989
12151
12313
12475
12637
11210异常数据
value threshold
0
0.1
0.2
0.3
0.4
0.5
0.6
1 2 3 4 5 6 7
水温值
点序号
第8段和第24段子序列
系列1 系列2
github.com/thulab/iotdb-quality
5. 异常报警
n 返回异常度最高的疑似子序列(供人工确认,如属实,则加入报警库)
n select max_value(abnormality) from root.test.d5.s1
p 输出:异常度最大的疑似子序列
真实报警子序列库
人工确认属实
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
1
8
15
22
29
36
43
50
57
64
71
78
85
92
99
106
113
120
127
134
141
148
155
162
169
176
183
190
197
204
211
218
225
232
239
246
253
260
267
274
281
288
295
302
309
316
323
330
337
344
351
358
365
异常度最高的子序列
value threshold
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
LOF值
25段异常序列LOF值
github.com/thulab/iotdb-quality
运输分趟
IoTDB-Quality UDF应用案例
github.com/thulab/iotdb-quality
运输分趟
n 问题:
p 利用运输轨迹信息
p 计算装载运输趟数
n 挑战:
p 装卸区域个数、大小、
距离、位置动态变化,
算法参数需要不断调整
p 弯道停车误认为装卸区域
n 思路:计算轨迹折叠相似度
p 装卸区域:一进一出,轨迹折叠相似度高
p 排除弯道:一进一出,轨迹折叠相似度低
n 效果:准确率0.84
9.2 9.3 9.4 9.5 9.6
两装两卸 一装两卸
github.com/thulab/iotdb-quality
对称子段挖掘方案
n 匹配时间序列s中所有长度为w的对称子段
n select pattern_symmetric(s, window=w, threshold=t) from root.test.d1
p 输出:时间序列s中长度为w且对称度阈值小于等于t的所有子序列
github.com/thulab/iotdb-quality
开关机识别
IoTDB-Quality UDF应用案例
github.com/thulab/iotdb-quality
开关机识别
n 问题:开关机过程中,存在异常点,影响开关机时长/
次数的判断
n 由于开关机阶段往往伴随数据跳变,已有的算法无法准
确识别开关机过程中的异常点
n 算法流程
异常点过滤
FilterByWindow
计算时间间隔Time_Difference
计算时间间隔中位数/绝对中位差/k-sigma值
Median/MAD/KSigma
判定开关机阶
段
OnOffPeriod
异常点
使关机时刻延后
真正的关机点
github.com/thulab/iotdb-quality
1.开关机异常点过滤
n 根据异常度阈值!ℎ#$%ℎ&'(过滤开关机阶段中影响开关机判定的异常点,!ℎ#$%ℎ&'(为一个0~1之
间的参数,其越大表示过滤条件越严格,过滤掉的点越少
n 函数名:FilterByWindow
p 输入:单个时间序列%
p 参数:窗口大小'$)、阈值!ℎ#$%ℎ&'(
p 输出:过滤后的时间序列%!
SELECT
FilterByWindow
(s1,’len’=’5’,’threshol
d’=’0.3’) FROM
root.demo
时间间隔
为1s
时间间隔为24s github.com/thulab/iotdb-quality
2.时间间隔序列
n 计算给定时序数据对应的时间间隔序列
n 函数名:Time_Difference
p 输入:单个时间序列%
p 输出:相邻两点的时间间隔序列t+,$_(+..(%)
SELECT
Time_Difference(s1)
FROM root.demo
时间间隔为52s
github.com/thulab/iotdb-quality
3.(时间间隔的)K-sigma
n 输出时间间隔序列中大于1 + 34的子序列
n 函数名:KSigma
p 输入:单个时间间隔序列%
p 参数:3
p 输出:时间间隔序列中大于1 + 34的子序列
SELECT KSigma(s, ’k’=’1’) FROM
root.time_diff
关机点对应的时间戳 关机时长
由于最后一个点没有后续点
无法计算时间间隔,因此我
们设定其时间间隔为
MAX_INF
github.com/thulab/iotdb-quality
4.(时间间隔的)中位数
n 计算时间间隔序列的中位数
n 函数名:Median
p 输入:单个时间间隔序列%
p 输出:时间间隔序列的中位数
SELECT Median(s) FROM root.time_diff
!"#$%& = 1.0
github.com/thulab/iotdb-quality
5.(时间间隔的)绝对中位差
n 计算时间间隔序列的绝对中位差,567 8 = 5$(+:)(|8" − 5$(+:)(8)|)
n 函数名:MAD
p 输入:单个时间间隔序列%
p 输出:时间间隔序列的绝对中位差
+,- = 0
SELECT MAD(s) FROM root.time_diff
github.com/thulab/iotdb-quality
6.开关机阶段检测
n 用户输入时间间隔阈值(该阈值可以从前述Median/MAD计算得到,或由用户自定义),算法认
为时间间隔大于该阈值的时段为关机时段
n 函数名:Range
p 输入:单个时间间隔序列!
p 参数:时间间隔(下界)阈值"#$%&_(#)*+
p 输出:时间间隔序列中大于"#$%&_(#)*+的子序列
SELECT Range(s, ’lower_bound’=1.0)
FROM root.time_diff
根据前面计算的
Median/MAD得到
的阈值
关机点对应的时间戳 关机时长
优点:可由用户自定义阈值;
避免极端值对阈值的影响
(如果使用3Sigma,该阈值为
35.0)
github.com/thulab/iotdb-quality
时间戳等间隔修复
IoTDB-Quality UDF应用案例
github.com/thulab/iotdb-quality
时间戳等间隔修复
n 问题:时间序列中的数据存在非等间隔分布的情况,需要通过最小代价修复成等间隔
n 步骤:
n 1. 获取时间间隔序列
n 2. 获取标准时间间隔(中位数、众数、聚类中心)
n 3. 计算最优修复
计算所有时间间隔
TIME_DIFFERENCE
计算标准时间间隔
Median/Mode/Cluster
计算起始时间点
计算最优修复
Timestamp_repair
github.com/thulab/iotdb-quality
1. 时间间隔序列
n 计算给定时序数据对应的时间间隔序列
n 函数名:Time_Difference
p 输入:单个时间序列%
p 输出:相邻两点的时间间隔序列t+,$_(+..(%)
采样间隔
为1s
采样间隔为24s
SELECT
Time_Difference(s1)
FROM root.demo
github.com/thulab/iotdb-quality
2. 计算时间序列的时间间隔中位数
n 输入:单个时间序列
n 输出:时间间隔序列的中位数(以秒为规整单位)
n 使用场景:大部分情况,都可以直接作为标准间隔来使用
Select
median(time_difference)
from root.test.d1 1000
github.com/thulab/iotdb-quality
3. 计算时间序列的时间间隔众数
n 输入:单个时间序列
n 输出:时间间隔序列的众数(以秒为规整单位)
n 使用场景:当时间间隔都较为规整,且分散较为集中的情况下,可以作为标准间隔来使用
Select mode
(time_difference) from
root.test.d1 1000
github.com/thulab/iotdb-quality
4. 计算时间序列的时间间隔聚类中心
n 输入:单个时间序列
n 输出:时间间隔序列的聚类中心(以秒为规整单位)
n 使用场景:相比前两个计算方式,适合于计算采集间隔扰动明显不规整的数据集,作为标准间隔
来使用
Select Cluster
(time_difference) from
root.test.d1 7000
github.com/thulab/iotdb-quality
5.时间戳的等间隔修复方案
n 采用最小代价对单个时间序列进行等间隔修复后输出
p 函数名: timestamp_repair
p 输入序列:单个时间序列s
p 参数:标准采集间隔T,起始时间戳的获取方法start_method
p 输出序列:返回修复成等间隔的时间序列s’
Select
timestamp_repair(s1, ”T”=7000,
”start_method”=“mode”) from
root.test.d1
根据前面计算的
Median/Mode/Cluster
得到的阈值
github.com/thulab/iotdb-quality
时序数据填补
IoTDB-Quality UDF应用案例
github.com/thulab/iotdb-quality
时序数据填补
n 问题:时间序列中存在部分数据缺失数据,影响后续的数据分析,需要进行填补。
n 分析:填补,必然使用已观测数据进行分析,获得对整体数据的参数估计。从而利用获得的参数
对缺失的数据进行填补。
n 参数:均值、中位数、方差、自相关系数等
获取缺失
时序数据
数据
参数估计
填补
缺失数据
迭代收敛
github.com/thulab/iotdb-quality
1. 时序数据填补方案
n 函数名:ValueFill
p 输入:单个时间序列;输出:修复后的时间序列
p 参数选择:method
• method=“mean”:使用未缺失数据的均值作填补值,适用于数据较平稳。
• method=“median”:使用未缺失数据的中位数作填补值。
select ValueFill(s1, “method”=“mean”) from root.test.d5.s1
github.com/thulab/iotdb-quality
2. 时序数据填补方案
n 函数名:ValueFill
p 输入:单个时间序列;输出:修复后的时间序列
p 参数:method
• method=“ffill”:使用缺失点的前一个观测点作为当前的填补值,适用于平稳序列。
• method=“bfill”:使用缺失点的后一个观测点作为当前的填补值,适用于平稳序列。
select ValueFill(s1, “method”=“ffill”) from root.test.d5.s1
github.com/thulab/iotdb-quality
3. 时序数据填补方案
n 函数名:ValueFill
p 输入:单个时间序列;输出:修复后的时间序列
p 参数选择:method
• method=“linear”:前后观测数据点的观测值进行线性拟合填补,适用于大部分场景。
• method=“ma”:滑动平均做拟合填补,默认1阶,适用于平滑递增/减场景。
select ValueFill(s1, “method”=“linear”) from root.test.d5.s1
github.com/thulab/iotdb-quality
提纲
• Apache IoTDB 简介
• 时序数据读写特点
• IoTDB 建模指导
• IoTDB 多场景写入接口
• IoTDB 查询优化
• 基于 IoTDB 的工业解决方案举例
化工厂物联网平台
IoTDB 管理浙江化工厂数千个水表、点表、蒸气点位的数据,实行工厂-
车间-设备三级管控,助力能源计划制定、能耗对标、设备维护等。
桥梁监控平台
IoTDB 管理武汉38座桥梁、4座隧道的监测数据。为武汉桥
梁的健康状态提供分析支撑。
烟厂监控平台
IoTDB 管理某卷烟厂200多设备的20万测点,支持大屏监控(查询某时
刻设备关键参数或工艺参数)、批次评价(批次生产关键参数、指标综
合评价)。
78
德国普戈曼公司(德国能源部资助成立)
数字驾驶舱工业互联网平台
德国“工业4.0”旗舰平台
德国“工业4.0”旗舰平台服务宝马、德铁等工业企业
砂芯铸造数据管理系统
德国兰佩集团
德国宝马
赋能中国大唐集团X-DB数据库,支持电厂实时数据管理
n 1个电厂,30万测点
已部署至湖南湘潭、耒阳电厂、湖南电力设计院、湖南省能源局等用户
IoTDB技术创新:元数据索引树
5万点写入0.107秒
16万点读取0.99秒
X-DB 5.0 X-DB 6.0
升级
基于HBase 基于IoTDB
与阿里、东方国信、华为共建时序数据库产品
基于IoTDB打造
阿里Lemming(旅鼠)
时序数据库
基于IoTDB等产品打造
华为Stack FusionInsight
云原生数据湖
基于IoTDB打造
东方国信CirroData-TimeS
时序数据库
建立了活跃的开源社区
100+开发者 近千人用户群
+0000 英国等
+0100 德国等
+0200 俄罗斯,芬兰等
+0530 印度等
+0800 中国等
+0900 日本,韩国等
-0500 美国,加拿大等
-0600 美国等
-0700 美国,加拿大等
-0800 法国等
开发者时区分布
IoTDB培训会/开发者、用户见面会
p 2019 IoTDB & RocketMQ
p 2019 IoTDB & Pulsar
p 2019 IoTDB & ShardingSphere
p 2020 参与 Pulsar summit
p 2020 IoTDB 北京
p 2019 Apache 北美
20周年大会
p 2019 Apache 欧洲
20周年大会
p 2020 Apache 北美大会
p 2020 中国开源年会
p 2020 南京开源峰会
p 2020 CCF 中国软件大会
p 2019/2020 数字中国
p 2019 年工业互联网峰会
受邀在国际、国内大会上进行报告
开源影响力日益凸显
p 阿里巴巴
p 东方国信
p 云智慧
p …
国内龙头企业以IoTDB
设置招聘岗位
国际最热的IT监控系统Prometheus
将IoTDB作为输入源之一
(巴西开发者提供)
成为工业物联网生态中的
重要一环
工业PLC数据采集系
统与IoTDB对接
工业数据传输协议与
IoTDB对接
国外工业界用户
(德国)开展培训
开源中国年度
最受欢迎开源项目
Apache 二十周年大会
上被Apache委员报告
国际著名数据库
软件库收录
融入开源社区
• 期待各位加入
• qq交流群:659990460
• 微信群:添加好友 tietouqiao
• mail list:
• 订阅信息,发送邮件至:
dev-subscribe@iotdb.apache.org
• 讨论与反馈,发送邮件至:
dev@iotdb.apache.org
• BUG反馈,提交至:
https://issues.apache.org/jira/projects/IOTDB/is
sues/IOTDB
• 官方网站: https://iotdb.apache.org
• 微信公众号:Apache IoTDB
使用 Apache IoTDB 构建工业时序数据管理解决方案的实践

使用 Apache IoTDB 构建工业时序数据管理解决方案的实践