Szenarien für den Einsatz von IoT und BigData: Visualsierung von großen Datenmengen (Teil 6)
Im Teil 5 dieser Blog-Post Serie wurde auf die Visualisierung von Sensordaten mit Hilfe der JavaScript-Bibliothek D3.jseingegangen. In diesem Teil möchte ich nun auf den Umgang mit großen Datenmengen am Beispiel der erfassten Wetterdaten eingehen.
Als Ziel sollen alle bisher aufgezeichneten Messdaten in einem Liniendiagramm dargestellt werden. Das Diagramm soll auch bei großen Datenmengen vergleichbar rasch verfügbar sein. Zum Erstellen der Grafiken kommt wiederum die auf D3.js basierende Bibliothek Rickshaw zum Einsatz. Als Beispiel eines solchen Diagramms werden die bisher aufgezeichneten Messpunkte der Außentemperatur dargestellt.
Mit der folgenden Query ist eine Ermittlung und Aufbereitung aller Messpunkte der Außentemperatur für die Grafik möglich. Es wird hierzu wie im letzten Teil dieser Serie schon gezeigt, die "Date Histogramm" Aggregation verwendet.
client.search({
index: 'sensorraspberry',
size: 0,
body: {
// Begin query.
"query":{
"bool" : {
"must" : [
{
"term": {
"type": "outdoor"
}
},
{
"range" : {
"created" : {
"gte": "now-1y"
}
}
}
]
}
},
"aggs" : {
"temp_over_time" : {
"date_histogram" : {
"field" : "created",
"interval" : "1m"
},
"aggs" : {
"temp" : { "avg" : { "field" : "temperature" } }
}
}
}
// End query.
}
Das Laden dieser Grafik benötigt aufgrund der Größe der Daten relativ lange. Des Weiteren sieht die Darstellung "kantig" aus, da jeder einzelne Messwert aufgeführt wird. Bei Ansichten über längere Zeiträume sind gemittelte Werte für die Visualisierung ausreichend. Hierdurch ist ein rascheres Laden der Daten und eine ansprechendere Darstellung möglich. Es werden nun über 12h-Intervalle gemittelte Werte angezeigt. Dies ermöglicht die Änderung des Intervalls für die Aggregation.
"aggs" : {
"temp_over_time" : {
"date_histogram" : {
"field" : "created",
"interval" : "12h"
},
"aggs" : {
"temp" : { "avg" : { "field" : "temperature" } }
}
}
}
Interesse besteht natürlich nicht nur an gemittelten Werten, sondern auch an den einzelnen Messwerten. Aus diesem Grund ist beim Hineinzoomen das Anzeigen von exakteren Werten notwendig. Das Hineinzoomen in die Grafik wird über die bereits durch Rickshaw mitgelieferte Scrollbar realisiert.
Der angezeigte Zeitbereich kann über Graph.window.xMin bzw. Graph.window.xMax abgefragt werden. Ist die Zeitspanne kleiner als ein definiertes Intervall, z.B. ein Monat, wird die Query angepasst. In diesem Zeitbereich kann beispielsweise über eine Stunde gemittelt werden. Die zurück gelieferten Messwerte werden in ein Datenarray hineingeschrieben und nach Zeitstempel sortiert. Danach erfolgt die Aktualisierung der Grafik mit graph.update().
Als Ergebnis erhält man folgendes Liniendiagramm. Es lassen sich beliebig viele Auflösungsstufen einbauen und somit können auch einzelne Messwerte bei detaillierten Hineinzoomen angezeigt werden.
Wird ein Ausschnitt gewählt, der wieder größer als ein Monat ist, wird das Array auf die ursprünglichen Daten zurückgesetzt. Hierdurch erreicht man, dass das Datenarray stets eine begrenzte Anzahl an Messpunkten aufweist. Ein schnelles Laden der Grafik ist damit möglich.
Durch das schnelle Laden können Dashboards gebaut werden, die mehrere Grafiken zur Langzeitanalyse enthalten und trotzdem rasch aufgebaut werden.
Fazit zum gewählten Ansatz
Die Serie gliedert sich folgendermaßen: