每次更改某些设备的属性时,我都会收集事件日志。为此,我决定使用:
- Logstash - 我的代理 IoT 应用程序以 JSON 格式向其中发送日志,
- Elasticsearch - 用于存储数据(日志),
- Kibana - 用于数据可视化。
定期发送带有日志的 JSON,其格式如下:
{"deviceEventLogs":[{"date":"16:16:39 31-08-2016","locationName":"default","property":"on","device":"Lamp 1","value":"
false","roomName":"LivingRoom"}, ... ,]}
Elasticsearch 中单个事件条目的示例如下所示:
{
"_index": "logstash-2016.08.25",
"_type": "on",
"_id": "AVbDYQPq54WlAl_UD_yg",
"_score": 1,
"_source": {
"@version": "1",
"@timestamp": "2016-08-25T20:25:28.750Z",
"host": "127.0.0.1",
"headers": {
"request_method": "PUT",
"request_path": "/deviceEventLogs",
"request_uri": "/deviceEventLogs",
"http_version": "HTTP/1.1",
"content_type": "application/json",
"http_user_agent": "Java/1.8.0_91",
"http_host": "127.0.0.1:31311",
"http_accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2",
"http_connection": "keep-alive",
"content_length": "34861"
},
"date": "2016-08-08T14:48:11.000Z",
"device": "Lamp 1",
"property": "on",
"locationName": "default",
"roomName": "LivingRoom",
"value_boolean": true
}
}
我的目标是创建一个带有某种仪表板的网站,在合理的时间内显示分析的数据(几分钟应该是可以接受的),即:
- 显示能源消耗历史并预测特征中的消耗
- 检测能源消耗或其他因素(如灯光或暖气使用)的异常情况
- 根据某种不复杂的统计数据显示推荐,即“您可以将给定设备从位置 1 移动到位置 2,因为那里更需要它(比在其他地方更密集地使用)”等。
虽然最后一点非常简单——我可以在 Elasticsearch 中使用简单的查询或聚合,然后将其与某个阈值进行比较,但前两点需要深入分析,如机器学习或数据挖掘。
目前,该系统配备了大约 50 台设备,平均每 10 秒更新一次状态。未来设备的数量可以增加到 50,000 台。假设一个事件日志为 100 字节,它每年可以在 Elasticsearch 中产生大约 15 TB 的数据。
一般的问题是 - 这种系统的合理解决方案/技术/架构是什么?
- 将我的所有日志存储在 Elasticsearch 中是一个合理的开始吗?
- 我认为 es-hadoop 库使用 Elasticsearch 和 Apache Spark 能够使用 Spark 中的 Mlib 处理我的数据 - 这是一个合理的方向吗?
- 我是否可以只使用 Elasticsearch 将我的所有数据存储在其中并仅使用 Spark 和 Mlib 提供深入分析,还是应该考虑实施所谓的“Lambda 架构”,将 Elasticsearch 视为速度层?我对使用 Kafka、Apache Storm 的各种配置有些不满,但我不确定我是否需要它。由于该项目应在一个月内完成并且我是初学者,因此我担心复杂性,因此担心此类实施所需的时间。
- 如果数据负载小 10 倍(每年大约 1.5 TB)怎么办?你的答案会一样吗?