Odysseus Server - Der Kern

Der Kern von Odysseus stellt alle notwendigen Mechanismen bereit, um die eigentliche Datenverarbeitung durchführen zu können und wird durch weitere Komponenten, wie z.B. einer Nutzerverwaltung ergänzt.

Odysseus ist als mittlere Schicht in einer dreischichtigen Architektur zu sehen und arbeitet so zwischen den Datenquellen, die Ereignisse erzeugen und Anwendungen, die das Ergebnis verwenden. Hierbei kann die Anwendung z.B. die Daten nur über ein Dashboard visualisieren.

Über eine Anfrageschnittstelle (Query Interface) können Anwendungen die Verarbeitung in Form von Anfragen in verschiedenen Sprachen, wie StreamSQL (Erweiterung zu SQL) oder PQL (prozedural), beschreiben. Dies kann einerseits integriert über Java erfolgen oder aber auch über eine Webservice-Schnittstelle.

Die jeweilige Anfrage wird von Odysseus übersetzt (Translate), optimiert (Rewrite) und in einen ausführbaren Graphen überführt (Transform). Dieser ausführbare Graph - Anfrageplan genannt - besteht aus mehreren wiederverwendbaren und abgeschlossenen Operatoren. Dabei gibt es solche, die Verbindungen zu den Sensoren bzw. Datenquellen aufbauen (Source, Router) und solche, die die Ergebnisse an die Anwendung weiterleiten (Sink). Die Daten durchlaufen dann mehrere Operatoren (Pipe) von den Quellen bis zu den Senken, wobei jeder Operator eine bestimmte Funktion durchführt (z.B. Filterung, Aggregation etc.). Die Datenquellen schicken ihre Daten aktiv an Odysseus, so dass die Verarbeitung reaktiv bei Bedarf durchgeführt wird. Um auf unvorhersehbare Datenmengen überwacht der Plan Manager und der Scheduler die Ausführung, um so eine Überlast oder ein Verhungern zu vermeiden.

Odysseus ist so konstruiert, dass sowohl die einzelnen Schritte (Translate, Rewrite, Transform oder auch der Scheduler) als auch die Operatoren erweiterbar, austauschbar und anpassbar sind. Hierbei kann selbst das Datenformat, welches in der Standardkonfiguration als relationale Tupel umgesetzt wird, ausgetauscht werden und erlaubt dadurch bspw. auch die Verarbeitung von RDF, XML oder auch von JSON-Objekten.  Dazu ist Odysseus als OSGi-basierte Architektur umgesetzt und basiert aus mehr als 200 Komponenten, die jeweils wieder zu mehreren logisch abgeschlossenen Features zusammengefasst sind. Diese Features lassen sich über das integrierte Update-System leicht aktualisieren und auch nachinstallieren.

 

 

Beispiel für die Verwendung von Odysseus

Der klassische Einsatz von Odysseus kann mit einem Datenbanksystem verglichen werden. So stellt Odysseus an sich keine eigene Anwendung dar, sondern kann eher als Plattform für die Entwicklung vielfältiger Anwendungen verwendet werden.

Ähnlich wie auch bei einem Datenbanksystem gibt es verschiedene Abstraktionsebenen und wiederverwendbare Komponenten, die dadurch nicht nur Fehler in der Entwicklung minimieren, sondern den Entwicklungsaufwand erheblich senken. Dies schlägt sich natürlich positiv in den Kosten nieder! Der Einsatz von Odysseus bei der Entwicklung sei am folgenden Beispiel illustriert.

1. Installieren von Odysseus

Odysseus kann im Download-Bereich für verschiedene Betriebssysteme heruntergeladen werden. Die ausführbaren Dateien von Odysseus können direkt an beliebigen Orten entpackt werden und kommt dabei ohne eine Installationsroutine aus.

2. Zugriff und Steuerung von Odysseus

Der Entwickler kann über eine Webservice-Schnittstelle oder über das ebenfalls vorhandene Odysseus Studio auf Odysseus zugreifen. Die Steuerung erfolgt dann, wie auch bei einem Datenbanksystem über eine sogenannte Anfragesprache - ähnlich zu SQL, dem Standard in Datenbanksystemen. Dies Abstraktionsebene erlaubt dem Entwickler, die Verarbeitungsschritte in einer wesentlich einfacheren Weise auszudrücken.

Statt bspw. in Java aufwändig per Hand zu programmieren, wie Elemente bzw. Ereignisse entgegengenommen werden sollen und dann transformiert, gefiltert und anschließend aufsummiert werden sollen, kann dies durch eine kurze Anfrage ausgedrückt werden. Der Entwickler teilt über die Anfrage mit, dass die Daten transformiert, gefiltert und aufsummiert werden sollen, aber muss sich nicht darum kümmern, wie dies korrekt und effizient gemacht wird. Die Schritte, die häufig bei der Entwicklung von Anwendungen verwendet werden, werden im Folgenden betrachtet.

3. Verbindungen aufbauen

Zunächst müssen i.d.R. Verbindungen zu den Datenquellen und den Datensenken aufgebaut werden. Statt hierbei aufwändig ein Protokoll zu implementieren, kann hier auf Odysseus flexible Adapter-Schnittstelle zurückgegriffen werden. Werden die Daten bspw. über eine TCP-Verbindung im CSV-Format bereitgestellt, kann der Entwickler folgende Anfrage definieren:

CREATE STREAM exampleSource (id INTEGER, name STRING, value FLOAT)

    WRAPPER 'GenericPush'

    PROTOCOL 'CSV'

    TRANSPORT 'TCPClient'

    DATAHANDLER 'Tuple'

    OPTIONS ( 'port' '12345', 'host' 'odysseus.informatik.uni-oldenburg.de')

In diesem Fall wird eine TCP-Verbindung zum Host odysseus.informatik.uni-oldenburg.de auf Port 12345 gebaut. Die Daten werden dabei in das System "gepusht", sodass Odysseus reaktiv auf die Daten reagiert und die ankommenden CSV-Daten jeweils in ein Tupel der Form "(Integer, String, Float)" übersetzt. Der so angelegte Datenstrom steht Odysseus dann hier über den Namen exampleSource für weitere Verwendungen zur Verfügung. Mit CREATE SINK kann äquivalent eine Verbindung zu einer Senke aufgebaut werden.

Hierbei liefert Odysseus bereits einige Protokolle und Transportmechanismen, sodass diese bei Bedarf auch leicht gewechselt werden können. Auch das Hinzufügen neuer Protokolle oder Transportmechanismen ist durch Schnittstellen und der komponentenbasierten Architektur sogar zur Laufzeit möglich!

4. Anfrage und Verarbeitung definieren

Hat Odysseus die Verbindungen zu Datenquelle und Datensenke aufgebaut, kann der Entwickler die Verarbeitungsschritte definieren. Soll zum Beispiel der Datenstrom exampleSource so verarbeitet werden, dass der Wert von value mal 10 gerechnet wird, wenn die id über 100 ist, dann genügt folgende Anfrage, die an Odysseus gestellt werden kann:

SELECT value * 10 FROM exampleSource WHERE id > 100

Odysseus erzeugt aus dieser Anfrage einen sogenannten Anfrageplan, der u.a. die Operationen zur Umsetzung der obigen Anfrage in einzelne Operatoren kapselt. Dadurch wird einerseits ein hohes Maß an Wiederverwendbarkeit erreicht und andererseits erlaubt dies Optimierungen.

Durch mehrschichtige Optimierungsstrategien optimiert Odysseus die Anfrage (ohne Verlust von Genauigkeit und Informationen), um diese möglichst effizient ausführen zu können.

Odysseus führt dann die Anfrage aus, indem eine Verbindung zur Datenquelle aufgebaut wird und die Daten entgegengenommen werden. Die Daten durchlaufen dann den optimierten Anfrageplan, der die Daten entsprechend der obigen Anfrage u.a. transformiert und filtert. Die Ergebnisse werden der Anwendung wieder zur Verfügung gestellt, sodass der Entwickler diese entgegen nehmen kann.

Selbstverständlich kann Odysseus mit mehreren solcher Anfragen umgehen und führt dabei auch globale Optimierungsstrategien durch, um bspw. Gemeinsamkeiten zwischen mehreren Anfragen auszunutzen.

Während der Definition der Anfragen kann der Entwickler auf Odysseus Studio zurückgreifen. Odysseus Studio bietet neben einer Überwachung des Zustands von Odysseus auch einen integrierten Editor zur Formulierung von Anfragen an.

 

 

 

Komplexität beherrschen: Odysseus Script

Odysseus kann über Odysseus Script gesteuert werden, die in Projekten verwaltet werden können. Dazu können nicht nur bestimmte Parameter und Konfigurationen gesetzt werden, sondern auch Anfragen in beliebigen Anfragesprachen zusammenhängend formulieren und kombinieren.

So lassen sich bspw. die Strategien für Scheduler, Pufferplatzierung oder auch Planverteilung definieren. Des Weiteren kann auch die Anfrageverarbeitung konfiguriert werden, indem bspw. auf vordefinierte Konfigurationen zurückgegriffen wird,  oder bspw. die Optimierung durch Restrukturierung oder das Wiederverwenden von Anfragen explizit an- bzw. ausgeschaltet wird.

Zusätzliche Strukturen, wie Variablen, Schleifen oder If-Verweise erlauben dem Entwickler eine einfache Handhabung komplexer Anfragen. Auch das Wechseln zwischen Anfragesprachen ist Problemlos möglich. So kann bspw. die Datenquelle in CQL und die darauf aufbauende Anfrage anschließend in PQL definiert werden. Dies schließt auch die Erweiterung mit neuen Anfragesprachen ein.


Flexible Anfragen: PQL, CQL, ...

Viele Anfragen entsprechen der Semantik einer Datenbank-Anfrage. Aus diesem Grund bietet Odysseus die Anfragesprache StreamSQL/CQL an, die eine Erweiterung von SQL darstellt. Hier kann der Entwickler auf die gewohnte Syntax zurückgreifen.

Die Procedural Query Language (PQL) ist gesondert für Odysseus entwickelt worden, da deklarative Anfragen wie bspw. CQL nicht alle benötigten Anwendungsfälle abdecken könne. In Anlehnung an die Verschachtelung von Prozeduren entspricht ein Verarbeitungsschritt bzw. ein Operator einem Methodenaufruf. Dadurch kann mit PQL der Datenfluss genau vorgegeben werden. Des Weiteren erlaubt PQL auch die Integration beliebiger neuer Operatoren, die nicht durch den SQL-Standard abgedeckt werden.

Auch die Formulierung von komplexen Mustern, bei dem bspw. Werteverfäufe, Trends oder auch bestimmte Sequenzen von Ereignissen lassen sich über die Sprache SASE+ formulieren und können durch Odysseus erkannt werden, um dann ein neues Ereignis zu erzeugen.


Erweiterbar: Neue Operatoren

Durch die Implementierung einer einfachen Schnittstelle, bei dem im Wesentlichen nur die Methode zur Verarbeitung des Ereignisses implementiert werden muss, kann ein neuer Operator in Odysseus integriert werden. Das Operator Framework sorgt dann dafür, dass der Operator in die Anfrageverarbeitung eingebunden wird und dem Benutzer automatisch über PQL zur Verfügung steht. Durch das

Mehr dazu ist hier zu erfahren: Das Odysseus Operator Framework

 


Integrierbar: Anpassbare und Flexible Anbindung

Durch das Access Operator Framework stellt Odysseus eine flexible Möglichkeit bereit, um beliebige Übertragungsprotokolle wie TCP-Verbindungen, Dateien oder serielle Schnittstellen mit beliebigen Datenformaten wie XML, CSV, HTML, JSON oder Byte-basierte Formate zu kombinieren. Des Weiteren kann Odysseus verschiedene Mechanismen verwenden, um die Daten aktiv abzufragen oder auf eingehende Daten zu reagieren.

Obwohl dadurch bereits ein sehr hohes Maß an Flexibilität gewährleistet wird, sind auch spezielle Zugriffe, z.B. die Anbindung an Social Networks wie Twitter oder Facebook, möglich. Das Framework erlaubt es auch, neue Protokolle oder Übertragungsmechanismen hinzuzufügen, sodass bspw. auch proprietäre Protokolle spezieller Sensoren jederzeit nachträglich eingebunden werden können. 

Weitere Informationen gibt es hier zum Odysseus Operator Framework


Big Data: Scale-up & Scale-out

Odysseus ist auf die Verarbeitung großer Datenmengen ausgelegt. Als Beispiel kann Odysseus bereits auf einem handelsüblichen PC mit Intel Core i5 Prozessor mit 2,5 GHz und 8 GB Hauptspeicher bereits mehrere Hunderttausend Ereignisse pro Sekunde auswerten und über 30.000 Anfragen mit über 1.000.000 Verarbeitungsschritten bzw. Operatoren ausführen. Anzumerken ist jedoch, dass sowohl die Verarbeitungsgeschwindigkeit als auch die Häufigkeit der Ergebnisproduktion jedoch stark von den Datenquellen und  der Anfrage abhängt, die der Entwickler definiert!

Reicht eine Instanz von Odysseus nicht aus, kann Odysseus auch als verteilte Anwendung ausgeführt werden, indem die Anfragen selbstständig oder manuell in einem Netzwerk verteilt werden können. Hierbei greift Odysseus auch auf moderne Cloud Computing Technologien zurück.