nosql - 将测量数据导入 influxdb、nosql 数据库
问题描述
我有一个测量值,我想保留在 influxdb 数据库中。测量本身包括大约。由微控制器生成的 4000 个测量点。测量点采用浮点格式,并以恒定频率定期(每隔几分钟)生成。我试图获得一些关于 NoSQL 数据库的知识,influxdb 是我在这里的第一次尝试。
问题是:假设它们在 mqtt 消息(json 格式)中,我如何在 influxdb 中获得这些测量值?插入字符串是如何生成/处理的?
{
"begin_time_of_meas": "2020-11-19T16:02:48+0000",
"measurement": [
1.0,
2.2,
3.3,
...,
3999.8,
4000.4
],
"device": "D01"
}
我过去使用过 Node-RED,我知道有一个用于 influx db 的插件,所以我想这是一种方法。但我非常不确定如何为一组测量点生成/处理插入字符串。到目前为止,我看到的每个示例仅处理 1 点测量值,例如每隔几秒进行一次温度测量或 CPU 负载。谢谢你的帮助。
解决方案
我已经成功使用了时间精度为毫秒的 influxdb 插件。不知道如何使它适用于更精确的时间戳,我从来不需要。
听起来您每秒有多个点到达;将消息组作为数组发送到influx batch
节点。
在您的情况下,这取决于这 4000 个测量值是什么,以及将它们分组的最佳方式。如果变量都测量相同的点,那么这样的事情可能会奏效。我不知道测量值是什么,等等。一个接受 mqtt 消息并将其转换为这样的消息块的函数可能工作得很好(请注意,此函数输出可以替换join
节点):
[{
measurement: "microcontroller_data",
timestamp: new Date("2020-11-19T16:02:48+0000").getTime(),
tags: {
device: "D01",
point: "0001",
},
fields: {
value: 1.0
}
},
{
measurement: "microcontroller_data",
timestamp: new Date("2020-11-19T16:02:48+0000").getTime(),
tags: {
device: "D01",
point: "0002",
},
fields: {
value: 2.2
}
},
...etc...
]
这看起来需要存储很多信息,但是measurement
值tags
基本上是标题值,不会随每个条目一起写入。这些fields
值确实被存储了,但它们被压缩了。描述要存储的数据的 json 比存储实际使用的磁盘空间大得多。
也可以有多个字段,但我相信这会使数据检索变得更加棘手:
{
measurement: "microcontroller_data",
timestamp: new Date("2020-11-19T16:02:48+0000").getTime(),
tags: {
device: "D01",
point: "0001",
},
fields: {
value_0001: 1.0,
value_0002: 2.2,
...etc...
}
}
更容易编码,但它会产生一些丑陋和不灵活的查询。
您可能会有一些比“microcontroller_data”或“0001”、“0002”等更有意义的名称。如果 4000 个信号用于非常不同的测量,也可能有多个“测量”有意义,例如cpu_parameters、流量、蝴蝶等。
将您的 MQTT 消息解析为该形状。如果消息是一次发送一个,则发送到一个join
节点;我的设置为在 500 条消息或 1 秒不活动后发送;你会找到合适的。
如果您的处理将 json 对象分组到一个数组中,则直接发送到influx batch
节点。
在influx batch
节点中,在“高级查询选项”下,我将精度设置为 ms,因为这是从Date().getTime()
.
推荐阅读
- google-bigquery - 在 BigQuery 中选择具有不同 2 列的最新事件
- machine-learning - 我可以使用 LOOCV 在整个数据集上评估我的模型的性能吗?
- java - 如何在按钮按下时从自动完成文本视图中获取数据?
- ruby-on-rails - 在 Rails 中将大型 PUT 或 POST 请求正文作为流读取,而无需缓冲到磁盘
- reactjs - 通过反应钩子自动从 Django Rest API 的相关输入字段下的错误消息
- python - 在一次热编码引发错误后使用 K-means 预测。一种热编码之前的列数影响?
- qt - 带有 doxygen 的 qhelpgenerator 一直显示 sh : 1 权限被拒绝
- c# - ADO.NET:不允许新事务,因为会话中正在运行其他线程
- android - 问题:当图像在此相机上显示并包含发光效果时,它会变黑
- python - 使用 1 个脚本运行 10 个机器人,无需重写 10 次代码 (discord.py)