我目前正在开发一个项目,并研究从工业工厂传感器中检索数据的最佳方法,这些传感器连接到PLC(工厂中的机械控制器,例如控制电机、速度、开关等)。)。
我会解释所要达到的目标,而我认为我的论点可以外推到很多不同类型的行业:
我想使用卡桑德拉与时间序列,因为它看起来是最有希望和更快的技术来做到这一点。
我的问题是每秒钟都要存储模拟值。是否最好有一个类似于:的模式?
时间戳,sensor1,sensor2,sensor3,sensor4
和行并按工厂中的部件分组,还是更好?
每个传感器都有自己的桌子。
整个系统将采用Java语言开发,并将数据提供给外部公司进行分析。
发布于 2014-11-18 10:03:50
不太清楚您的查询是什么。您提到“我希望至少每秒钟检索一次类似值的数据(例如,马达rmp、温度、湿度……)”。
这是否意味着你每秒钟都在查询所有10K传感器?或者是特定的传感器,还是一组传感器?在cassandra中,在查看数据模型之前了解查询内容是至关重要的。如果您正在寻找1秒的粒度,一个选项可能是将传入的数据流提供给Spark流,并将Spark流代码保存到适合您想要查询的Cassandra表中。
至于您提到的选项,很难说不知道查询的确切性质。将一个键放置到第二个键前可能是一个选项--这意味着每个分区大约有10K个条目,假设每个传感器的数据速率或1/s。每个传感器都有一个表可能很奇怪,但是每个传感器可能有一个分区,每个条目都有时间戳。这取决于您的查询。
也许,如果您给我们一个示例,说明您打算如何检索数据,我们可以提供更好的帮助?
发布于 2014-11-19 23:57:07
我怀疑最终您会希望通过传感器和时间来查询数据。您没有理由不使用两个表并将每个数据点写入两个表中。(Twitter将每条推文写入不同的表中,供每个跟踪Twitter的人使用!)
您可能会编写的一些表如下:
CREATE TABLE factory_status (
date timestamp,
hour int,
minute int,
second int,
sensor_status_map map<uuid, float>
PRIMARY KEY ((date, hour, minute, second))
)此表实质上每秒钟记录工厂中所有传感器的状态。每个分区将包含工厂的快照。这对于查询不太有用,因为您无法有效地获得一定的时间范围(每秒钟将是它自己的查询),但它在工厂进行分析和开发故障模型方面可能非常强大。
CREATE TABLE sensor_status (
sensor_id uuid,
date timestamp,
time timestamp,
sensor_val float,
PRIMARY KEY ((sensor_id, date), time)
)这个表基本上记录了每个传感器的输出。每个日期都是时间的截断版本。否则,传感器每秒钟输入一次就会很快超过卡桑德拉的列限。这将使在特定时间或一段时间内查询传感器的状态变得容易。
如果您在设计“从上到下”时遇到了困难,可以采取迭代的方法,在发现需要运行不符合旧查询模式的新查询时添加新表。
https://stackoverflow.com/questions/26991287
复制相似问题