我有一个项目,其中物理传感器向服务器发送数据。数据是不规律发送的 - 在传感器被激活后发送,但不会少于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周)。因此,记录的总数不会超过120 960 000/14天。这是一种“安全”的估计。实际上可能小10倍(10个请求/秒,12,960,000条记录)。
我需要对数据进行一些分析,例如:
1.当新记录出现并且它的“值2”为真时,执行某些操作
2.当传感器X的“值2”为真的时间超过某个声明的时间(50分钟,1小时或更多其他时间)时,执行某些操作
3.当传感器X在24小时内的“值2”总真实时间超过某个声明的时间时,执行某些操作
4.当传感器X的“值3”为真的时间超过某个声明的时间,并且在此期间没有其他类型为XYZ的传感器处于活动状态时,执行某些操作…
上述“声明的时间”大于或等于1秒。
整个服务器部分是用Django(和django-rest-framework来收集数据)开发的。
问题是如何有效地进行这样的数据分析,假设应该实时或接近实时(1秒)监视数据和时间段以触发所需的操作。
我的想法:
1.运行一个处理进程,每秒查询符合标准的记录的数据库,并调用特定的操作(这可能需要更多的时间)
2.运行一些单独的进程(eventlet?)每种分析类型一个,然后每1秒查询数据库并触发特定的操作。
3.为每个传感器运行一个进程,其不断向其订阅者报告:我在“值2”上持续x秒等。在该传感器的新数据到达后,重置进程。这里可以使用一些发布-订阅解决方案,例如zeromq?
4.使用其他/更快的解决方案
MongoDB-问题可能是mongodb的文件在删除数据(2周)后没有压缩。
Hadoop-对于这类问题来说太大太复杂了吗?
Pandas和某些HDF5存储-问题可能是它是否能够执行我上面描述的分析,还可能进行写入文件。但是..也可以与mongo一起使用。
提示?
更新。
目前,对我而言,看起来简单有效的解决方案是:
- 当数据到达传感器A时,运行所有测试,并将测试结果以以下方式存储在某个“tests”表格(或redis)中:
- 今天下午1:15执行操作“传感器打开时间长”
- 今天下午1:30执行操作“24小时内传感器打开时间长”...
- 持续扫描上述“tests”表格,并在今天下午1:15时运行所需的操作,等等。
- 当传感器A有新信号到达时,再次运行所有测试,并重置“tests”表格中的数据。
这需要我每次请求特定传感器时都要触发测试,但另一方面,我只需每秒钟扫描“tests”表格。
更新2:
我发现PyTables (http://www.pytables.org/moin/PyTables) 很适合作为我的数据存储用例。