デバイスのプロパティが変更されるたびにイベント ログを収集しています。この目的のために、私は使用することにしました:
- 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
}
}
私の目標は、分析されたデータを適切な時間 (数分で許容できるはずです) で表示する、ある種のダッシュボードを備えた Web サイトを作成することです。
- エネルギー消費の履歴を表示し、機能で消費を予測する
- エネルギー消費の異常、または照明や暖房の使用などのその他の要因の検出
- 洗練されていないある種の統計に基づいて推奨事項を表示します。つまり、「特定のデバイスを場所 1 から場所 2 に移動できます。場所 1 でより必要とされている (他の場所よりも集中的に使用されているため)」などです。
最後のポイントは非常に些細なことですが、Elasticsearch で単純なクエリまたは集計を使用して、しきい値と比較できますが、最初の 2 つのポイントでは、機械学習やデータ マイニングなどの詳細な分析が必要です。
今のところ、システムには平均 10 秒ごとにステータスを更新する約 50 のデバイスが装備されています。将来的には、デバイスの数は 50,000 まで増加する可能性があります。1 つのイベント ログに 100 バイトを想定すると、Elasticsearch では年間約 15 テラバイトのデータにつながる可能性があります。
一般的な質問は、そのようなシステムの合理的なソリューション/テクノロジー/アーキテクチャーとは何でしょうか?
- すべてのログを Elasticsearch に保存することは妥当なスタートですか?
- 私は es-hadoop ライブラリが Elasticsearch を Apache Spark と一緒に使用して、Spark で Mlib を使用してデータを処理できるようにすることを検討しています - それは妥当な方向性ですか?
- Elasticsearch のみを使用してすべてのデータを格納し、Spark と Mlib のみを使用して詳細な分析を提供できますか? それとも、Elasticsearch をスピード レイヤーとして扱う、いわゆる「ラムダ アーキテクチャ」の実装を検討する必要がありますか? Kafka、Apache Storm が使用されたさまざまな構成について少し赤字にしましたが、それが必要かどうかはよくわかりません。プロジェクトは 1 か月以内に完了する必要があり、私は初心者なので、複雑さと実装に必要な時間が心配です。
- データ負荷が 10 分の 1 になるとしたら (年間約 1.5 テラバイト)、答えは同じでしょうか?