使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(2)
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(2)
Apache IoTDB中常见的数据模型和术语
通过上图我们可以非常清楚的了解到属性的覆盖范围和它们之间的隶属关系,并且根据属性的覆盖范围和它们之间的隶属关系,将其表达为属性层次结构。其层次关系为:power group layer - power plant layer - device layer - sensor layer。其中,ROOT是根节点,传感器层的每个节点称为一个叶节点。在使用IoTDB的过程中,可以用“.”直接连接从根节点到每个叶节点的路径上的属性,从而形成了IoTDB中一个timeseries的名称。例如,图中最左边的路径可以生成一个名为ROOT.ln.wf01.wt01.status 的路径。
1.属性层次结构
在获得时间序列的名称后,大家就需要根据数据的实际场景和规模来设置存储组。在一般场景下,数据通常是以组为单位到达的(即数据可能跨越电场和设备),为了避免写数据时频繁切换io,也为了满足用户对以组为单位的数据进行物理隔离的要求,可以在组层设置存储组。
接下来我给大家介绍几个IoTDB中涉及的模型的基本概念:
- 设备
设备是真实场景中装备有传感器的装置。在IoTDB中,所有的传感器都应该有相应的设备。
- 传感器
传感器是实际场景中的检测设备,能够感知待测信息,并将感知到的信息转换成电信号或其他所需形式的信息输出,并发送给IoTDB。在IoTDB中,所有存储的数据和路径都以传感器为单位进行组织。
- 存储组
存储组用于让用户定义如何组织和隔离磁盘上不同的时间序列数据。属于同一存储组的时间序列将被连续写入相应文件夹中的同一文件。该文件可能由于用户命令或系统策略而关闭,因此来自这些传感器的下一个数据将存储在同一文件夹的新文件中。属于不同存储组的时间序列存储在不同的文件夹中。
用户可以将任何前缀路径设置为存储组。假设有四个时间序列root.vehicle.d1.s1, root.vehicle.d1.s2, root.vehicle.d2.s1, root.vehicle.d2.s2,两个设备d1和d2在小路下面root.vehicle可能属于同一个车主或者同一个厂家,所以d1和d2关系密切。此时,可以将前缀path root.vehicle指定为一个存储组,这将使IoTDB能够将其下的所有设备存储在同一个文件夹中。下新添加的设备root.vehicle也将属于该存储组。
其中完整路径(root.vehicle.d1.s1如上例所示)不允许设置为存储组。
设置合理数量的存储组可以带来性能的提升:既不会因为存储文件或文件夹过多而导致IO频繁切换,也不会因为占用大量内存,导致内存文件频繁切换而导致系统变慢,也不会因为存储文件或文件夹过少而导致写命令阻塞,起到降低并发的作用。
用户应该根据自己的数据大小和使用场景来平衡存储文件的存储组设置,以获得更好的系统性能。(大家如果对于存储组设置非常感兴趣的话,可以自己查询一下官方提供的存储组规模和性能测试报告)。
其中时间序列的前缀必须属于一个存储组。在创建时间序列之前,用户必须设置该序列属于哪个存储组。只有设置了存储组的时间序列才能保存到磁盘上。
一旦前缀路径被设置为存储组,就不能更改存储组设置。设置存储组后,不允许再次设置相应前缀路径的所有父层和子层(例如,在root.ln设置为存储组、根层和root.ln.wf01不允许设置为存储组。
- 路径
在IoTDB中,路径是符合以下约束的表达式:
path: LayerName (DOT LayerName)+
LayerName: Identifier | STAR
我们称两条路径之间的中间部分为“.”作为一个层,因此root.A.B.C是一条有四层的路径。
值得注意的是,在路径中,root是一个保留字符,只允许出现在下面提到的时间序列的开头。如果root出现在其他层中,则无法对其进行解析并报告错误。
- 时间序列路径
timeseries路径是IoTDB中的核心概念。时间序列路径可以被认为是产生时间序列数据的传感器的完整路径。IoTDB中的所有时间序列路径必须以root开始,以传感器结束。时间序列路径也可以称为完整路径。
例如,如果车辆类型的设备1有一个名为sensor1的传感器,则其时间序列路径可表示为:root.vehicle.device1.sensor1.
其中当前IoTDB支持的timeseries路径的层数必须大于等于四层(以后会改为两层)。
- 前缀路径
前缀路径是指timeseries路径的前缀所在的路径。前缀路径包含以该路径为前缀的所有时间序列路径。例如,假设我们有三个传感器:root.vehicle.device1.sensor1, root.vehicle.device1.sensor2, root.vehicle.device2.sensor1,前缀路径root.vehicle.device1包含两个时间序列路径root.vehicle.device1.sensor1和root.vehicle.device1.sensor,期间root.vehicle.device2.sensor1被排除在外。
- 带星形的路径
为了更方便快捷地表示多个时序路径或前缀路径,IoTDB为用户提供了路径指针。*可以出现在路径的任何一层。根据所处的位置*出现时,带有星号的路径可以分为两种类型:
*出现在路径的末端;
*出现在路径中间;
*出现在路径的末尾的时候,它表示(*)+,它是一层或多层*。举个例子,root.vehicle.device1.*表示所有前缀为root.vehicle.device1层数大于或等于4层,如root.vehicle.device1.*,root.vehicle.device1.*.*, root.vehicle.device1.*.*.*等。
当...的时候*出现在路径的中间,它代表*本身,即一层。举个例子,root.vehicle.*.sensor1表示前缀为的4层路径root.vehicle后缀是sensor1。
在这里我们应该注意:
- *不能放在路径的开头。
- 路径包含*与前缀路径具有相同的含义,例如,root.vehicle.*和root.vehicle是一样的。
- 时间戳
时间戳是产生数据的时间点。它包括绝对时间戳和相对时间戳
- 绝对时间戳
IoTDB中的绝对时间戳分为LONG和DATETIME两种(包括DATETIME-INPUT和DATETIME-DISPLAY)。当用户输入时间戳时,他可以使用长类型时间戳或日期时间输入类型时间戳,日期时间输入类型时间戳支持的格式如下表所示:
**日期时间输入类型时间戳的支持格式* *
Format |
||
yyyy-MM-dd HH:mm:ss | yyyy/MM/dd HH:mm:ss | yyyy.MM.dd HH:mm:ss |
yyyy-MM-dd’T’HH:mm:ss | yyyy/MM/dd’T’HH:mm:ss | yyyy.MM.dd’T’HH:mm:ss |
yyyy-MM-dd HH:mm:ssZZ | yyyy/MM/dd HH:mm:ssZZ | yyyy.MM.dd HH:mm:ssZZ |
yyyy-MM-dd’T’HH:mm:ssZZ | yyyy/MM/dd’T’HH:mm:ssZZ | yyyy.MM.dd’T’HH:mm:ssZZ |
yyyy/MM/dd HH:mm:ss.SSS | yyyy-MM-dd HH:mm:ss.SSS | yyyy.MM.dd HH:mm:ss.SSS |
yyyy/MM/dd’T’HH:mm:ss.SSS | yyyy-MM-dd’T’HH:mm:ss.SSS | yyyy.MM.dd’T’HH:mm:ss.SSS |
yyyy-MM-dd HH:mm:ss.SSSZZ | yyyy/MM/dd HH:mm:ss.SSSZZ | yyyy.MM.dd HH:mm:ss.SSSZZ |
yyyy-MM-dd’T’HH:mm:ss.SSSZZ | yyyy/MM/dd’T’HH:mm:ss.SSSZZ | yyyy.MM.dd’T’HH:mm:ss.SSSZZ |
ISO8601 standard time format |
这次先给大家介绍到这里,下次再来给小伙伴们介绍时间戳和相对时间戳的数据格式~
- 点赞
- 收藏
- 关注作者
评论(0)