- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 视频嵌入链接 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
从存储到计算:Apache IoTDB新特性
黄向东-清华大学软件学院助理研究员/Apache IoTDB 国际开源项目社区PMC Chair
展开查看详情
1 .
2 .从存储到计算:Apache IoTDB 新特性 黄向东 Apache IoTDB PMC Chair 清华大学 软件学院
3 . 从大数据到工业(物联网)大数据 工业物联网时序数据是工业设备物理量的数字化 内涵 价值 记录,是带时间戳的数据,蕴含丰富的工业语义 国际工业互联网领导者通用电气 北京官厅风电场001号风机风叶处实时风速记录 (GE)公司2012年指出:“充分 物理量(测点值) 利用海量时序数据驱动工业创新、 工况标签 竞争和成长,是大数据技术为新工 业革命带来的历史性机遇。” 时间 海量序列存储 复杂元数据管理 丰富的查询需求 边云协同 挑战 据IEC61400-25标准, 风机每年运行7500小时 C919试飞中有超过8万 测点;测点数量等元数 - 数据降采样 - 数据空值填充 - 端侧数据管理能力 - 云侧数据分析能力 将产生 6TB 数据 据随设备升级而改变 - 数据乱序处理
4 . 工业(物联网)大数据主体->时序数据 一名清华学生在食堂的3年消费记录 Cassandra数据库在接受一次写入操作时的日志 SMT生产线上SPI检测锡膏涂抹情况 人的行为 软件的行为 机器的行为 数据来源: https://db- engines.com/en/ranking_ca tegories
5 . 时序数据库管理系统 • TSDB: • a software system that is optimized for handling time series data, arrays of numbers indexed by time (a datetime or a datetime range) • Time Series Data: • <TS_id, Timestamp, Value> 普遍 • <TS_id, Timestamp, Value, Quality> 工业 • <Tag_1, Tag_2, …, Tag_n, Timestamp, Value> IT
6 . 时序数据应用场景 APM 监控 物联网应用 数据分析 - SkyWalking - EMQx - MapReduce - Prometheus - Ditto - Spark
7 . 时序数据管理系统选型 OLAP KV/File HBase Parquet on HDFS/S3 ClickHouse + Druid OpenTSDB Presto RDB TSDB InfluxDB 特定场景 PG/MySQL Skywalking M3DB Apache IoTDB EMQx TimeScaleDB TDengine 。。。
8 .Apache IoTDB:面向工业互联网的高性能轻量级时序 数据库系统软件 应用阶段 管理阶段 采集阶段 处理阶段 分析阶段
9 . 文件API与SQL语言 像使用MySQL一样存储和查询数据 Io T D B -C LI G rafan a-A d ap to r I/E To o l W eb d ash b o ard to visu alize In teractive clien t co m m an d lin e B atch lo ad an d exp o rt d ata tim e series d ata d evic SQL e (OLTP) D evO p Io T D B -JD B C Io T D B O u tlier d etectio n 使用 s H ad o o p / Sp ark AI引擎 Io T D B Syn c Io T D B B ig d ata M ach in e learn in g 分析数据 M essag e Fram ew o rk Q u eu e TsFile Tim e series o p tim ized file fo rm at UDF 文件 A p p licatio n clu ster s API SQL TsFile-C LI O th er In teractive clien t co m m an d lin e (OLAP) D atab ases 20 像使用CSV一样存储和访问数据
10 .✓ 特性1:数据模式从后台定义到边缘设备定义 边缘设备快速迭代升级与加速联网 物联网场景下数据库模式演进 27993 | 时间, 转向角(整型), 发电量…… 设备号 时间 转向角 发电量 27993 15:58:26 5 35 风场 加装感应器 新增测点 27993 15:58:44 5 36 27993 | 时间,风速,转向角(整型),发电量…… 设备号 时间 转向角 发电量 27993 15:58:44 5 35 协议升级 格式变化 设备号 时间 转向角 发电量 风速 27993 | 时间,风速,转向角(浮点型) ,发电量…… 27993 15:58:44 5 35 5.3 接入新型号 设备号 时间 发电量 风速 转向角 设备 全新模式 27993 15:58:44 35 5.3 5.3 35236 | 时间,转速,…… 弱模式/ 设备号 时间 转速 无模式 35236 15:58:4 73 4 数据模式源头在边缘侧 云侧适配边缘侧 用户 定义时序 写入数据 使用数据 开发应用 时序数据库
11 . ✓ 特性2 :从规则负载到复杂负载 规则负载 复杂负载 设备测点少,一张表建模 单设备数万测点 设备ID 时间 测点1 测点2 … 测点1000 超高频采样频率 采集频率低 采样规则简单 表202001 各测点独立采集,时间不齐 时间 测点1 测点2 测点3 t1 v v v !乱序写入! … t2 v v v … 表202003 tn v v v
12 . 特性3 :从后端处理到前后端协同处理 云端 TsFile: 部署在嵌入式终端设备的 云端 存储 数据库 时序“数据文件” 分析 重组 应用 数据 处理 系统 解码 解压 直接 落盘 一份数据 两次处理 一次处理 端云共用 终端 编码 终端 编码成 压缩 为时序数据而生的zip文件 TsFile 支持高性能写入,高压缩比 存储,支持简单查询
13 . Apache IoTDB 发行历史 • 2017, 0.7 最后一个非Apache发行版 (InfluxDB的备胎,青海电力能源平台) • 2019.08,0.8 第一个Apache 发行版 (高写入吞吐,长期稳定,上海地铁) • 2019.12, 0.9 乱序数据整理 (容忍大量乱序数据,大唐电厂) • 2020.06,0.10 查询性能提升 (查询性能大幅提升) • 2020.12,0.11 全新内存控制 (拒绝OOM) • 2021.4,0.12.0(最新0.12.2)
14 .2020年 Hadoop Meetup @上海
15 . 特性4 :从时序数据查询到时序数据处理 select s1 from root.sg.device1 where time > ? and s1>? group by ([?, ?, 1m]) 原始数据查询 时间范围、值过滤 时间维度聚合 深度挖掘时序数据的内涵价值 降采样:按需获取多粒度级别数据 时频变换:多维深度分析 序列分割:语义分析 滑动窗口聚合 FlatFIT [1] 快速构建 快速构建 高效查询 摘要 min:1 max:4 count:4 一级索引 min:5 max:8 count:4 min:9 max:10 count:2 多级索引 高效查询 子序列匹配:历史分析 任意窗口 摘要表[2] 时间分区树[3] 灵活聚合
16 . 特性4 :从时序数据查询到时序数据处理 select s1 from root.sg.device1 where time > ? and s1>? group by ([?, ?, 1m]) 原始数据查询 时间范围、值过滤 时间维度聚合 深度挖掘时序数据的内涵价值 降采样:按需获取多粒度级别数据 时频变换:多维深度分析 序列分割:语义分析 滑动窗口聚合 哪些处理分析任务,可以交给IoTDB来完成? FlatFIT [1] 快速构建 快速构建 高效查询 摘要 min:1 max:4 count:4 一级索引 min:5 max:8 count:4 min:9 max:10 count:2 多级索引 高效查询 子序列匹配:历史分析 任意窗口 摘要表[2] 时间分区树[3] 灵活聚合
17 . 客户端问题 • IoTDB-Client-Go • https://github.com/apache/iotdb-client-go • IoTDB-Client-C++ • https://github.com/apache/iotdb/tree/master/client-cpp • IoTDB-Client-Python (Pandas) • https://github.com/apache/iotdb/tree/master/client-py • IoTDB-Client-C# • dotnet add package iotdb_client_csharp --version 0.12.0 • IoTDB-Client-Java • Session/Session Pool (The best performance) • JDBC
18 . 数据分析的几种时机 数据 存储 查询
19 . UDF:用户自定义函数 UDF Class Description UDTF 输入:n条序列 (用户自定义时间序列函数) 输出:1条序列 UDAF 输入:n条序列 (用户自定义聚合函数) 输出:1个点
20 . Built-in Function == Built-in UDF Type Name sin, cos, tan asin, acos, atan Mathematical degrees, radians Functions sign, ceil, floor, round (17) exp, ln, log10 sqrt abs Variation Trend time_difference Calculation Functions (5) difference, non_negative_difference derivative, non_negative_derivative String Processing string_contains Functions (2) string_matches Selector Functions top_k (2) bottom_k We have integrated nearly 30 commonly used built-in functions through the UDF framework.
21 .Built-in Function: Mathematical Functions sin,cos,tan,asin,acos,atan,degrees,radians abs,sign,ceil,floor,round exp,ln,log10,sqrt
22 .Built-in Function: Variation Trend Calculation
23 .Built-in Function: String Processing Functions
24 .Built-in Function: Selector Functions
25 . UDF programming interface (Java) Method call • validate sequence • After the SQL is parsed: used to verify user input parameters • beforeStart • Before the transformation starts: used to customize the function output data type, configure the original data access strategy, and apply for resources • transform • Main method • terminate • beforeDestroy
26 . transform This data processing method will be called when void transform(Row row, PointCollector you choose to consume original data with the collector) throws Exception RowByRowAccessStrategy in beforeStart. This data processing method will be called when void transform(RowWindow rowWindow, you choose to consume original data with the PointCollector collector) throws SlidingSizeWindowAccessStrategy or Exception SlidingTimeWindowAccessStrategy in beforeStart. Input data points are passed by Row / RowWindow Output data points are output through PointCollector
27 . transform select string_matches(s1, 'regex'='[^\\s]') from root.test.d1
28 . 从简单UDF到复杂应用:IoTDB-Quality github.com/thulab/iotdb-quality 在IoTDB中使用工业数据质量算法库 https://thulab.github.io/iotdb-quality
29 . 降采样 • select resample(s1, 'every'='1m', 'aggr'='mean', 'interp'='linear') from root.test.d1