database - 指标收集和分析架构
问题描述
我们正在开发支持 HomeKit 的物联网设备。HomeKit 是为消费者使用而设计的,不具备收集指标(功率、温度等)的能力,因此我们需要单独实现它。
假设我们有 10 000 台设备。他们每 5 秒发送一组指标。所以每秒我们需要接收 10000/5=2000 个集合。最终用户需要查看指定时间段(1 周、月、年等)内每个指标的图表。因此,系统每天将收到 1.728 亿条记录。这里有很多问题。
首先,不需要存储所有数据,因为用户只需要指定时间段的图表,所以需要一些聚合。什么数据库解决方案适合它?我相信没有 RDMS 可以处理如此大量的数据。那么,如何获取指标的平均数据来呈现给最终用户呢?
非常简化,我是这样想的:
- 设备使用 HTTP API 将数据直接推送到 DynamoDB
- 指标每 24 小时存储在一张表中
- 一天结束时,一些程序在 Elastic Map Reduce 上运行,并生成准备好的 JSON 文件,其中包含显示每个时间段的图表所需的数据。
- 旧表存储在 RedShift 中以供进一步应用。
以前有人做过类似的事情吗?也许有更简单的架构?
解决方案
这需要大数据基础设施,例如 1) Hadoop 集群 2) Spark 3) HDFS 4) HBase
您可以使用 Spark 将数据作为流读取。流过的数据可以存储在 HDFS 文件系统中,允许您跨 Hadoop 集群存储大文件。您可以使用 map reduce 算法从 HDFS 获取所需的数据集并存储在 HBase 中,即 Hadoop 数据库。HDFS 是分布式、可扩展的大数据存储,用于存储记录。最后可以使用查询工具查询hbase。
物联网数据 --> Spark --> HDFS --> Map/Reduce --> HBase --> 查询Hbase。
我建议这种架构的原因是为了 可扩展性。输入数据可以根据物联网设备的数量增长。在上述架构中,基础设施是分布式的,集群中的节点可以无限增长。
这是大数据分析应用程序中经过验证的架构。
推荐阅读
- c# - 对 T 类型的可观察集合进行排序,其中 T 将在运行时更改(泛型)
- node.js - nodejs在普通函数中调用生成器函数
- r - 如何扩展包含带有列表的列的 data.frame
- google-chrome-devtools - 谷歌浏览器颜色选择器没有响应
- angularjs - 在后端和前端之间共享 Application.conf
- action - 意大利语版 Google Trivia 上的操作
- php - 如何覆盖 laragon 中的 php.ini 文件设置?
- mule - 骡子“这个变压器需要一个有效的端点”错误只在运行时而不是在工作室
- java - java - 如何在不使用字符串日期的情况下在java 8中将LocalDate从一种格式转换为另一种LocalDate格式?
- mongodb - Kubernetes pod 连接到 MongoDB Atlas 问题