Elastic Stack应用:传感器数据分析与时间序列数据处理
1. 分片数量的影响
1.1 对相关性得分的影响
大量小分片并不总是最佳解决方案,因为这可能会影响搜索结果的相关性。在搜索查询中,相关性得分是在分片的上下文中计算的。文档的相对频率是在每个分片的上下文中计算的,而不是跨所有分片。因此,分片数量会影响查询的总体得分。特别是,为了解决未来的可扩展性问题而设置过多分片并不是一个好办法。
1.2 对聚合准确性的影响
与搜索查询的执行类似,聚合查询也由协调节点进行协调。假设客户端请求对一个可能有大量唯一值的字段进行词项聚合。默认情况下,词项聚合会向客户端返回前10个词项。
为了协调词项聚合的执行,协调节点不会从所有分片中请求所有桶。所有分片都会被要求提供它们的前n个桶。默认情况下,这个n值等于词项聚合的size参数,即客户端请求的前几个桶的数量。例如,如果客户端请求前10个词项,协调节点会要求每个分片提供前10个桶。
2. 映射随时间的变化
2.1 新增字段
当包含新字段的第一个文档被索引时,如果该新字段的映射不存在,Elasticsearch会自动创建它。Elasticsearch会根据第一个文档中该字段的值推断其数据类型,以创建映射。特定类型文档的映射可能会随着时间的推移而增长。一旦包含新字段的文档被索引,该新字段的映射就会被创建并保留。
2.2 删除现有字段
随着时间的推移,项目需求可能会发生变化,一些字段可能会过时不再使用。在Elasticsearch索引中,不再使用的字段不会自动删除,所有曾经被索引的字段的映射都会保留在索引中。Elasticsearch索引中的每个额外字段都会带来开销,特别是当有数百或数千个字段时。如果在你的用例中有大量未使用的字段,会增加集群的负担。
3. 自动删除旧文档
没有集群有无限的容量来永久保留数据。随着数据量随时间增长,你可能决定只在Elasticsearch中存储必要的数据。通常,根据你的用例,你可能希望在Elasticsearch中保留过去几周、几个月或几年的数据。
在Elasticsearch 2.x之前,这是通过为单个文档设置TTL(生存时间)来实现的。每个文档可以配置为在索引中保留可配置的时间。但由于按文档维护生存时间的开销,TTL功能在2.x版本中被弃用。
4. 按时间框架创建索引的优势
4.1 可扩展性
不再使用需要存储所有历史数据的单一整体索引,根据近期数据量进行扩展或缩减变得更容易。分片数量的选择不是一个预先确定且永久的决定。可以为给定的时间段开始时估计一个初始的分片数量,并将其放入索引模板中。由于可以在下一个时间框架开始之前更改分片的选择,因此不会因错误的选择而受限。每个时间段都有机会调整索引模板,以增加或减少为下一个要创建的索引分配的分片数量。
4.2 映射更改
更改映射变得更容易,因为只需更新用于创建新索引的索引模板。当索引模板更新时,为新时间框架创建的新索引将使用模板中的新映射。每个时间框架都为我们提供了更改的机会。
4.3 自动删除旧文档
使用基于时间的索引,删除旧文档变得更容易。可以直接删除旧索引,而不是逐个删除文档。如果使用月度索引并希望强制保留6个月的数据,可以删除所有超过6个月的索引。这可以设置为定期任务,以查找并删除旧索引。
以下是按时间框架创建索引的优势总结表格:
| 优势 | 说明 |
| ---- | ---- |
| 可扩展性 | 可根据近期数据量调整分片数量 |
| 映射更改 | 可通过更新索引模板轻松更改映射 |
| 自动删除旧文档 | 可直接删除旧索引,而非逐个删除文档 |
5. 构建传感器数据分析应用
5.1 应用介绍
物联网(IoT)在现代有广泛的应用。物联网是指通过互联网交换数据,相互感知和通信的智能设备网络。物联网设备连接到互联网,配备各种传感器,收集并传输数据。这些数据可以实时存储、分析和处理。预计到2020年,联网设备数量将达到300亿。
我们将构建一个应用程序,用于存储和分析来自温度和湿度传感器的传感器数据。传感器可以部署在多个地点,每个地点都连接到互联网。该应用可以扩展以支持任何类型的传感器数据。
5.2 理解传感器生成的数据
传感器以JSON格式通过互联网发送数据,每个读数如下所示:
{ "sensor_id": 1, "time": 1511935948000, "value": 21.89}
-
sensor_id:发出记录的传感器的唯一标识符。 -
time:自1970年1月1日00:00:00以来的毫秒数。 -
value:传感器发出的实际度量值。
系统中的所有传感器每分钟都会生成这种JSON负载。
5.3 理解传感器元数据
所有传感器的元数据存储在关系数据库中,在我们的示例中是MySQL。这些元数据也可以存储在其他关系数据库或Elasticsearch的索引中。传感器元数据主要包含以下详细信息:
- 传感器类型:如温度传感器、湿度传感器等。
- 位置相关元数据:具有给定传感器ID的传感器的物理位置,以及与之关联的客户。
这些信息存储在MySQL的以下三个表中:
sensor_type表
| sensor_type_id | sensor_type |
|---|---|
| 1 | Temperature |
| 2 | Humidity |
location表
| location_id | customer | department | building_name | room | floor | location_on_floor | latitude | longitude |
|---|---|---|---|---|---|---|---|---|
| 1 | Abc Labs | R & D | 222 Broadway | 101 | 1 | C - 101 | 40.710936 | -74.008500 |
sensors表
| sensor_id | sensor_type_id | location_id |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 1 |
可以使用以下SQL查询查找与给定传感器ID关联的所有元数据:
select
st.sensor_type as sensorType,
l.customer as customer,
l.department as department,
l.building_name as buildingName,
l.room as room,
l.floor as floor,
l.location_on_floor as locationOnFloor,
l.latitude,
l.longitude
from
sensors s
inner join
sensor_type st ON s.sensor_type_id = st.sensor_type_id
inner join
location l ON s.location_id = l.location_id
where
s.sensor_id = 1;
5.4 理解最终存储的数据
通过结合客户端发送的数据(包含传感器在给定时间的给定指标的度量值),可以构建一个包含以下字段的丰富记录:
- sensorId
- sensorType
- customer
- department
- buildingName
- room
- floor
- locationOnFloor
- latitude
- longitude
- time
- reading
其中,
sensorId
、
time
和
reading
字段来自传感器发送的有效负载,其余字段通过上述SQL查询使用
sensorId
进行查找和丰富。这样,每分钟都可以为每个传感器生成一个非规范化的传感器读数记录。
6. 在Elasticsearch中建模数据
6.1 定义索引模板
由于要存储不可变的时间序列数据,我们不希望创建一个大的整体索引。可以使用之前讨论的时间序列数据建模技术。
应用的源代码位于GitHub仓库:https://github.com/pranav-shukla/learningelasticstack/tree/v7.0/chapter - 10。请按照该路径下README.md文件中的步骤操作。可以创建README.md文件步骤1中提到的索引模板,或者在Kibana开发工具控制台中执行以下脚本:
POST _template/sensor_data_template{ "index_patterns": [ ...
6.2 理解映射
在索引模板中定义的映射包含查找后非规范化记录中所有的字段。索引模板映射中的一些注意事项如下:
- 所有包含文本类型数据的字段都存储为关键字类型,同时也存储在分析字段中作为文本。例如,
customer
字段。
- 丰富数据中的
latitude
和
longitude
字段现在映射为名为
location
的地理点类型字段。
7. 设置元数据数据库
需要一个包含传感器元数据的数据库,该数据库将包含前面应用介绍部分讨论的表。我们使用关系数据库MySQL,但也可以使用其他关系数据库。由于使用MySQL,我们将使用MySQL JDBC驱动程序连接到数据库。请确保系统上设置了以下内容:
1. MySQL数据库社区版5.5、5.6或5.7。如果系统上已经有现有数据库,可以使用它。
2. 安装下载的MySQL数据库,使用root用户登录。执行以下脚本:https://github.com/pranav - shukla/learningelasticstack/tree/v7.0/chapter - 10/files/create_sensor_metadata.sql
8. 构建Logstash数据管道
8.1 数据管道的功能
数据管道应执行以下步骤:
- 通过Web(HTTP)接受JSON请求。
- 用MySQL数据库中的元数据丰富JSON数据。
- 将结果文档存储在Elasticsearch中。
这三个主要功能分别对应Logstash数据管道的输入、过滤和输出插件。完整的Logstash配置文件位于:https://github.com/pranav - shukla/learningelasticstack/tree/v7.0/chapter - 10/files/logstash_sensor_data_http.conf。
8.2 接受Web上的JSON请求
这个功能由输入插件实现。Logstash支持http输入插件,它可以构建一个HTTP接口,接受不同类型的有效负载作为输入。
logstash_sensor_data_http.conf
中包含输入过滤器的相关部分如下:
input { http { id => "sensor_data_http_input" }}
这里,
id
字段是一个字符串,如果需要,可以在文件中唯一标识这个输入过滤器。我们选择
sensor_data_http_input
作为名称。HTTP输入插件的参考文档可在以下链接找到:https://www.elastic.co/guide/en/logstash/current/plugins - inputs - http.html
以下是整个构建传感器数据分析应用的流程mermaid图:
graph LR
A[理解传感器数据与元数据] --> B[在Elasticsearch中建模数据]
B --> C[设置元数据数据库]
C --> D[构建Logstash数据管道]
D --> E[接受Web上的JSON请求]
E --> F[用元数据丰富JSON数据]
F --> G[存储结果文档到Elasticsearch]
综上所述,通过上述方法可以有效处理传感器数据的存储、分析等问题,并且利用按时间框架创建索引等技术可以更好地应对时间序列数据的挑战。在实际应用中,可以根据具体需求对这些技术进行调整和优化。
9. 数据管道的过滤与输出
9.1 用元数据丰富JSON数据
在Logstash数据管道中,过滤插件负责用MySQL数据库中的元数据丰富JSON数据。可以使用Logstash的jdbc过滤器插件来实现这一功能。以下是一个简单的配置示例:
filter {
jdbc {
jdbc_connection_string => "jdbc:mysql://localhost:3306/sensor_metadata"
jdbc_user => "root"
jdbc_password => "password"
jdbc_driver_library => "/path/to/mysql-connector-java.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
statement => "SELECT st.sensor_type as sensorType, l.customer as customer, l.department as department, l.building_name as buildingName, l.room as room, l.floor as floor, l.location_on_floor as locationOnFloor, l.latitude, l.longitude FROM sensors s INNER JOIN sensor_type st ON s.sensor_type_id = st.sensor_type_id INNER JOIN location l ON s.location_id = l.location_id WHERE s.sensor_id = :sensor_id"
parameters => { "sensor_id" => "%{sensor_id}" }
}
}
在这个配置中:
-
jdbc_connection_string
:指定MySQL数据库的连接字符串。
-
jdbc_user
和
jdbc_password
:用于连接数据库的用户名和密码。
-
jdbc_driver_library
:指定MySQL JDBC驱动程序的路径。
-
jdbc_driver_class
:指定JDBC驱动程序的类名。
-
statement
:定义用于查询元数据的SQL语句。
-
parameters
:将传感器ID作为参数传递给SQL语句。
9.2 将结果文档存储在Elasticsearch中
输出插件负责将丰富后的JSON数据存储在Elasticsearch中。可以使用Logstash的elasticsearch输出插件来实现这一功能。以下是一个简单的配置示例:
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "sensor_data-%{+YYYY.MM.dd}"
document_id => "%{sensor_id}-%{time}"
}
}
在这个配置中:
-
hosts
:指定Elasticsearch的主机和端口。
-
index
:指定存储数据的索引名称,使用日期模式确保每天的数据存储在不同的索引中。
-
document_id
:为每个文档指定唯一的ID,由传感器ID和时间戳组成。
以下是Logstash数据管道的配置总结表格:
| 插件类型 | 插件名称 | 配置说明 |
| ---- | ---- | ---- |
| 输入 | http | 构建HTTP接口接受JSON请求 |
| 过滤 | jdbc | 用MySQL数据库中的元数据丰富JSON数据 |
| 输出 | elasticsearch | 将结果文档存储在Elasticsearch中 |
10. 可视化传感器数据
10.1 使用Kibana进行可视化
Kibana是Elastic Stack的可视化工具,可以用于创建各种图表和仪表板来展示传感器数据。以下是使用Kibana进行可视化的基本步骤:
1.
连接到Elasticsearch
:在Kibana的管理界面中,配置连接到Elasticsearch的主机和端口。
2.
创建索引模式
:在Kibana中创建一个索引模式,指定要可视化的索引名称。例如,可以使用
sensor_data-*
来匹配所有以
sensor_data-
开头的索引。
3.
创建可视化
:在Kibana的可视化界面中,选择合适的可视化类型,如柱状图、折线图、地图等,然后配置可视化的参数,如选择要展示的字段、设置过滤条件等。
4.
创建仪表板
:将多个可视化组合在一起,创建一个仪表板,以便全面展示传感器数据。
10.2 示例可视化
以下是一个简单的折线图示例,用于展示温度传感器的读数随时间的变化:
1.
选择可视化类型
:在Kibana的可视化界面中,选择折线图。
2.
配置数据源
:选择要展示的索引模式,如
sensor_data-*
,并选择
time
字段作为X轴,
reading
字段作为Y轴。
3.
设置过滤条件
:可以设置过滤条件,只展示温度传感器的数据,例如,过滤
sensorType
字段为
Temperature
。
4.
调整可视化参数
:根据需要调整折线图的颜色、线条样式、坐标轴标签等参数。
以下是使用Kibana进行可视化的步骤列表:
1. 连接到Elasticsearch
2. 创建索引模式
3. 创建可视化
4. 创建仪表板
11. 总结
11.1 关键技术回顾
在处理传感器数据分析和时间序列数据时,我们介绍了以下关键技术:
-
分片管理
:分片数量会影响搜索结果的相关性和聚合的准确性,按时间框架创建索引可以更灵活地管理分片数量。
-
映射更改
:通过更新索引模板,可以轻松更改映射,适应数据结构的变化。
-
数据删除
:使用基于时间的索引,可以直接删除旧索引,简化数据删除操作。
-
数据建模
:在Elasticsearch中定义索引模板和映射,用于存储传感器数据。
-
数据管道
:使用Logstash构建数据管道,实现数据的接收、丰富和存储。
-
可视化
:使用Kibana进行传感器数据的可视化展示。
11.2 应用优势
通过应用这些技术,我们可以实现以下优势:
-
可扩展性
:根据数据量的变化,灵活调整分片数量和索引配置。
-
数据管理
:方便地更改映射和删除旧数据,提高数据管理效率。
-
实时分析
:快速处理和分析传感器数据,实现实时监控和决策。
以下是关键技术和应用优势的总结表格:
| 关键技术 | 应用优势 |
| ---- | ---- |
| 分片管理 | 可扩展性 |
| 映射更改 | 数据管理 |
| 数据删除 | 数据管理 |
| 数据建模 | 数据存储 |
| 数据管道 | 数据处理 |
| 可视化 | 实时分析 |
11.3 未来展望
在未来的应用中,可以进一步扩展和优化这些技术,例如:
-
增加传感器类型
:支持更多类型的传感器数据,如压力传感器、光照传感器等。
-
实时警报
:根据传感器数据设置阈值,实现实时警报功能。
-
机器学习分析
:应用机器学习算法对传感器数据进行深入分析,发现潜在的模式和趋势。
以下是未来扩展和优化的步骤mermaid图:
graph LR
A[增加传感器类型] --> B[实时警报]
B --> C[机器学习分析]
通过以上技术和方法,可以构建一个高效、可扩展的传感器数据分析应用,实现对传感器数据的实时监控、分析和可视化展示。在实际应用中,可以根据具体需求对这些技术进行调整和优化,以满足不同的业务场景。
超级会员免费看

1812

被折叠的 条评论
为什么被折叠?



