基于mongodb的python时间数据分析

9q78igpj  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(373)

我有一个项目,物理传感器向服务器发送数据。数据不定期发送-在某个传感器被激活后,但频率不低于每20分钟一次。在服务器上,数据存储在posgresql数据库中。
数据结构如下所示:

Sensor Table
    sensor name - string
    sensor serial no - string
    sensor type - foreign key to types table

Sensor Data Table
    sensor - foreign key
    timestamp
    value 1 - boolean
    value 2 - boolean
    value 3 - integer
    value 4 - float
    ...

预计不超过100个请求/秒。数据库中的数据记录应该保存90天,在某些情况下甚至更长时间(而不是像我之前想的那样只保存2周)。所以记录的总量不会超过120960000/14天。这是“安全”的估计。实际上,它可能会减少10倍(10个请求/秒,12960000条记录)。
我需要对数据做一些分析,比如:
当一个新的记录出现时,它的“值2”是真的
当传感器x的“值2”大于某个声明时间(50分钟、1小时或更多其他时间)时,采取措施
当传感器x在24小时内“值2”的总真实时间大于某个声明时间时,请采取措施
当传感器x的“值3”为真的时间超过某个声明的时间,并且在此期间没有其他xyz类型的传感器处于活动状态时,请执行某些操作。。。
上述“声明时间”大于或等于1秒。
整个服务器部分是在django(和用于收集数据的django rest框架)中开发的。
问题是如何有效地进行这样的数据分析,假设应该对数据和时间段进行实时或接近实时(1秒)的监控,以触发所需的操作。
我的想法:
运行一个进程,该进程将每秒查询数据库中符合条件的记录并调用特定操作(可能需要1秒以上)
为每种分析类型运行一些单独的进程(eventlet?),然后每1秒查询一次数据库并触发特定的操作。
对每个传感器运行一个进程,持续向其订户报告:我在“值2”上为真的时间超过x秒等。该进程在该传感器的新数据到达后重置。这里可能会使用诸如zeromq之类的发布-订阅解决方案?
使用其他/更快的解决方案
mongodb—问题可能是在删除数据后(2周),mongodb的文件没有被压缩。
hadoop—对于这类问题来说,它不是太大、太复杂了吗?
pandas和一些hdf5存储—问题可能是它是否能够进行我上面描述的分析,可能还可以写入文件。但是。。也可以和mongo一起工作。
提示?
更新。
目前,我认为简单有效的解决方案是:
数据到达传感器a后,运行所有测试并
在某些“测试”表(或redis)中存储测试结果的方式如下:
今天下午1:15运行操作“传感器打开时间超过”
今天下午1:30运行操作“传感器打开时间超过24小时”。。。
连续扫描上面的“测试”表,当今天下午1:15,然后运行所需的操作,等等。
当传感器a收到新信号时,再次运行所有测试,并重置“测试”表中的数据。
这将要求我在每次特定传感器的请求到达时启动测试,但在另一边,我只能每隔1秒扫描一次“测试”表。
更新2
我发现了table(http://www.pytables.org/moin/pytables),看起来它非常适合作为数据存储的用例。

p4rjhz4m

p4rjhz4m1#

选项4。关系数据库是明显的瓶颈。以更简单的形式安排数据传递(目录中的文件,以传感器名称或任何唯一键命名)。您可以更快地处理数据,检查时间戳并读取数据——然后在分析之后将数据推送到后端的rdb。

cnh2zyt3

cnh2zyt32#

我的第一个尝试是在“传感器数据表”上创建一个多列索引,如下所示:

sensor->timestamp->value1 //Index 1
sensor->timestamp->value2 //Index 2
sensor->timestamp->value3 //Index 3
sensor->timestamp->value4 //Index 4

看看sql查询是否足够快。您可以通过eventlet或cron查询它。从性能的Angular 看,使用哪种查询并不重要,只要这个查询足够快,它很可能是您的瓶颈。
另一个建议是尝试mysql内存表,或者postgre等效的内存表(postgresql中的内存表)。
另一个建议是尝试redis。您可以存储“传感器数据”作为一个集合排序集;每个传感器id和值字段一个排序集,并按时间戳对数据排序。

ZADD sensor_id:value1 timestamp value
 ZADD sensor_id:value2 timestamp value

redis将需要一些应用程序逻辑来积累数据,但是如果它都适合ram,那么它将非常快。
回复:mongodb。你可以得到很好的表现。只要您的可查询数据+索引可以放在ram中,并且没有太多的写锁。尽管运行2个提供重叠特性的重量级数据库是一个管理(和编码)负担。鉴于此,压实并不是一个真正的问题。您可以在传感器数据上创建ttl索引,mongo将删除bg线程中的旧数据。文件大小将在一段时间后保持不变。
希望这有帮助

x8goxv8g

x8goxv8g3#

您是否考虑过按问题进行bucketing并对输入数据进行流处理?
这种类型的示例方法是:

for event in new_events: # new events to be written from the RESTful service
    for test in tests: # known tests you need to perform
        increment/decrement <test.bucket>.<sensor>.<valueX> # update the bucket as necessary
        # e.g. seconds_since_changed.sensor1.value3 += 1
     # additionally, save each record to a standard database for long-term purposes
     # and to be able to rebuild/redo tests as necessary.

这种事务流的理想存储机制是适合低延迟写入/更新的机制。nosql解决方案非常适合这种工作(我个人使用redis进行类似类型的分析,但您并不一定要使用这种特定的解决方案)

weylhg0b

weylhg0b4#

如果规则简单或很少,可以尝试使用sql触发器更新存储的视图,这些视图可能会被快速查询。e、 g.假设您想检测某个传感器在给定的时间内处于活动状态,您可以有一个表,其中包含当前处于活动状态的传感器的激活时间。无论何时存储原始事件,触发器都会更新这样的表。
对于第三类规则来说,难度更大。除非它们中的任何一个很少,并且您可以为每一个设置一组触发器和视图,或者预先知道允许的时间段。

相关问题