Azure Stream Analytics – Ein Erfahrungsbericht
Was bietet “Azure Stream Analytics”?
Produktionsanlagen, Fitness-Tracker, Haushaltgeräte und viele weiter Geräte liefern heute unentwegt Daten in die Cloud, welche oft in “Echtzeit” verarbeitet werden sollen.
Je nach Anwendungsfall kann Azure Stream Analytics kurz ASA hier gute Dienste leisten.
In meinen Projekten hat sich Azure Stream Analytics vor allem für folgende Aufgaben bewährt:
- Aggregieren von Daten über Zeitfensters: Azure Stream Analytics eignet sich gerade dann, wenn Meldungen eines Gerätes über Zeitfensters aggregiert werden sollen, um zum Beispiel stündliche Werte zu erfassen.
- Vergleichen von Daten mit Referenzwerten: Dies wird zum Beispiel benötigt, um die Meldungen auf Grenzwerte hin zu prüfen und Notifikationen zu versenden.
Azure Stream Analytics ist allerdings nicht die richtige Technologie, wenn folgende Randbedingungen bestehen:
- Referenzwerte ändern sich schnell: Mit der aktuellen Version von Azure Stream Analytics werden Refernzwerte aus JSON- oder CSV-Dateien eingelesen. Die Dateien enthalten im Pfad das Datum (yyyy-MM-dd) und die Uhrzeit (HH-mm) ab dem die Refernzwerte angewendet werden sollen. Dies schränkt Azure Stream Analytics auf Anwendungsfälle ein, die nicht öfters als jede Minute neue Refernzwerte benötigen.
- Mehr als 5 Outputs: Azure Stream Analytics ist aktuell auf fünf Outputs begrenzt. Gerade wenn man Lösungen bauen will, die Daten unterschiedlich aufbereiteen oder unterschiedlich granular aggregiert in unterschiedlichen Collections speichern will, gerät man mit Azure Stream Analytics schon mal an die Grenze von fünf Outputs.
Grundsätzlicher Aufbau
Ein Azure Stream Analytics Job ist im wesentlichen ein Query in SQL-naher Sprache, welcher in der FROM-Klausel aus dem Data Stream Input liest, diesen im Query verarbeitet und die Resultate in den Output unter der INTO-Klausel schreibt.
Es können mehrer Queries in unterschiedliche Outputs schreiben.
Mittels WITH-Statement können Queries verschachtelt werden.
Inputs
Data Stream Inputs
Jeder Stream Analytics Job hat genau einen Data Stream Input.
Dieser kann von Daten aus folgenden Quellen einlesen:
- IoT-Hub
- Event-Hub
- Blob-Storage
Wie der Name schon sagt, liefert Data Stream Inputs, den zu verarbeitenden Stream.
Die folgende Abbildung zeigt den Dialog um einen Stream Input zu erstellen. Das Event Serialization format ist hier eine häufige Ursache von Problemen. In unterschiedlichen Projekten war immer wieder die Idee CSV zu verwenden, um Traffic vom Device in die Cloud zu sparen. Die Erfahrung hat aber gezeigt, dass man mit JSON wesentlich stabilere und wartbarere Lösungen hinbekommt. Bei CSV sah ich oft Probleme mit den Headern und mit den Zeichen zur Separierung der Einträge und der Zeilen.
Reference Data Inputs
Input für Refernzwerte lassen sich fast Analog erstellen. Wie das geht, zeigt das Bild unten.
Refernzwerte liegen immer als Datei auf einem Blob-Storage, dessen Account man hier konfiguriert.
Auch hier empfehle ich, die Referenzdaten als JSON-File zu speichern, um den gleichen Probleme mit CSV, wie bereits beits oben beschrieben, aus dem Weg zu gehen.
Ein wesentlicher Punkt ist hier das Path pattern. Es enthält ein Muster für den Pfad des Blob-Files. Dieser kann die Platzhalter {date} und {time} enthalten, welche durch das unter Date format und Time format definierte Muster ersetzt werden.
Liegt also im Beispiel unten eine Datei mit dem Pfad
2017-11-27/20-15/threshold.json
im Blob vor, wird Stream Analytics die Datei für Events ab diesem Zeitpunkt anwenden, bis es eine Datei mit einem neueren Zeitstempel im Pfad findet. Wichtig ist zu beachten, dass dies auch zur Anwendung kommt, wenn der Job gestoppt wurde und Events über eine gewisse Zeit gepuffert wurden und man den Job mit der Option Continue when last stopped wieder startet.
Dies zeigt auch die Einschränkung, dass Referenzwerte maximal im Minutentakt ändern können. Wieso, dass Sinn macht, habe ich früher bereits in Projekten gesehen, in denen versucht wurde mit .NET und SQL-Server basierten Applikationen etwas analoges wie Stream Analytics zu bauen und den Fehler machte, für jeden Event im Stream eine Datenbankabfrage nach den passenden Referenzwerten ausführte. Dies resultierte gezwungenermassen darin, dass der Datenbankzugriff zum Flaschenhals wurde und alles ausbremste.
Benötigt man aktuellere Refernzwerte als jede Minute, dann kann man zum Beispiel auf eine Azure Service Fabric basierte Lösung ausweichen, in welcher mittels Reliable Collections oder einem verteilten Cache die Refernzwerte allen Instanzen des Services sofort zur Verfügung stehen.
Outputs
Die Konfiguration der Outputs funktioniert recht ähnlich wie die der Inputs.
Am häufigsten habe ich bisher folgende Outputs benutzt:
- CosmosDB (DocumentDB)
- Azure SQL DB
- Event Hubs
- Blob
Wichtig ist hier, dass man sich bewusst ist, dass maximal 5 Outputs möglich sind.
ComsosDB
Jeder Output hat seine Eigenheiten. So ist es bei CosmosDB z.B. möglich, Datensätze zu aktualisieren, indem ein Datensatz mit einem neuen mit der gleichen ID überschrieben wird. Dies hat insbesondere den Vorteil, dass man damit eine Collection mit den letzten Werten befüllen kann. Dies ist für Dashboard Anwendungen oft nützlich. Das ganze wird als upsert bezeichnet. Die Erfahrung hat ausserdem gezeigt, dass bei Collection, deren Name weniger als 5 Zeichen lang ist, manchmal seltsame Probleme auftreten und der Output sich weigert, in die Collection zu schreiben. Bei längeren Namen, besteht das Problem jedoch nicht.
Azure SQL DB
Hier sind upserts leider nicht möglich. Ich habe diese Einschränkung mittels Insert/Update-Triggers auf der Tabelle in der Azure SQL DB realisiert.
Event Hubs
Gerade wenn anschliessend die Meldungen noch weiterverarbeitet werden sollen, eignen sich Event-Hubs-Outputs Daten an Azure Functions oder Web-Jobs weiterzuleiten. Ich habe das zum Beispiel verwendet um Push-Notifikationen via Notification Hubs zu versenden.
Blob
Blob-Storage Outputs eignen sich besonders gut zum Speichern von Debug-Logs aus dem Stream Analytics Job, da sie günstig sind und sich die JSON-Files gut durchsuchen lassen.
Fazit
Azure Stream Analytics ist ein tolles Werkzeug zur Verarbeitung von Datenströmen. Es bietet viel Unterstützung, wenn man Daten über Zeitfenster aggregieren will.
Aber auch Azure Stream Analytics ist nicht das Wundermittel für alle Lösungen und man sollte daher vor demEinsatz gut abklären, was die Randbedingungen sind.
Dieser Artikel wurde zuerst auf https://bitweber.ch veröffentlicht.