UNIVERSITÄT DUISBURG-ESSEN FAKULTÄT FÜR INGENIEURWISSENSCHAFTEN ABTEILUNG INFORMATIK UND ANGEWANDTE KOGNITIONSWISSENSCHAFT Masterarbeit Re-Engineering eines Rahmensystems für Multiagentensysteme zur Datenanalyse Stefan Remberg Matrikelnummer: Abteilung Informatik und angewandte Kognitionswissenschaft Fakultät für Ingenieurwissenschaften Universität Duisburg-Essen 31. Januar 2016 Betreuer: Prof. Dr. H. U. Hoppe Dipl.-Math. Tilman Göhnert Inhaltsverzeichnis 1. Einleitung 1.1. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Aufbau der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Grundlagen 2.1. Multiagentensysteme . . . . . . . . . . . 2.2. Verwandte Arbeiten . . . . . . . . . . . 2.2.1. Network Workbench . . . . . . . 2.2.2. GATE . . . . . . . . . . . . . . . 2.2.3. UIMA . . . . . . . . . . . . . . . 2.3. Architekturen und Entwurfsmuster . . . 2.3.1. Blackboard-Architektur . . . . . 2.3.2. Publisher/Subscriber-Architektur 2.3.3. Pipes and Filters . . . . . . . . . 2.3.4. Abstrakte Fabrik . . . . . . . . . 2.4. SQLSpaces . . . . . . . . . . . . . . . . 2.5. Analytics Workbench . . . . . . . . . . . 2.5.1. Architektur . . . . . . . . . . . . 2.5.2. Ablauf eines Workflows . . . . . 2.5.3. Kommunikation . . . . . . . . . 2.5.4. Framework . . . . . . . . . . . . 2.5.5. Probleme . . . . . . . . . . . . . 2.6. Nachrichtenaustausch und Speicher . . . 2.6.1. MQTT . . . . . . . . . . . . . . 2.6.2. PostgreSQL . . . . . . . . . . . . 2.6.3. FTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Ansatz 3.1. Anforderungsanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1. Problemstellung . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2. Kommunikation . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.3. Aufbau des Frameworks . . . . . . . . . . . . . . . . . . . . . 3.1.4. Anforderungen . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Aufbau des Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1. Verbindungen und Kommunikation . . . . . . . . . . . . . . . 3.2.1.1. Anzahl der Verbindungen . . . . . . . . . . . . . . . 3.2.1.2. Nachrichten- und Datenaustausch . . . . . . . . . . 3.2.1.3. Datenaustauschformat und Nachrichtenspezifikation 3.2.2. Struktur des Agenten-Frameworks . . . . . . . . . . . . . . . 3.2.2.1. AgentManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 2 . . . . . . . . . . . . . . . . . . . . . 3 3 4 4 5 6 7 7 8 10 11 12 13 14 14 15 16 17 18 18 19 20 . . . . . . . . . . . . 23 23 23 23 24 25 27 27 27 29 30 32 33 iii Inhaltsverzeichnis 3.2.2.2. Agent . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2.3. Executor, Verbindungsverwaltung und Konfiguration 3.2.3. Node.js-Serverkomponente . . . . . . . . . . . . . . . . . . . . . 3.2.3.1. Verbindungen und Konfiguration . . . . . . . . . . . . 3.2.3.2. Erkennen von aktiven Analysekomponenten . . . . . . 3.2.3.3. Sammeln von Resultaten . . . . . . . . . . . . . . . . 3.3. Kommunikation innerhalb des Frameworks - konkrete Ansätze . . . . 3.3.1. Nachrichtenaustausch . . . . . . . . . . . . . . . . . . . . . . . 3.3.1.1. MQTT . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1.2. PostgresSQL . . . . . . . . . . . . . . . . . . . . . . . 3.3.2. Datenspeicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.2.1. FTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.2.2. PostgreSQL als Speicher für binäre Daten . . . . . . . 3.3.3. Sitzungsübergreifende Persistenz . . . . . . . . . . . . . . . . . 3.3.3.1. SQLSpaces . . . . . . . . . . . . . . . . . . . . . . . . 3.3.3.2. PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 37 39 39 39 40 41 41 41 43 44 44 46 46 47 47 4. Implementierung 4.1. Verwendete Bibliotheken . . . . . . . . . . . . . . . . . . 4.2. Status und Resultate eines Analyseworkflows . . . . . . 4.2.1. Überführen eines Analyseworkflows in eine Liste 4.2.2. Abarbeiten der Analysemodule und Resultate . . 4.3. PostgreSQL: Datenbank Initialisierung und Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 49 51 51 52 53 5. Anwendungsbeispiel 5.1. Analysesystem . . . . . . . . . . . . . . . . . . . . . . 5.2. Beispielanalyse im Rahmen des KOLEGEA Projektes 5.2.1. Analysedaten . . . . . . . . . . . . . . . . . . . 5.2.2. Analyseworkflow . . . . . . . . . . . . . . . . . 5.2.3. Ergebnisse . . . . . . . . . . . . . . . . . . . . . 5.3. Performancetest . . . . . . . . . . . . . . . . . . . . . . 5.3.1. Analyseworkflow und Testdaten . . . . . . . . . 5.3.2. Durchführung . . . . . . . . . . . . . . . . . . . 5.3.3. Ergebnisse . . . . . . . . . . . . . . . . . . . . . 5.4. Auswertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 55 55 56 56 57 58 58 59 59 60 . . . . . . . . . . 6. Zusammenfassung und Ausblick 63 6.1. Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 6.2. Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 A. Eidesstattliche Erklärung 65 B. Datenträger 67 Literaturverzeichnis 69 iv Abbildungsverzeichnis 2.1. 2.2. 2.3. 2.4. 2.5. 2.6. 2.7. 2.8. 2.9. . . . . . . . . . . . . . . . . . . 5 6 7 9 10 11 13 14 21 Verbindungen pro Manager und Agenteninstanzen . . . . . . . . . . . . Verbindungen pro Analysekomponente . . . . . . . . . . . . . . . . . . . Verbindungen pro Agenten-Gruppe . . . . . . . . . . . . . . . . . . . . . Architekturübersicht mit neuem Kommunikationsmodell . . . . . . . . . Vereinfachte Darstellung des Vererbungsmodells von Agent und AgentManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6. Klassendiagramm des AgentManagers (getter und setter-Methoden nicht in Darstellung) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7. Klassendiagramm des Agenten (getter und setter-Methoden sowie Hilfsmethoden nicht in Darstellung) . . . . . . . . . . . . . . . . . . . . . . . 3.8. Verbindungsverwaltung als abstrakte Fabrik . . . . . . . . . . . . . . . . 3.9. Analyseworkflow als Graph . . . . . . . . . . . . . . . . . . . . . . . . . 3.10. MQTTMessageConnection Klassendiagramm . . . . . . . . . . . . . . . 3.11. Listen/Notify-Mechanismus . . . . . . . . . . . . . . . . . . . . . . . . . 3.12. PostgresMessageConnection Klassendiagramm . . . . . . . . . . . . . . . 3.13. FTPDataConnection Klassendiagramm . . . . . . . . . . . . . . . . . . 3.14. PostgresDataConnection Klassendiagramm . . . . . . . . . . . . . . . . . . . . 27 28 29 30 3.1. 3.2. 3.3. 3.4. 3.5. Benutzeroberfläche der Network Workbench) . . . . . . . . . . . Text und Annonation (entnommen aus[Grishman, 1997]) . . . . Ablauf einer Analyse in UIMA . . . . . . . . . . . . . . . . . . . Ablauf Publisher/Subscriber Pattern . . . . . . . . . . . . . . . . Beispiel Pipes and Filters . . . . . . . . . . . . . . . . . . . . . . Abstrakte Fabrik (entnommen aus [Gamma et al., 1995]) . . . . Grafische Oberfläche der Analytics Workbench . . . . . . . . . . Architektur der Analytics Workbench . . . . . . . . . . . . . . . FTP-Architektur (angelehnt an [Postel und Reynolds, 1985]) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 . 34 . . . . . . . . 36 38 40 42 43 44 45 46 5.1. KOLEGEA Analyseworkflow . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.2. Ergebnis der Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3. Ausschnitt des Analyseworkflows zur Performanceanalyse . . . . . . . . . 59 v 1. Einleitung 1.1. Motivation Multiagentensysteme finden in verschiedenen Szenarien Anwendung, beispielsweise bei Robotersystemen, Sensornetzwerken, verteilten Systemen oder bei der Gestaltung komplexer Softwaresysteme. Sie bestehen aus einer Menge von autonomen, miteinander agierenden Agenten, von denen jeder eine bestimmte Aufgabe übernehmen kann. Dies bietet eine Reduktion der Komplexität eines Systems [Jennings, 2001] sowie ein erhöhtes Maß an Flexibilität und Wiederverwendbarkeit, d.h. einzelne Agenten können hinzugefügt, wiederverwendet, entfernt oder ausgetauscht werden. Anwendung findet dieser Ansatz unter anderem in dem Analysesystem Analytics Workbench, einem Werkzeug zur Analyse verschiedener Daten. Hier werden verschiedene Analyseaufgaben von einzelnen Agenten übernommen, ein flexibles Hinzufügen von neuen Analysekomponenten, sprich Agenten, ist möglich. Ein weiterer Vorteil, den der Multiagentenansatz in diesem Analysesystem bietet, ist die Möglichkeit der Sprachheterogenität. Dies bedeutet, dass nicht alle Analysekomponenten in der selben Programmiersprache realisiert werden müssen, da nicht jede Sprache für jeden Analyseschritt gleich gut geeignet ist. Beispielsweise eignen sich für Textanalysen besonders die Bibliotheken der Programmiersprache Python, für allgemeinere Aufgaben eher die Programmiersprache Java. Durch den Einsatz in Forschungsprojekten haben sich die Anforderungen an die Analytics Workbench verändert. Analysen sollen mit großen Datenmengen durchführbar sein. Außerdem soll das System skalierbar sein und auch eine Vielzahl von Analysekomponenten unterstützen. Diese beiden Anforderungen sind mit dem bisherigen Framework, insbesondere mit der bisherigen Kommunikationsinfrastruktur, nicht zu erfüllen. Analysedaten können lediglich bis zu einer Größe von 4 Megabyte verarbeitet werden. Dadurch sind Analysen auf großen Datensätzen nicht möglich. Auch führt eine erhöhte Belastung der Kommunikationsinfrastruktur durch eine Vielzahl von Analysekomponenten zu einem fehlerhaften Systemzustand. 1.2. Aufgabenstellung In dieser Abschlussarbeit soll ein Framework für Analysesysteme auf Multiagentenbasis entwickelt werden. Dazu soll das bisherige Framework der Analytics Workbench als Ausgangsbasis genommen werden. Das neu gestaltete Framework soll die ursprünglichen Anforderungen der losen Kopplung der Agenten sowie der Sprachheterogenität erfüllen. Des Weiteren sind folgende Anforderungen zu erfüllen: 1 1. Einleitung • Es muss ein geeignetes Kommunikations- und Datenaustauschmodell gefunden werden. Besonders der Austausch von größeren Datenmengen soll unterstützt werden. Gleichzeitig soll das System auch bei einer großen Anzahl an Agenten performant und stabil bleiben. • Es müssen Kommunikationskanäle gefunden werden, die die Anforderungen an das Kommunikations- bzw. Datenmodell erfüllen. • Die Kommunikationskanäle sollen austauschbar sein und je nach Anwendungsfall konfiguriert werden können, um ein höchstes Maß an Flexibilität zu garantieren. • Um die Funktionalität des entworfenen Konzepts zu belegen, soll ein Beispielsystem auf Basis der Analytics Workbench erstellt und demonstriert werden. 1.3. Aufbau der Arbeit Im nachfolgenden Kapitel zwei werden die für diese Arbeit benötigten Grundlagen vorgestellt. Darunter fällt eine Definition von Agenten und Multiagentensystemen, die Vorstellung verwandter Arbeiten sowie eine Übersicht über Architektur- und Entwurfsmuster, eine genaue Beschreibung der Analytics Workbench und eine Übersicht über Protokolle bzw. Technologien zur Nachrichtenübertragung und Persistenz. Kapitel drei dokumentiert die Anforderungen an das zu entwickelnde Framework und beschreibt die Entscheidungsfindung bei der Gestaltung des Systems. Das vierte Kapitel enthält in Auszügen die technische Realisierung des in Kapitel drei beschriebenen Konzepts. Ein Anwendungsbeispiel, das die Tragfähigkeit des Konzeptes belegt, wird in Kapitel fünf vorgestellt. Das letzte Kapitel bietet eine Zusammenfassung über diese Arbeit und einen Ausblick über potentielle Weiterentwicklungsmöglichkeiten. 2 2. Grundlagen In diesem Kapitel werden alle für diese Arbeit benötigten Grundlagen vorgestellt. Hierzu gehört eine Definition und Charakterisierung von Multiagentensystemen in Abschnitt 2.1 sowie ein Einblick in verwandte Arbeiten in Abschnitt 2.2. Abschnitt 2.3 erläutert die Architekturmuster Blackboard und Publisher/Subscriber als auch die Entwurfsmuster Pipes and Filters und Abstrakte Fabrik. Die Abschnitte 2.4 und 2.5 beschäftigen sich mit den SQLSpaces und einer detaillierten Beschreibung des Analysesystems Analytics Workbench. Ein Überblick über MQTT, PostgreSQL und FTP schließt diese Kapitel ab. 2.1. Multiagentensysteme In dieser Arbeit soll das Rahmensystem für ein Multiagentensystem einem Re-Engineering unterzogen werden. Daher ist es sinnvoll, zunächst den Begriff Multiagentensystem genauer zu definieren und zu beschreiben. Wie der Name bereits suggeriert, besteht ein Multiagentensystem aus mehreren Agenten. Die Definition eines Agenten ist in der Literatur nicht eindeutig. Stattdessen werden Charakteristika verwendet, die die Beschaffenheit eines Agenten beschreiben. [Wooldridge, 1997] verwendet hierzu folgende Eigenschaften: • Sozial. Agenten können miteinander kommunizieren und sich an kooperativen Prozessen beteiligen, wie z.B. an Problemlösungsprozessen. • Pro-Aktiv. Agenten reagieren nicht nur auf ihre Umgebung, sie können auch aktiv einen Prozess initiieren. • Autonom. Agenten sind unabhängig von anderen Agenten. Sie haben ihren eigenen Zustand und können diesen ohne Einwirkung von Außen verändern. • Reaktiv. Agenten kennen die Umgebung, in der sie sich befinden. Des Weiteren können sie Änderungen an dieser Umgebung feststellen und entsprechend reagieren. Setzt man bei der Systemgestaltung auf einen Agenten-basierenden Ansatz, reicht ein Agent zur Lösung des Gesamtproblems meist nicht aus. Stattdessen verwendet man ein Multiagentensystem, bestehend aus mehreren, autonomen Agenten [Jennings, 2001]. Diese unterstützen den Entwickler nach [Jennings, 2000] bei der Gestaltung komplexer Systeme durch Dekomposition, Abstraktion und Organisation, welches wichtige Konzepte zur Vereinfachung und Komplexitätsreduktion sind. Durch die Dekomposition wird ein Problem durch die Aufteilung in kleinere Unterproblem vereinfacht. Abstraktion beschränkt ein Problem auf die wesentlichen Punkte und Organisation beschreibt die Zusammenhänge zwischen verschiedenen Komponenten [Jennings, 2000]. Bei der Gestaltung eines Multiagentensystems stellt sich für den Entwickler vor allem 3 2. Grundlagen das Problem, wie die Agenten miteinander kommunizieren. [Schumacher, 2001] stellt dazu vier Kommunikationsparadigma vor: die Broadcast-, die Gruppen-, die Peer-ToPeer- und die Generative-Kommunikation. Im Broadcast-Kommunikationsmodell sendet ein Agent eine Nachricht, die alle anderen Agenten in der Umgebung des Agenten erhalten. Etwas eingeschränkter ist der Nachrichtenversand bei der Gruppen-Kommunikation. Hier erhält lediglich eine Gruppe von Agenten die gesendete Nachricht. Fällt die Entscheidung auf das Peer-To-Peer-Kommunikationsmodell, sind die Agenten zum Nachrichtenaustausch direkt miteinander verbunden. Dies ist nur möglich, wenn die Agenten eindeutig identifizierbar sind [Schumacher, 2001]. Eine Besonderheit ist das GenerativeKommunikationsparadigma. Hier verläuft der komplette Nachrichtenaustausch über ein Blackboard (s. 2.3.1). Agenten können eigene Nachrichten auf dem Blackboard persistieren und Nachrichten von anderen Agenten aus dem Blackboard lesen. Auf diese Art und Weise sind die Agenten komplett voneinander entkoppelt [Schumacher, 2001]. Neben einem geeigneten Kommunikationsparadigma muss ein Austauschformat bzw. eine ”Agenten-Sprache” festgelegt werden. Bekannte ”Agenten-Sprachen” zum Austausch von Informationen zwischen Agenten sind FIPA-ACL 1 [Fipa, 2002] und KQML 2 [Finin et al., 1994]. 2.2. Verwandte Arbeiten In diesem Abschnitt werden verwandte Arbeiten vorgestellt. Hierzu gehört das Analysetool Network Workbench sowie GATE und Apache UIMA. 2.2.1. Network Workbench Die Network Workbench ist ein Tool zur Analyse von Netzwerken aus verschiedenen Forschungsgebieten, wie beispielsweise aus der Informatik, der Biologie oder der Sozialwissenschaft [Herr et al., 2006]. Sie bietet zur Analyse von Netzwerken verschiedene Algorithmen, beispielsweise für ein Clustering oder zur Visualisierung eines Netzwerks. Da die Network Workbench auf dem Cyberinfrastructure Shell-Framework [for Network Science Center, 2011] (welches selbst auf der OSGi-Spezifikation aufsetzt [OSGi-Alliance, 2015]) basiert, können leicht neue Komponenten, wie z.B. weitere Algorithmen, hinzugefügt werden [Börner et al., 2010]. Abbildung 2.1 zeigt die Benutzeroberfläche der Network Workbench. In der ’Console’ werden alle Rückmeldungen, wie über das Laden eines Datensatzes oder das Durchführen eines Algorithmus, für den Benutzer ausgegeben. Der ’Data Manager’ enthält alle geladenen und verfügbaren Datensätze. Standardmäßig unterstützt die Network Workbench verschiedene Datenformate, wie beispielsweise GraphML, Pajek .NET oder CSV [Team, 2009]. Im ’Scheduler’ kann eine Abfolge von Analyseschritten festgelegt werden. Dies wird benötigt, da eine komplette Untersuchung eines Netzwerks meist aus mehreren Analyseschritten besteht. Die Reihenfolge der durchgeführten Analyseschritte kann variiert werden. Durch den Abspielen-Button kann eine Analyse gestartet werden. Der Status der einzelnen Analyseschritte wird durch Fortschrittsbalken angezeigt. 1 2 4 Foundation for Intelligent Physical Agents-Agent Communication Language Knowledge Query and Manipulation Language 2.2. Verwandte Arbeiten Abbildung 2.1.: Benutzeroberfläche der Network Workbench) 2.2.2. GATE GATE (General Architecture for Text Engineering) bietet Sprachwissenschaftlern eine Architektur für die Entwicklung von Sprachanalyseanwendungen [Cunningham, 2002] und bietet diesen zusätzlich Komponenten zur Verarbeitung natürlicher Sprache, wie Tagger oder Information Retrieval Tools [Cunningham, 2014]. Ähnlich wie das UIMAFramework von Apache (siehe Abschnitt 2.2.3) ist GATE komponentenbasiert. Entsprechend ist der wichtigste Teil in GATE die sogenannte CREOLE, die ’Collection of REusable Objects for Language Engineering’. CREOLE beschreibt eine Sammlung von Komponenten, die innerhalb von GATE verwendet werden können und hauptverantwortlich für die Analysevorgänge ist. Es gibt drei Typen von Komponenten: Visual Resources, Language Resources und Processing Resources. Visual Resources sind darstellende Komponenten, die innerhalb der Benutzeroberfläche Anwendung finden [Cunningham, 2014]. Language Resources sind Datenquellen, wie Lexika oder Ontologien. Sie beinhalten lediglich Daten, bieten aber keine Algorithmen zur Verarbeitung dieser Daten. Diese Funktion erfüllen Processing Resources. Im Gegensatz zu den Language Resources stellen diese nur Algorithmen zur Datenauswertung bereit, wie beispielsweise Parser. Zum Austausch von Daten zwischen den einzelnen Komponenten wird ein Dokument beim Einlesen in eine Datenstruktur überführt, die den Dokumentinhalt und zusätzlich Annotationen [Cunningham, 2014] enthält. Die Annotationen sind auf einer modifizierten Form des TIPSTER-Formats aufgebaut [Bontcheva et al., 2004]. Abbildung 2.2 zeigt beispielhaft eine Tabelle, die einen Satz mit entsprechenden Annotationen enthält. Um Annotationen zu bestimmen, wird der Satz in seine einzelnen Glieder unterteilt. Die Zeilen eins bis fünf geben an, um was für Satzglieder es sich handelt. NP steht für ein Nomen im Singular, VBD für ein Verb in der Vergangenheitsform, DT für den Artikel und NN für ein Nomen im Singular mit unbestimmter Mengenangabe. Zeile sechs 5 2. Grundlagen Abbildung 2.2.: Text und Annonation (entnommen aus[Grishman, 1997]) bestimmt das Nomen genauer, nämlich, dass es sich um einen Personennamen handelt. Dass es sich bei den Wörtern, abgeschlossen durch den Punkt, um einen Satz handelt, wird in Zeile sieben beschrieben. Durch den komponentenbasierten Ansatz kann der Benutzer bei der Entwicklung einer Sprachanalyseanwendung selbst entschieden welche Dokumente und welche Processing Resources verwendet werden und in welcher Reihenfolge die einzelnen Analyseschritte durchlaufen werden [Cunningham et al., 2002]. 2.2.3. UIMA Apache UIMA (Unstructured Information Management Architecture) ist ein Framework zur Analyse von unstrukturierten Daten. Diese folgen, im Gegensatz zu strukturierten Daten, keinem bestimmten Schema hinsichtlich ihrer Repräsentation. Typische Beispiele für unstrukturierte Daten sind Text, Audio- oder Videodateien [Ferrucci und Lally, 2004]. Zur Analyse dieser Daten verwendet UIMA eine komponentenbasierte Architektur, hierbei werden alle Analyseschritte auf verschiedene Komponenten verteilt [Hahn et al., 2008]. Innerhalb dieser wird zwischen Collection Readern, Analysis Engines und CAS Consumers unterschieden. Collection Reader sind verantwortlich für das Einlesen von zu analysierenden Dokumenten aus sogenannten Document Collections. Diese sind, wie der Name bereits beschreibt, Ansammlungen von Dokumenten, die für eine Analyse relevant sind. Die Analyse eines Dokuments erfolgt durch Analysis Engines, die verschiedene Aufgaben übernehmen können, wie Textübersetzung oder Grammatiküberprüfung [Ferrucci und Lally, 2004]. Hat eine Analysis Engine eine Analyse durchgeführt, wird das Resultat in einer Common Analysis Structure (im Folgenden CAS genannt) repräsentiert. In dieser befinden sich das Originaldokument (auch Subject of Analysis genannt) und zusätzlich Annotationen, die Metadaten über das Originaldokument beinhalten und in Folge der Analyse entstanden sind [Götz und Suhre, 2004]. Üblicherweise besteht eine komplette Analyse aus mehreren Analyseschritten, die von mehreren Analyse Engines, die Pipeline-artig miteinander verbunden sind, übernommen werden (s. Abbildung 2.3). In jedem Analyseschritt wird die CAS zwischen den einzelnen Engines ausgetauscht und von diesen erweitert, sodass am Ende eine CAS entsteht, die das Originaldokument und alle Metainformationen aus den einzelnen Analyseschritten enthält. Am Ende einer Analysekette stehen die CAS Consumer, die das komplette CAS 6 2.3. Architekturen und Entwurfsmuster empfangen und Aufgaben erfüllen, wie beispielsweise eine Konvertierung in verschiedene Dateiformate [Ferrucci und Lally, 2004] und die letztendliche Überführung des Dokuments in eine strukturierte Information. Abbildung 2.3.: Ablauf einer Analyse in UIMA 2.3. Architekturen und Entwurfsmuster In der Softwaretechnik wird zur Entwicklung von Software und komplexer Systeme auf Architektur- und Entwurfsmuster zurückgegriffen. Sie erleichtern den Entwicklungsvorgang, bieten dem Entwickler Abstraktionsschichten und Schemata für den Aufbau des zu entwickelnden Systems. Ein Entwurfsmuster ist nach Christopher Alexander wie folgt definiert: ”Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice” [Alexander et al., 1977, s. x]. Es beschreibt also eine Lösung zu einem in verschiedenem Kontext wiederholt auftretenden Problem, die sich immer wieder auf dieses Problem anwenden lässt. Im Folgenden werden die Architekturmuster Blackboard, als Muster für eine Problemlösungsstrategie, Publisher/Subscriber, als Muster für Kommunikation zwischen lose gekoppelten Komponenten, Pipes and Filters, als Muster für die Transformation von Datenströmen sowie das Entwurfsmuster Abstract Factory, als Muster zur Kapselung der Objekterzeugung, vorgestellt. 2.3.1. Blackboard-Architektur Die Blackboard-Architektur ist ein Architekturmuster zur Problemlösung und hat ihren Ursprung in dem in [Erman et al., 1980] vorgestellten ”Hearsay-II speech-understanding system”. Hierbei handelt es sich um ein Spracherkennungssystem, bei dem gesprochene Worte nach einer Reihe von Transformationen durch das System erkannt werden. Dieser Prozess der Worterkennung ist mittels Blackboard-Architektur realisiert worden. Um die Idee hinter diesem Architekturmuster zu verstehen, verwendet [Corkill, 1991] folgende Metapher: Vor einer Tafel sitzen Experten, die zu einem bestimmten Thema eine bestimmte Kompetenz besitzen. Die Experten arbeiten zusammen an der Lösung 7 2. Grundlagen eines Problems. Die Tafel dient als Oberfläche, um die Lösung zusammenzutragen. Findet ein Experte auf der Tafel ein Teilproblem zu dem er etwas beitragen kann, fügt der Experte sein Wissen dem bisherigen Wissen hinzu. Dieser Prozess beginnt, wenn das Problem und die initialen Daten auf der Tafel stehen und wiederholt sich so lange, bis das Problem gelöst ist. Es ergeben sich also folgende Komponenten innerhalb einer Blackboard-Architektur: die Wissensquellen, die Tafel oder auch das Blackboard und der Blackboard-Monitor sowie Scheduler als Kontrollkomponenten. Wissensquellen tragen mit ihrem Wissen zur Lösung eines Problems bei. Sie zeichnen sich dadurch aus, dass sie unabhängig von allen anderen Wissensquellen existieren und auch keine Kenntnis über alle anderen Wissensquellen besitzen. Ihren Beitrag zur Problemlösung tragen sie durch das Eintreten einer bestimmten Bedingung bei. [Erman et al., 1980] bezeichnet Wissensquellen aus diesem Grund als ”condition-action pair” [Erman et al., 1980, S. 218]. Condition bezeichnet hier die Bedingung, unter der eine Wissensquelle ausgelöst wird. Action bestimmt welcher Beitrag zur Problemlösung geleistet wird. Da Wissensquellen voneinander unabhängig sind und daher nicht direkt miteinander kommunizieren, erfolgt die Kommunikation über ein Blackboard. Das Blackboard repräsentiert eine globale Datenbank zu der Zwischenlösungen beitragen, bereits vorhandene Zwischenlösungen modifiziert und finale Lösungen gespeichert werden können [Erman et al., 1980]. Gleichzeitig dient das Blackboard auch als Auslöser für die einzelnen Wissensquellen. Befinden sich in dem Blackboard für eine Wissensquelle relevante Daten, wird die Wissensquelle aktiviert und sie trägt ihr Wissen zu der bereits vorhandenen Zwischenlösung bei. Der Blackboard-Monitor überwacht Änderungen am Blackboard und erhält so einen globalen Zustand, womit eine Prioritätenreihenfolge festgelegt werden kann. Auf diese Weise kann die Ausführung der einzelnen Wissensquellen durch den Scheduler koordiniert werden. Passende Einsatzgebiete für eine Blackboard-Architektur sind Systeme, deren Komponenten Heterogenität bezüglich ihrer Lösungsexpertise bieten sollen oder solche, die von verschiedenen Entwicklern implementiert werden. In letzterem Fall bietet der BlackboardAnsatz den Vorteil, dass die Komponenten einzeln entwickelt, getestet und gewartet werden können. Trotz der Vorteile, ist der Architekturansatz im Rahmen der Systemgestaltung nicht weit verbreitet. Dies liegt daran, dass sich die Vorteile nicht auf einfache Systeme übertragen lassen und nur für komplexe Systeme relevant sind [Corkill, 1991]. Zudem bietet die Blackboard-Architektur zwar ein gutes Verständnis über den Aufbau eines Systems und hilft bei der Entwicklung eines Prototyps, dass Endprodukt lässt sich aber auch ohne Blackboard-Architektur realisieren [Corkill, 1991]. 2.3.2. Publisher/Subscriber-Architektur Moderne, verteilte Systeme bestehen häufig aus einer Vielzahl an Komponenten und erfordern ein geeignetes Kommunikationsmodell. Punkt-zu-Punkt- und synchrone Verbindungen zwischen den Komponenten führen zu unflexiblen Systemen und sind somit nicht geeignet [Eugster et al., 2003]. Einen anderen Ansatz verfolgt das Publisher/SubscriberPattern. Hier läuft die Kommunikation über eine zentrale Kommunikationseinheit, einem Bus oder Message Broker, sodass alle Komponenten sind mit der zentralen Kommunikationseinheit verbunden sind. Dieses Kommunikationsparadigma wird als Many-to-many 8 2.3. Architekturen und Entwurfsmuster bezeichnet [Baldoni et al., 2003]. Der Kommunikationsablauf wird im Folgenden beschrieben. Die einzelnen Komponenten können zwei Rollen einnehmen: Zum einen die Rolle des Subscribers, in der sie Nachrichten erhalten und zum anderen die Rolle des Publishers, in der sie diese veröffentlichen. Um zu verhindern, dass alle Kommunikationsteilnehmer in Subscriber-Rolle jegliche Nachrichten erhalten, können bei der zentralen Kommunikationseinheit Nachrichtentypen angegeben werden, zu denen Nachrichten erhalten werden sollen. Anhand dieser angegebenen Nachrichtentypen wird selektiert, welcher Subscriber welche Nachricht erhält. In Abbildung 2.4 wird der Kommunikationsablauf verdeutlicht. Die Komponen- Abbildung 2.4.: Ablauf Publisher/Subscriber Pattern ten 1 und 2 sind Subscriber und lediglich interessiert an temperature-, beziehungsweise speed-Nachrichten. Die Komponenten 3 und 4 sind Publisher. Sie senden temperatureund speed-Nachrichten an die zentrale Kommunikationskomponente. Diese wiederum sendet die Nachrichten an die jeweils relevante Komponente. In einem Anwendungsfall könnten Komponenten 1 und 2 Kontrolleinheiten darstellen und Komponenten 3 und 4 Sensoren, die in bestimmten Zeitintervallen die Kontrolleinheiten benachrichtigen. Die Vorteile dieses Kommunikationsmodells sind die komplette Entkopplung auf Zeit-, Raum- und Synchronisationsebene [Eugster et al., 2003]. Dies bedeutet, dass die Kommunikationspartner nicht zeitgleich existieren müssen, dass sie sich nicht kennen und dass sie sich nicht beim Senden beziehungsweise Empfangen einer Nachricht blockieren [Baldoni et al., 2003]. Zur Kategorisierung von Publisher/Subscriber-Systemen verwendet man die Begriffe Content-based und Topic-based. Diese charakterisieren die Art und Weise, wie an der zentralen Kommunikationskomponente Nachrichten zu Subscribern zugeordnet werden. In einem Content-based System können sich Subscriber auf den tatsächlichen Inhalt einer Nachricht registrieren [Rosenblum und Wolf, 1997]. Hierzu kann eine spezielle Subscription-Language verwendet werden [Eugster et al., 2003], mit Hilfe dieser Eigenschaften der Nachrichten spezifiziert werden. Anhand dieser wird bestimmt, ob ein Subscriber eine Nachricht erhält oder nicht. Auf diese Art und Weise lässt sich die Beschaffenheit der Nachricht, die der Subscriber erhalten soll, wesentlich detaillierter spezifizieren als bei einem Topic-based System. Bei einem Topic-based System hingegen werden Nachrichten nur anhand von Topics gefiltert. Topics sind dabei logische Kanäle. Alle Kommunikationspartner die sich auf ein bestimmtes Topic registriert haben, erhalten alle Nachrichten, die in diesem Topic veröffentlicht werden. Die Topic-based Systeme haben den Vorteil, dass sie auf Grund der einfachen Logik eine effiziente Implementierung ermöglichen und gleichzeitig dem Benutzer leicht zugänglich sind [Milo et al., 2007]. 9 2. Grundlagen 2.3.3. Pipes and Filters In manchen Systemen müssen Datenströme eine Reihe von Verarbeitungsschritten durchlaufen. Dies könnte in einer einzigen Filterkomponente des Systems stattfinden. Einen anderen Ansatz stellt das Pipes and Filters Entwurfsmuster dar. Hier werden alle benötigten Verarbeitungsschritte in einzelne Module, auch als Filter bezeichnet, aufgeteilt. So ist jeweils ein Modul für einen Verarbeitungsschritt verantwortlich [Buschmann, 1998]. Diese Module werden durch Pipes miteinander verbunden. Sie haben die Aufgabe, Daten von einem Modul zum Nächsten zu transportieren. Die Datenströme durchlaufen auf diese Weise die einzelnen Module und werden so in den gewünschten Endzustand gebracht (Abbildung 2.5). Die zu erfüllenden Aufgaben der Filter können variieren. Filter können [Buschmann, 1998]: • Zu den bisherigen Daten weitere Informationen hinzufügen. So könnte beispielsweise ein Text mit Metainformation angereichert werden und die Satzglieder der im Text vorkommenden Sätze bestimmt werden. • Die bereits vorhandenen Daten verfeinern. Hier könnten aus Analyse-Logs die Ereignisse auf bestimmte Tage oder Stunden fixiert werden. • Die bereits vorhandenen Daten umwandeln. So können Sie einen Text von einer Repräsentation in eine Andere bringen. Abbildung 2.5.: Beispiel Pipes and Filters Angewendet wird dieses Entwurfsmuster im Betriebssystem UNIX [Buschmann, 1998]. So können durch die Verwendung des |-Symbols, Daten von einer Komponente zur Nächsten weitergereicht werden. So liest der Kommandozeilenbefehl ’cat names.txt | wc’ zunächst den Inhalt der Textdatei ’names.txt’ aus und leitet die gelesenen Daten weiter. Der Filter ’wc’ zählt dann die in dem Text vorkommenden Zeichen, Wörter und 10 2.3. Architekturen und Entwurfsmuster Zeilen. Durch die strikte Trennung der Filter können diese innerhalb der Anwendung wiederverwendet, ausgetauscht, entfernt oder hinzugefügt werden [Buschmann, 1998]. Außerdem lässt sich auf diese Weise eine parallele Verarbeitung ermöglichen. Ob das Muster angewendet werden kann, hängt in erster Linie davon ab, ob die Verarbeitungsschritte voneinander getrennt werden können. Hängen die Verarbeitungsschritte zusammen, ist eine Aufteilung und somit auch die Anwendung des Musters nicht möglich. 2.3.4. Abstrakte Fabrik Das Entwurfsmuster Abstrakte Fabrik, auch als Kit bezeichnet, gehört zu der Kategorie der Erzeugungsmuster. Es dient dazu miteinander verwandte Objekte zu erstellen, ohne konkrete Klassen anzugeben [Gamma et al., 1995]. Dies ist besonders hilfreich, wenn ein System mit einer bestimmten Objektfamilie konfiguriert werden soll oder der Objekterzeugungsprozess unabhängig von dem Systemkontext geschehen soll [Gamma et al., 1995]. Das Erstellen einer solchen Objektfamilie erfolgt über eine abstrakte Schnittstelle, die Abstrakte Fabrik (Abstract Factory). Die gesamte Struktur des Musters inklusive aller Komponenten zeigt Abbildung 2.6. Die Klasse AbstractFactory repräsentiert das Interface für die Erstellung der abstrakten Produkt-Objekte. ConcreteFactory1 und ConcreteFactory2 erweitern die Klasse AbstractFactory und implementieren die Methoden CreateProductA() beziehungsweise CreateProductB(), um die konkreten Objekte ProductA1, ProductA2, ProductB1 und ProductB2 zu erstellen. Die beiden Produktfamilien ProductA1, ProductA2 und ProductB1, ProductB2 werden definiert durch das Interface der Klassen AbstractProductA bzw. AbstractProductB. Die Vorteile bei der Verwendung des Patterns sind nach [Gamma et al., Abbildung 2.6.: Abstrakte Fabrik (entnommen aus [Gamma et al., 1995]) 11 2. Grundlagen 1995] das Kapseln des Objekterzeugungsprozesses durch die einzelnen Fabriken. Auch können konkreten Fabriken leicht angepasst werden, falls eine Änderung an den konkreten Objekten erwünscht ist. Ebenfalls gewährleistet das Erstellen von Objektfamilien durch eine Abstrakte Fabrik Konsistenz innerhalb dieser Objektfamilien. 2.4. SQLSpaces SQLSpaces ist ein Framework zur Gestaltung verteilter Systeme [Weinbrenner, 2012] und eine Implementierung des TupleSpace Konzepts, welches auf [Gelernter, 1985] zurück geht. Die Idee hinter dem TupleSpace-Konzept basiert auf dem in Kapitel 2.3.1 beschriebenen Blackboard-Ansatz. Clients sind hierbei nicht direkt miteinander verbunden, sondern über einen zentralen Server. Dieser beinhaltet alle Nachrichten der Clients [Giemza et al., 2007]. Die Nachrichten basieren dabei auf Tupel, d.h. eine Liste (x1 , .., xn ) von n Objekten. Um dem Server Nachrichten hinzuzufügen, diese vom Server zu entfernen oder zu lesen, bieten sich drei Operationen: out(), in() und read() [Gelernter, 1985]. Out() fügt ein Tupel dem Server hinzu, in() nimmt ein Tupel aus dem Server und gibt es an den Client zurück, read() gibt ein Tupel an den Client zurück. Im Unterschied zu in() wird das Tupel aber nicht vom Server entfernt. Um Suchanfragen zu stellen, können zum einen konkrete Werte verwendet werden, z.B. (Stefan, true). Zusätzlich werden auch Wildcard-Felder unterstützt, wie beispielsweise read(i:integer, j:string). Eine Suchanfrage in dieser Form liest alle Tupel, die aus einer Integerzahl und einem String in beliebiger Form bestehen. Die SQLSpaces bieten, neben den für TupleSpaces typischen Basisfunktionalitäten, weitere Features. So können dank Schnittstellen für verschieden Programmiersprachen sprachheterogene, verteilte Systeme entwickelt werden, da die einzelnen Komponenten nicht in der selben Programmiersprache entwickelt werden müssen. Auch können außer den Operationen out(), in() und read() blockende Operationen verwendet werden, beispielsweise waitToTake(). Das Besondere an dieser Operation ist, dass als Parameter für die waitToTake()-Funktion ein Tupel oder eine Signatur von einem Tupel angegeben werden kann, welches noch nicht existiert. Sobald ein Tupel von der Form den SQLSpaces hinzugefügt wird, wird es dem Client, der diese Funktion aufgerufen hat, zurückgegeben und aus den SQLSpaces entfernt. Ein weiteres Feature, nämlich der Callback-Mechanismus, ist besonders hinsichtlich der Blackboard-Architektur von Bedeutung. Clients können sich bei den SQLSpaces auf Tupel und Operationen bestimmter Form für Callbacks registrieren, beispielsweise (Stefan, 5, 2, 1990) mit der Operation Löschen. Sobald auf diesem Tupel-Typ die angegebene Operation durchgeführt wird, wird der registrierte Client benachrichtigt. Auf diese Weise können die Komponenten eines Blackboard-Systems indirekt miteinander Kommunizieren. Auf technischer Ebene liegt auf unterster Schicht der SQLSpaces eine relationale Datenbank [Weinbrenner, 2012]. Unterstützt werden verschiedene relationale Datenbanken, z.B. MySQL und HSQL [COLLIDE, 2012]. 12 2.5. Analytics Workbench 2.5. Analytics Workbench Die Analytics Workbench ist ein Werkzeug zur Analyse verschiedener Daten. Es wurde unter der Prämisse entwickelt, leicht benutzbar und flexibel erweiterbar zu sein [Göhnert et al., 2014]. Um einem Benutzer das Erstellen einer Analyse zu vereinfachen, bietet die Workbench eine Weboberfläche, die gleichzeitig der visuellen Darstellung des Analyseprozesses dient. Die Abbildung 2.7 stellt den Aufbau dieser Nutzerschnittstelle dar. Auf der linken Seite befinden sich die zur Verfügung stehenden Analysemodule, die per Drag-and-Drop im Zentrum der Oberfläche angeordnet werden können. Die Verknüpfungen der einzelnen Module ermöglichen Pfeile, wodurch eine Pipes and Filtersähnliche Struktur entsteht (s. 2.3.3). Hierbei repräsentieren die einzelnen Analysemodule die Filter, in denen Daten weiterverarbeitet werden und die Pfeile die Pipes, die dazu dienen, Datenströme weiterzuleiten. Neben der Visualisierung gibt der zentrale Bereich der Oberfläche während der Durchführung einer Analyse Aufschluss über den aktuellen Analyseschritt. Je nach aktuellem Zustand werden die Analysekomponenten gefärbt. So sind bereits abgearbeitete Analysekomponenten grün gefärbt, laufende Analysekomponenten sind gelb gefärbt. Die Analyse in der Abbildung beinhaltet vier Module, bestehend aus dem Data Repository (einer Datenquelle), der Format Transformation (einem Modul zur Umwandlung verschiedener Dateiformate), dem Biclique Communities Modul (zur Analyse der Daten) und dem Super Graph Modul, das für die Visualisierung der Analyseergebnisse verantwortlich ist. Auf der rechten Seite bietet die Weboberfläche Informationen über den Status sowie die Ergebnisse der Analyse. Um neue Workflows zu erstellen, Gespeicherte zu laden, Eigene zu speichern und auszuführen und um Ergebnisse von bereits durchgeführten Analysen einzusehen, steht eine Menüleiste am oberen Rand der Oberfläche zur Verfügung. Initial stellt die Workbench Komponenten für verschiedene Operationen bereit. So gibt es Komponenten für die Eingabe und Transformation von Daten sowie Komponenten zur Analyse und Repräsentation analysierter Daten, wie beispielsweise ”Main Path Analysis” und ”Bar Chart” [Göhnert et al., 2014]. Bei der Konzeption des Systems wurde Wert auf Erweiterbarkeit gelegt, sodass es möglich ist, eigene Agenten zu entwickeln. Abbildung 2.7.: Grafische Oberfläche der Analytics Workbench 13 2. Grundlagen 2.5.1. Architektur Im Wesentlichen besteht die Architektur der Workbench (Abbildung 2.8) aus fünf Komponenten, den Agenten, dem SQLSpaces-Server, der Node.js Serverkomponente, der Weboberfläche und dem Result-Repository. Die Durchführung einer Analyse wird durch ein Multiagentensystem (s. 2.1), das heißt eine Vielzahl von unabhängigen Agenten (s. 2.1) realisiert. Hier entspricht ein auswählbares Analysemodul in der Weboberfläche einem Agenten [Göhnert et al., 2014]. Die Kommunikation zwischen den Agenten erfolgt über einen SQLSpaces-Server (s. 2.4). Dieser bietet Schnittstellen für verschiedene Programmiersprachen, wodurch Agenten in unterschiedlichen Programmiersprachen entwickelt werden können. Ebenfalls mit dem SQLSpaces-Server verbunden, ist die Node.js Serverkomponente. Sie stellt die Weboberfläche bereit und fungiert als Schnittstelle zwischen der Weboberfläche und dem Multiagentensystem [Göhnert et al., 2013] als auch als Kontrollkomponente über die Durchführung eines Workflows. Die Weboberfläche dient zur Interaktion mit dem Benutzer. Mittels dieser kann er Analysen gestalten, modifizieren und durchführen. Komplettiert wird die Architektur durch das Result-Repository. In diesem werden Analyseergebnisse gespeichert und können bei Bedarf abgerufen werden. Abbildung 2.8.: Architektur der Analytics Workbench 2.5.2. Ablauf eines Workflows Um einen Analyseworkflow zu starten, werden sogenannte Command-Tupel in den SQLSpaces gespeichert. Sie werden typischerweise aus dem Workflow erzeugt, den ein Benutzer in der Weboberfläche konfiguriert hat. Dabei wird pro Analyseschritt ein CommandTupel generiert, in dem Informationen über die ein- und ausgehenden Pipes des Moduls gespeichert sind [Göhnert et al., 2013]. Verantwortlich für diesen Vorgang ist die 14 2.5. Analytics Workbench Node.js-Serverkomponente. Es ist aber auch möglich, dass eine andere Komponente diese Tupel generiert, in die SQLSpaces schreibt und so den Analysevorgang auslöst. Um der Weboberfläche eine Rückmeldung über den aktuellen Status eines Moduls zu geben, beinhalten Command-Tuple noch ein weiteres Feld. Der Status eines Moduls kann entweder wartend, durchführend, fehlerhaft oder abgeschlossen sein. Empfängt ein Analysemodul ein Command-Tupel, liest es anhand der eingehenden Pipes die relevanten Daten, führt den Analyseprozess durch und speichert die modifizierten Daten in den ausgehenden Pipes. Dies bedeutet, dass neben der Darstellung des Analyseworkflows auf der Weboberfläche in Pipes and Filters-Struktur, auch die interne Verarbeitung über den Pipes and Filters-Ansatz erfolgt. Die Daten, die zwischen den Modulen ausgetauscht werden, werden durch Data-Tupel repräsentiert. Diese beinhalten eine Zuordnung zu den entsprechenden Pipes sowie die tatsächlichen Nutzdaten und Informationen über deren Beschaffenheit. Wird innerhalb des Workflows ein Modul erreicht, dass keine ausgehenden Pipes besitzt, wird ein Result-Tupel erzeugt. Dieses enthält einen Link auf das Analyseergebnis des korrespondierenden Analysezweigs sowie einen Namen und eine Beschreibung des Resultats. Werden alle Module ohne ausgehende Pipes erreicht, ist der Workflow abgeschlossen. Falls der Workflow aus der Benutzeroberfläche gestartet wurde, erhält diese Rückmeldung über die erfolgreiche Durchführung der Analyse. 2.5.3. Kommunikation Wie bereits beschrieben, verwendet die Analytics Workbench zum Nachrichten- und Datenaustausch zwischen den Komponenten verschiedene Tupel-Typen. Diese Tupel-Typen lassen sich in zwei Kategorien einteilen. Zum einen sind dies Tupel, die nur für die Koordination des Analyseworkflows zuständig sind und zum anderen Tupel, die über einen Workflow hinaus bestehen müssen. Command-, Data- und Error-Tupel gehören in die erste Kategorie. Sie koordinieren und starten einen Workflow, dienen zum Datenaustausch zwischen den Agenten und indizieren einen fehlerhaften Agentenzustand. Nach dem Abschluss des Analyseworkflows werden sie nicht weiter benötigt. Command-Tupel haben die folgendene Signatur: {Run-Id, Agent-State, Instance-Id, Agent-Id, Pipes, Parameters}. Die Felder Run-Id, Agent-State, Instance-Id und Agent-Id beschreiben zu welchem Analysedurchlauf und zu welchem Agenten dieses Tupel gehört, das Feld Pipes beinhaltet alle ausgehenden Pipes des Agenten [Göhnert et al., 2013] und Parameters umfasst alle für den Agenten verantwortlichen Parameter. Data-Tupel beinhalten die Felder Run-Id, Pipe-Id und Data. Run-Id und Pipe-Id beschreiben für welche Analyse und für welche Pipe die im Feld Data hinterlegten Nutzdaten sind [Göhnert et al., 2013]. Im Gegensatz dazu stehen Workflow Save-, Run-, Result-, User-, Group-, Role-, User Group Link-, User Role Link-, Workflow Group Link- und Run Group Link-Tupel. Diese beinhalten Informationen, die auch außerhalb einer Analyse relevant sind. Um die Menge der Analyse-übergreifenden Tupel weiter zu verfeinern, können diese wiederum in zwei Kategorien eingeteilt werden: in Tupel, die Daten über Workflows speichern und Tupel zur Benutzerverwaltung. Zu den Tupeln, die Daten über Workflows speichern, gehören Workflow Save-, Run- und Result-Tupel. Workflow Save-Tupel repräsentieren einen vom Benutzer erstellten und gespeicherten Analyseworkflow. Run-Tupel speichern den Status eines Workflows (fehlerhaft oder abgeschlossen) sowie das Ausführungsdatum, den 15 2. Grundlagen Workflow-Name und die Beschreibung. Result-Tupel beinhalten einen Verweis auf ein Analyseresultat sowie Name und Beschreibung des Resultats. Für die Benutzerverwaltung innerhalb der Workbench werden User-, Group-, Role-, User Group Link-, User Role Link-, Workflow Group Link- und Run Group Link-Tupel verwendet. Benutzer, Benutzergruppen und Benutzerrollen werden auf User-, Group- und Role-Tupel abgebildet. Verknüpft werden Benutzer, Gruppen und Rollen durch User Group Link-, User Role Link-Tupel. Für Workflows kann ein Benutzer entscheiden, ob er diese für alle anderen Benutzern zur Verfügung stellen möchte oder nur einer bestimmten Gruppe. Hierzu dienen Workflow Group Link- und Run Group Link-Tupel. Sie ordnen erstellten Workflows und durchgeführten Analysen bestimmte Gruppen zu. Eine Besonderheit sind Auto Execution Tupel und Agent Description Tupel. Erstere dienen dazu einen automatischen Workflow-Ablauf zu konfigurieren, sodass ein Workflow (wiederholt) durchgeführt werden kann, ohne das er durch den Benutzer gestartet wird. Letztere sind Beschreibungs-Tupel. Sie repräsentieren einen Analyseagenten und existieren so lange, wie die Analysekomponente läuft. Ihren Verwendungszweck finden sie in der Weboberfläche. Anhand der Beschreibungs-Tupel kann diese alle laufenden Analyseagenten bestimmen. 2.5.4. Framework Bis jetzt war im Zusammenhang der Analytics Workbench immer von Agenten oder Analysekomponenten die Rede. Im Framework der Analytics Workbench sind diese Teil des Agenten-Frameworks, welches in Java entwickelt ist. Prinzipiell können Agenten aber in jeder Programmiersprache entwickelt werden, die das Tupel-Protokoll unterstützen und so mit einem SQLSpaces-Server kommunizieren können [Göhnert et al., 2013]. Die Basis einer Analysekomponente sind der Agent-Manager und zugehörige Agenten. Der Agent-Manager eines Analysemoduls dient zum Verwalten mehrere Agenteninstanzen. Wird er gestartet, fügt er den SQLSpaces sein Beschreibungs-Tupel hinzu. Des Weiteren registriert sich der Agent-Manager bei dem SQLSpaces-Server auf ein für ihn spezifisches Command-Tupel (s. 2.5.2 und 2.4), nämlich auf ein Command-Tupel, welches als Feld Agent-Id die eigene Bezeichnung enthält. Wenn dieses Command-Tupel dem SQLSpaces-Server hinzugefügt wird, startet der Agent-Manager eine Agenteninstanz [Göhnert et al., 2013]. Die Agenteninstanz ist das Herzstück des Analysemoduls. Sie registriert sich beim SQLSpaces-Server auf ein Data-Tupel, welches die Id der aktuellen Analyse und die eingehende Pipe des Analysemoduls beinhaltet (s. 2.5.2). Erreicht sie ein solches DataTupel, beginnt die eigentliche Analyse oder Aufgabe des Analysemoduls. Auf diese Art und Weise ist eine Agenteninstanz an einen Analysedurchlauf gebunden. Ist die Analyse oder die Aufgabe abgeschlossen, schreibt die Agenteninstanz ihre Resultate mittels eines Data-Tupels in den SQLSpaces-Server und beendet sich daraufhin. Während der einzelnen Schritte, das heißt Beginn und Ende der Analyse beziehungsweise Aufgabe, benachrichtigt die Agenteninstanz den zugehörigen Agent-Manager über ihren Status. Dieser gibt Rückmeldung an die Weboberfläche, wodurch die Analysemodule auf der Weboberfläche entsprechend ihres Status gefärbt werden. Neben den Analysekomponenten gibt es noch Infrastruktur-Komponenten. Sie erfüllen keine Analysezwecke, sondern haben Aufgaben, die die Umgebung betreffen, wie zum Beispiel das Sammeln von Ergebnissen einer Analyse. Diese Aufgabe erfüllt der Result 16 2.5. Analytics Workbench Collector. Er wartet bis alle Analysekomponenten, die keine ausgehenden Pipes haben, ein Ergebnis produziert haben und schreibt dann Result-Tupel. Diese werden verwendet, um die Ergebnisse abrufen und anzeigen zu können. Um Agenten beziehungsweise Agent-Manager starten zu können, wird eine ExecutorKomponente verwendet. Anhand einer Konfigurationsdatei, die angibt, welche Analysekomponenten gestartet werden sollen, werden die Agent-Manager zu den Analysekomponenten gestartet. Zudem bietet die Executor-Komponente ein Menü auf Konsolenbasis, womit unter anderem einzelne Analysekomponenten gestartet werden können oder eine Übersicht aller laufenden Analysekomponenten ausgeben werden kann. Außer der Konfigurationsdatei, die die zu startenden Agenten angibt, gibt es eine weitere Konfigurationsdatei für Umgebungsvariablen, zum Beispiel Adresse und Port des SQLSpaces-Servers. Beim Starten des Executors wird die Konfigurationsdatei eingelesen und den einzelnen Komponenten die benötigten Umgebungsvariablen übergeben. Um neue Agenten zu entwickeln, müssen, wie bereits beschrieben, ein Agent-Manager und ein Agent implementiert werden. Zur Vereinfachung des Entwicklungsprozesses bietet das Framework die Klassen AgentManager und Agent an. Diese beinhalten die Basisfunktionalitäten, die jeder Agent-Manager bzw. Agent beherrschen muss. Für die eigene Implementierung leitet der Entwickler von den Klassen ab und muss lediglich die für den Agent-Manager bzw. Agent spezifische Funktionalität hinzufügen. Soll die neu entwickelte Analysekomponente verwendet werden, muss sie in die Konfigurationsdatei eingetragen werden. Eine Besonderheit unter den Agenten bilden R-Agenten, welche dazu dienen, Analysen auch in R durchführen zu können [Göhnert et al., 2013]. R ist eine Programmiersprache für Datenanalysen [Ihaka und Gentleman, 1996]. Die Entwicklung von RAgenten erfolgt durch Erweitern der R-Wrapper-Analysekomponente. Diese dient dazu, in den R-Agenten spezifizierte R-Skripte auszuführen. Das Ausführen des Skripts erfolgt über eine Bibliothek, die es erlaubt R aus Java aufzurufen. Dieses wird benötigt, da die R-Wrapper-Analysekomponente in Java entwickelt wurde. 2.5.5. Probleme Kleine Analysen können mit der Analytics Workbench schnell und performant durchgeführt werden. Bei der Analyse von Daten innerhalb komplexer Workflows mit einer Vielzahl von Agenten oder bei großen Analysedaten, offenbart das System Schwachstellen. Diese sollen im Folgenden beschrieben werden. 1. Wie in Abschnitt 2.5.3 beschrieben, läuft die Kommunikation der Agenten über einen SQLSpaces-Server. Bei der Durchführung eines komplexen Workflows registriert sich eine große Zahl von Agenten bei diesem Server auf Callbacks bestimmter Tupel-Typen (s. 2.4). Dadurch wird dieser bei der Durchführung der Analyse stark belastet, was bedingt, dass er nicht mehr erreichbar ist. Dies zieht den Abbruch der Analyse nach sich. Die Weboberfläche ist für den Benutzer nur noch eingeschränkt nutzbar. Alle Aktionen, die Datenbankzugriff benötigen (beispielsweise die Benutzeranmeldung), sind nicht mehr durchführbar. Für den Benutzer hat dies zur Folge, dass er das System als solches nicht mehr verwenden kann. Das Problem lässt sich nur durch einen Neustart des SQLSpaces-Servers beheben. 17 2. Grundlagen 2. Die Behandlung größerer Datenmengen ist in einem Analysesystem erforderlich. In der Analytics Workbench ist es nicht möglich, Daten mit einer Größe von über 4 Megabyte als Ausgangspunkt für eine Analyse zu verwenden. Dies ist auf technische Limitierungen seitens des SQLSpaces-Servers zurückzuführen. Tupel, die Daten über 4 Megabyte enthalten, können nicht verarbeitet werden. 3. Durch sich ändernde Anforderungen, muss ein System flexibel gestaltet sein. Treten Probleme auf, wie beispielsweise die Limitierungen durch den SQLSpaces-Server, muss es möglich sein zu reagieren und Teile des Systems leicht austauschen zu können. Das Auswechseln des SQLSpaces-Server stellt sich aufgrund der Datenverarbeitung innerhalb des Frameworks als schwierig dar. Sämtliche Nachrichten und Daten werden über das Tupel-Format ausgetauscht und müssten bei einer anderen Kommunikationslösung in ein anderes Datenformat überführt werden. 2.6. Nachrichtenaustausch und Speicher Innerhalb eines verteilten Systems spielen Persistenz und Nachrichtenaustausch eine bedeutende Rolle, diese sollten besonders während der Konzeptionsphase des Systems berücksichtigt werden. In diesem Kapitel werden MQTT, PostgreSQL und FTP vorgestellt. MQTT ist ein leichtgewichtiges Nachrichtenaustauschprotokoll, welches in Publisher/Subscriber-Systemen (s. 2.3.2) Anwendung findet. PostgreSQL, welches Daten in relationalen Schemata ablegt und FTP, welches Daten auf Dateisystemebene speichert, sind für Persistenz verantwortlich. 2.6.1. MQTT Durch die Entstehung der Internet der Dinge-Bewegung haben sich die Anforderungen an die Netzwerkverbindungen verändert. Internet der Dinge meint eine Verbindung zwischen alltäglichen Dingen, ausgestattet mit einem eingebetteten System, dass den Menschen den Alltag erleichtern soll [Xia et al., 2012]. Ein Beispiel ist das Smart Home Konzept, bei dem sämtliche Elemente des Hauses vernetzt sind und gesteuert werden können. Solche eingebetteten Systeme sind oft durch Netzwerke verbunden, die instabil sind oder eine geringe Bandbreite zur Verfügung stellen. Das Message Queue Telemetry Transport (MQTT) Protokoll trägt diesen Problemen Rechnung. Es ist leichtgewichtig, orientiert sich am Publisher/Subscriber-Architekturmuster (siehe 2.3.2) und legt die Hauptkomplexität auf die Seite des Message-Brokers [Hunkeler et al., 2008]. MQTT ist ein topic-based Publisher/Subscriber-System (siehe 2.3.2). Clients registrieren sich hier bei dem MQTT-Broker (dem Message-Broker) auf bestimmte Topics, zu denen sie Nachrichten erhalten wollen. Dabei werden bei der Angabe von Topics auch hierarchische Strukturen erlaubt. Konkret bedeutet dies, dass ein Topic den Namen ”/wohnung”, aber auch ”/wohnung/schlafzimmer” tragen kann. Bei der Registrierung auf Topics kann auf Wildcards zurück gegriffen werden. Gibt der Client als Topic ”/wohnung/#” an, erhält er Nachrichten aus allen Topics, die mit ”/wohnung” beginnen, z.B. ”/wohnung/schlafzimmer/” oder ”wohnung/schlafzimmer/temperatur” [Standard., 2014]. Um sich mit dem MQTT-Broker zu verbinden, senden Clients CONNECT-Nachrichten. Diese enthalten eine Client-Id, die der Broker zur eindeutigen Identifizierung des Clients verwendet. Neben der Client-Id wird angegeben, ob die Sitzung eine ”clean session” sein 18 2.6. Nachrichtenaustausch und Speicher soll und weitere optionale Attribute, wie Benutzername und Passwort festgelegt. ”Clean session” gibt an, ob (falls existent) Informationen über eine bereits gespeicherte Sitzung beim Verbinden eines Clients mit dem Broker verworfen werden oder nicht. Wird ”clean session” auf true gesetzt, verwirft der Broker alle Informationen über vorherige Sitzungen. Wie bereits erwähnt, sind die Netzwerke, die die eingebetteten Systeme verbinden, geprägt von Instabilität und geringer Bandbreite. Daher bietet das MQTT-Protokoll drei verschiedene Quality of Service (im Nachfolgenden QoS genannt)-Stufen an, um sicher zu gehen, dass Nachrichten ihre Empfänger erreichen [Hunkeler et al., 2008]. Die geringste Stufe ist QoS 0: At most once delivery 3 und bedeutet, dass Nachrichten den Empfänger gar nicht oder wenn, dann nur einmal erreichen. Eine Verbesserung ist QoS 1: At least once 4 . Im Gegensatz zu QoS 0 wird hier sicher gestellt, dass eine Nachricht den Empfänger erreicht. Es wird aber nicht ausgeschlossen, dass dieselbe Nachricht den Empfänger zwei oder mehrmals erreicht. Dazu ist QoS 3: Exactly once delivery 5 nötig. Dieser versichert, dass eine Nachricht nur genau einmal zugestellt wird, verursacht aber auch den größten Verwaltungsaufwand. QoS 0 sollte in Systemen verwendet werden, bei denen die Verbindung stabil ist oder es irrelevant ist, wenn Nachrichten verloren gehen. QoS 1 sollte verwendet werden, wenn Nachrichten ihren Empfänger erreichen müssen, aber keine Rücksicht darauf genommen werden muss, ob Duplikate den Empfänger erreichen. Die Anwendung von QoS 2, der höchsten Stufe, sollte stattfinden, wenn es wichtig ist das Clients Nachrichten nur genau einmal erhalten und es zu Fehlern führen würde, dieselbe Nachricht mehr als einmal zu empfangen. Neben den Quality of Service-Einstellungen, unterstützt MQTT ein Last Will and Testament-Feature [Standard., 2014]. So kann der Client eine Nachricht spezifizieren, die im Falle eines ungewollten Verbindungsabbruchs an alle Clients, in einem bestimmten Topic, publiziert wird. 2.6.2. PostgreSQL PostgresSQL ist ein open-source relationales Datenbanksystem mit einer längeren Entwicklungsgeschichte [Douglas und Douglas, 2003]. Ursprünglich stammt das System aus akademischen Kontext, konnte sich aber dank wachsender Popularität, über diesen hinaus, auf dem Markt neben kommerziellen Datenbanklösungen wie DB2 oder Oracle, etablieren. Da PostgreSQL ein relationales Datenbanksystem ist, werden Daten wie bei allen relationalen Datenbanken wie folgt organisiert: eine Datenbank enthält mehrere Schemata. Ein Schema beinhaltet eine Menge von Relationen. Relationen wiederum enthalten Datensätze. Diese sind charakterisiert durch verschiedene Attribute. Um Datensätze anzulegen oder bereits vorhandene auszulesen, können Anfragen gegen die Datenbank gestellt werden. Diese sind in der Datenbanksprache SQL 6 formuliert. PostgreSQL ist größtenteils Kompatibel zu dem SQL-Standard [PostgreSQL, 2015a], bietet aber zusätzlich eigene Funktionen. So ist es möglich, Daten auch in Form des Dateiaustauschformats Json 7 in der Datenbank abzulegen und abzurufen [PostgreSQL, 2015c]. Mittels der Anfrage ”INSERT 3 Höchstens einmal zugestellt Mindestens einmal zugestellt 5 Genau einmal zugestellt 6 Structured Query Language 7 JavaScript Object Notation 4 19 2. Grundlagen INTO jsonexample (id, studenten) VALUES (1, {”name”:”Stefan”, ”alter”: 25})” wird in der Relation ”jsonexample” ein Eintrag erzeugt, der das Json-Objekt {”name”: ”Stefan”, ”alter”: 25} enthält. Will man die Daten als Json-Format auslesen bzw. abgleichen, ob ein gegebener Wert einem Feld innerhalb des Json-Objektes entspricht, so verwendet man innerhalb einer SQL-Anfrage die von PostgreSQL vorgegebenen Json-Operatoren. Die Anfrage, um das zuvor beispielhaft eingefügte Json-Objekt wieder abzurufen, würde wie folgt aussehen: ”SELECT studenten FROM jsonexample WHERE studenten ->> ’name’ = ’Stefan”’. Als Besonderheit fällt hier der ->>Operator auf. Dieser dient dazu, ein Attribut aus dem Json-Objekt zu selektieren (in unserem Falle das Attribut name) und als Text zurück zu geben. Eng verwandt mit dem ->> - Operator ist der -> - Operator. Dieser selektiert ein Attribut und gibt es nicht als Text, sondern im Json-Format zurück. Nützlich ist dies, wenn Objekte eine tiefere Hierarchie besitzen, zum Beispiel, wenn sich innerhalb eines Json-Objektes ein weiteres Json-Objekt befindet. Neben dem Json-Feature bietet PostgreSQL noch einen Interprozesskommunikationsmechanismus. Clients können sich bei der Datenbank mittels des ”LISTEN kanalname”Befehls auf einen Kanal registrieren und erhalten so alle Benachrichtigungen, die über diesen Kanal versendet werden. Über den Befehl ”NOTIFY kanalname, nachricht” kann eine neue Benachrichtigung erstellt werden, wobei der Kanalname und der Inhalt der Benachrichtigung spezifiziert werden können. Anwendung findet diese Funktion innerhalb von Echtzeitanwendungen oder wenn die verschiedenen Komponenten eines System über Änderungen in der Datenbank benachrichtigt werden müssen. Limitierungen bei der Verwendung des Datenbanksystems gibt es hinsichtlich der maximalen Tabellengröße (32 Terrabyte), der maximalen Zeilengröße (1.6 Terrabyte) und der maximalen Feldgröße (1 Gigabyte) [PostgreSQL, 2015b]. 2.6.3. FTP Das File Transfer Protocol (FTP) ist ein Netzwerkprotokoll zur Übertragung von Daten in einem Netzwerk zwischen zwei Rechnersystemen. Neben dem reinen Austausch von Dateien, hat das FTP-Protokoll außerdem die zuverlässige Übertragung von Daten und die Ermöglichung eines Dateizugriffs unabhängig eines bestimmten Betriebssystems zum Ziel [Postel und Reynolds, 1985]). Die Kommunikation zwischen zwei Rechnernetzen über das FTP-Protokoll verläuft nach dem Client-Server-Modell: Dieses besteht aus einem Client, der Anfragen an den Server stellt und einem Server, der die Anfragen des Clients beantwortet. Grundsätzlich ergeben sich zwei Anwendungsfälle für das FTP: • Der Client lädt von dem FTP-Server Dateien herunter. • Der Client lädt Dateien auf den FTP-Server. Bei jeder FTP-Sitzung werden zwei Verbindungen aufgebaut, eine Verbindung zur Übertragung von FTP-Kommandos inklusive deren Antworten, die sog. Kontrollverbindung. Die zweite Verbindung dient der Übertragung von Daten, die sog. Datenverbindung. Die Datenverbindung muss aber nicht während der gesamten Sitzung aktiv sein. Der Verbindungsaufbau geschieht nach folgendem Schema: Der Client Protocol Interpreter baut die Kontrollverbindung auf. Über das User-Interface kann der Benutzer nun FTP-Kommandos eingeben, diese sendet der Client Protocol Interpreter an den Server Protocol Interpreter. Sobald dieser ein FTP-Kommando empfängt, 20 2.6. Nachrichtenaustausch und Speicher sendet er entsprechende Antworten zurück an den Client Protol Interpreter [Postel und Reynolds, 1985]. Das Speichern und Laden von Dateien auf beziehungsweise vom Server wird über die Datenverbindung abgewickelt. Dabei werden zwei Modi unterschieden: das aktive FTP und das passive FTP. Passives FTP wird verwendet, wenn keine Verbindung zum Client aufgebaut werden kann, beispielsweise weil das Netzwerk des Clients durch eine Firewall geschützt wird. Beim aktiven FTP einigen sich Client und Server auf einen Port zum Datenaustausch. Der Client wartet dann über den zuvor ausgetauschten Port auf das Eingehen einer Datenverbindung. Der Server initiiert daraufhin den Datentransfer zum Client mittels der vereinbarten Parameter und der Datenaustausch beginnt. Beim passiven FTP sendet der FTP-Server seine IP-Addresse und einen Port an den Client und wartet dann auf das Eingehen einer Datenverbindung. Der Client beginnt daraufhin die Datenverbindung zu dem ausgetauschten Port, woraufhin der Datenaustausch stattfinden kann. Abbildung 2.9 zeigt noch einmal die beschriebenen Komponenten. Neben der typischen Client-Server Verbindung ist es auch möglich, das zwei FTP- Abbildung 2.9.: FTP-Architektur (angelehnt an [Postel und Reynolds, 1985]) Server Dateien untereinander austauschen. Das Austauschen der Konfigurationsparameter und das steuern der Dateiübertragung erfolgt hierbei durch einen Client [Postel und Reynolds, 1985]. 21 3. Ansatz In diesem Kapitel wird das Konzept des Re-Engineering des Frameworks der Analytics Workbench vorgestellt sowie konzeptionelle Entscheidungen diskutiert. Dazu werden zunächst anhand der in Abschnitt 2.5 vorgestellten Analyse der Analytics Workbench, Anforderungen an das neue Framework aufgestellt. Im darauf folgenden Abschnitt wird die Struktur des Frameworks vorgestellt. Dazu gehört der Aufbau der einzelnen Komponenten sowie der Kommunikationsinfrastruktur. Der letzte Abschnitt beschreibt konkrete Ansätze zur Umsetzung der zuvor beschriebenen Kommunikationsinfrastruktur. 3.1. Anforderungsanalyse Der erste Schritt innerhalb des Softwareentwicklungszyklus ist das Bestimmen von Anforderungen an die zu entwickelnde Anwendung bzw. an das zu entwickelnde System. Dazu wird zunächst eine Problemstellung definiert und daraus die konkreten Anforderungen abgeleitet. 3.1.1. Problemstellung Die in Abschnitt 2.5.5 vorgestellten Probleme innerhalb des Systems erfordern ein ReEngineering des Frameworks. Re-Engineering bedeutet die Erhaltung der Funktionalität, bei gleichzeitiger Steigerung der Softwarequalität [Ebert, 2003]. Verwendet ein Benutzer also die Weboberfläche der Analytics Workbench, um einen Analyseworkflow zu konfigurieren und durchzuführen, bemerkt er das erfolgte Re-Engineering lediglich durch ein stabileres und performanteres System. Auch sollen alle weiteren Besonderheiten, die die Analytics Workbench bietet, wie beispielsweise die Verarbeitung der Daten nach Pipes and Filters-Schema, erhalten bleiben. Dies gilt auch für lose Kopplung zwischen den einzelnen Analysekomponenten. Um die Qualität des Systems zu verbessern, müssen alle Bestandteile betrachtet und teilweise neu konzipiert werden. Herausforderungen sind hierbei die Kommunikation und Synchronisierung zwischen den Elementen sowie der Datenaustausch, die Datenrepräsentation und interne Verarbeitung der Daten. Um die Komplexität bei der Betrachtung des kompletten Systems zu reduzieren, wird eine Unterteilung in Subprobleme vorgenommen. 3.1.2. Kommunikation In Abschnitt 2.5.3 und 2.5.4 wird die Kommunikation innerhalb des bisherigen Frameworks beschrieben. Sämtliche Funktionen, die die bisherige Kommunikationsinfrastruktur bietet, müssen durch die neue Kommunikationsinfrastruktur abgedeckt sein. 23 3. Ansatz Zur Steuerung eines Workflows werden Nachrichten zwischen Node.js-Serverkomponente und den Agenten ausgetauscht. So erfolgt das Starten einer Agenteninstanz durch Nachrichten, die an die Agent-Manager gesendet werden. Sie enthalten zum Zwecke der Zuordnung die Id des Analysemoduls. Während einer Analyse werden Datennachrichten zwischen den einzelnen Agenten ausgetauscht. Diese beinhalten die Id des aktuellen Analysedurchlaufs und die Pipe, in der sich die Daten befinden. Um den aktuellen Status einer Analyse auszulesen oder zu aktualisieren, werden Nachrichten übermittelt, die Informationen über die aktuelle Analyse beinhalten. Resultate werden bisher in einem Result-Repository gespeichert und Informationen über gespeicherte Resultate mittels einer Nachricht mitgeteilt. Für die neue Kommunikationsinfrastruktur müssen Nachrichten spezifiziert werden, die die vorgestellten Funktionen übernehmen können. So muss es Nachrichten geben, die einen Analyseworkflow steuern, wie beispielsweise das Starten einer Agenten-Instanz. Diese Nachrichten sollten eine Zuordnung zu der zugehörigen Analysekomponente beinhalten. Ebenfalls muss ein Austausch von Daten zwischen den einzelnen Agenten realisiert werden. Neben der Übertragung der Nutzlast ist es notwendig, dass Meta-Informationen zu dieser übertragen werden, die die Nutzlast zu einer Analyse und zu einer Pipe zuordnen. Auf diese Weise kann ein Agent filtern, welche Daten für ihn bestimmt sind. Für Informationen bezüglich einer Analyse und der Verarbeitung der Resultate, müssen ebenfalls Lösungen gefunden werden. Um den Status einer Analyse zu bestimmen, müssen Nachrichten ausgetauscht werden, die den aktuellen Status der Analyse beinhalten und sich eindeutig auf diese Analyse beziehen. Resultate müssen gespeichert werden und Informationen über diese Resultate auch zu einem späteren Zeitpunkt abrufbar sein. Für die Benutzerverwaltung, welche in der Weboberfläche Anwendung findet, müssen Repräsentationen gefunden werden. Dies umfasst die Repräsentation von Benutzern, Rollen und Gruppen als auch eine Verbindung zwischen Benutzern und Rollen sowie Benutzern und Gruppen. Ebenfalls müssen von einem Benutzer erstellte Analyseworkflows repräsentiert werden. Für den Austausch von Nachrichten muss ein Nachrichtenaustauschformat festgelegt werden. Dieses muss von allen Bestandteilen des Frameworks interpretiert werden können. Zusätzlich sollte es leichtgewichtig sein und wenig Overhead erzeugen. Zur Kommunikation zwischen den einzelnen Agenten sowie den Agenten und der Node.jsServerkomponente muss eine Kommunikationskomponente verwendet werden, die ein Publisher/Subscriber-Verfahren unterstützt. Diese wird benötigt, da Agenten selbst keine Kenntnis darüber besitzen welche anderen Agenten aktiv sind und somit keine direkte Verbindung aufgebaut werden kann. Weiterhin muss es eine Möglichkeit geben, Daten dauerhaft zu persistieren. Dies ist relevant für die Benutzeroberfläche. Gespeicherte Analyseworkflows sollten zu jedem Zeitpunkt abrufbar sein. Alle Probleme, die innerhalb der bisherigen Kommunikationsinfrastruktur bestehen (s. Abschnitt 2.5.5), sollten behoben werden. Dies betrifft den Austausch von Daten über 4 Megabyte als auch das Verbinden von vielen Analysekomponenten. 3.1.3. Aufbau des Frameworks Für die Problemstellung sind alle Bestandteile des kompletten Frameworks, das heißt das Agenten-Framework, die Node.js-Serverkomponente sowie die zentrale Kommunikationskomponente, zu berücksichtigen. 24 3.1. Anforderungsanalyse Auf Basis der Funktionalitäten des bisherigen Agenten-Frameworks, beschrieben in Abschnitt 2.5.4 und 2.5.3, müssen folgende Eigenschaften erfüllt sein: Ein Agent-Manager muss mit der zentralen Kommunikationskomponente verbunden sein und auf eingehende Nachrichten warten, die das Starten einer Agenteninstanz bedingen. Gleichzeitig muss der Agent-Manager in der Lage sein, gestartete Agenteninstanzen wieder zu beenden, sei es, weil dieser seine Aufgabe erfüllt hat oder erzwungen beendet werden soll. Gestartete Agenteninstanzen müssen mit der zentralen Kommunikationskomponente verbunden sein und auf eingehende Daten warten. Erreichen sie Daten, müssen diese verarbeitet werden und das Ergebnis wieder der zentralen Kommunikationskomponente mitgeteilt werden. Ist eine Analyse abgeschlossen, müssen die Resultate gespeichert werden. Dies geschieht bisher durch eine Infrastruktur-Komponente, dem ’Result Collector’. Dieser erkennt, ob alle Agenten, die am Ende eines Analyseworkflows stehen, eine Ausgabe produziert haben und schreibt diese in das Result-Repository. Hier sollte eine neue Lösung entwickelt werden, die performanter ist und ohne zusätzliche Infrastruktur-Komponente realisiert werden kann. Die Steuerung eines Workflows erfolgt über die Node.js-Serverkomponente, daher ist es sinnvoll, auch das Sammeln von Resultaten in den Aufgabenbereich der Node.js-Serverkomponente zu legen. Ebenfalls sollten von Agenten produzierte Zwischenergebnisse nach Abschluss einer Analyse gelöscht werden, da diese nicht mehr benötigt werden. Ausgeführt werden die einzelnen Analysekomponenten durch einen Executor. Dieser muss gegebenenfalls an das neue Framework angepasst werden. Die Node.js-Serverkomponente muss der neuen Kommunikationsinfrastruktur angepasst werden. Auch müssen Funktionalitäten zur Kontrolle über eine Analyse umgesetzt werden. Hierzu gehört das Übersetzen eines Analyseworkflows in eine für die Agenten verständliche Repräsentation sowie den Zustand eines Analysedurchlaufs zu erkennen und Resultate zu verarbeiten. Durch den Einsatz in verschiedenen Forschungsprojekten, wie z.B. KOLEGEA und GoLab, haben sich auch die Anforderungen an die Analytics Workbench verändert. Dort, wo das System ursprünglich ausreichend war hinsichtlich seiner Skalierbarkeit, stellen es andere Einsatzgebiete vor Herausforderungen, die es nicht bewältigen kann. Entsprechend ist es wünschenswert bei dem Re-Engineering des Frameworks darauf Wert zu legen, auch auf sich verändernde Anforderungen reagieren zu können. Dies betrifft vor allem den Nachrichten- und Datenaustausch. Das Framework sollte so gestaltet sein, dass ein Entwickler zwischen verschiedenen Nachrichten- und Datenaustauschverfahren wählen und gegebenenfalls sein Eigenes hinzufügen kann. 3.1.4. Anforderungen Aus der beschriebenen Problemstellung leiten sich die nachfolgenden Anforderungen an das Framework ab. 1. Alle für die Analytics Workbench typischen Merkmale sollen erhalten bleiben. Dies betrifft die lose Kopplung zwischen den Analysekomponenten als auch die Datenverarbeitung nach dem Pipes and Filters-Prinzip. 25 3. Ansatz 2. Alle Funktionen, die die Benutzeroberfläche bietet, müssen erhalten bleiben. Darunter sind Benutzerverwaltung und Funktionen, wie das Speichern und Laden von erstellten Analyseworkflows. 3. Die Unabhängigkeit bzw. lose Kopplung zwischen den einzelnen Agenten impliziert eine indirekte Kommunikation. Dies bedeutet, dass die Kommunikation über eine Zwischeneinheit erfolgen muss, die alle Agenten kennt und Nachrichten an entsprechende Agenten weiterleitet. 4. Dadurch, dass mehrere Agenten vom selben Typ innerhalb eines Workflows existieren können, ist es notwendig, die Agenten zu verwalten. Relevante Analysedaten müssen an den korrekten Agenten weitergeleitet werden. 5. Für die Kommunikation zwischen den Agenten und der Kommunikation zwischen den Agenten und der Node.js-Serverkomponente, welche beide indirekt erfolgen, wird eine Kommunikationskomponente benötigt, die ein Publisher/Subscriber-Verfahren unterstützt. Dies ist nötig, da sich die einzelnen Komponenten nicht kennen und somit kein direkter Kommunikationsweg möglich ist. 6. Zur Kommunikation zwischen den Agenten als auch mit allen anderen Komponenten, muss ein Dateiaustauschformat gefunden werden. Dieses muss leichtgewichtig sein und von allen Kommunikationsteilnehmern verarbeitet werden können. 7. Die Art und Weise wie Zwischenergebnisse verarbeitet werden, muss definiert werden. 8. Das Framework sollte in der Lage sein auch Analysedaten über 4 Megabyte behandeln zu können. 9. Auch bei großen, komplexen Analysen mit vielen Agenten soll das System skalieren und stabil bleiben. 10. Das Framework muss abstrakt genug sein, um die Kommunikationskomponente leicht austauschen zu können. 11. Die Node.js-Serverkomponente muss einen durch den Benutzer erstellten Workflow für die Agenten verständlich umwandeln. Sie muss dazu mit den Agenten in Verbindung stehen. 12. Nach Abschluss einer Analyse müssen die Ergebnisse gespeichert werden und sollten zu jedem Zeitpunkt abrufbar sein. 13. Analysekomponenten müssen gestartet werden können. Dazu muss es eine ausführende Komponente geben, die gleichzeitig globale, für das System relevante Parameter an die Agenten übergeben kann. Weiterhin sollte diese Komponente initial alle vorbereitenden Maßnahmen treffen, wie beispielsweise das Konfigurieren der Kommunikationskomponente. 14. Die Kommunikationskomponente muss über Sicherheitsmechanismen verfügen, die einen ungewollten Eingriff von außerhalb des Systems verhindern. 26 3.2. Aufbau des Frameworks 3.2. Aufbau des Frameworks Der konzeptuelle Aufbau des Frameworks beginnt mit den Konzepten zur Verbindung und Kommunikation zwischen den einzelnen Agenten. Hier wird eine neue Kommunikationsinfrastruktur beschrieben, insbesondere mit Hinblick auf die Probleme der bisherigen Kommunikationsinfrastruktur. Danach folgt die Struktur des Agenten-Frameworks, welches für die Analyseaufgaben verantwortlich ist. Zuletzt werden Konzepte für die Node.js-Serverkomponente betrachtet. 3.2.1. Verbindungen und Kommunikation Bevor der Aufbau des Frameworks genauer vorgestellt wird, sollen an dieser Stelle allgemeine Konzepte hinsichtlich Verbindungen zwischen den Komponenten und das der Verbindungsverwaltung vorgestellt werden. Die konkrete Umsetzung der allgemeinen Ansätze wird im weiteren Verlauf beschrieben. 3.2.1.1. Anzahl der Verbindungen Bisher stellt sich die Situation wie folgt dar (siehe Abbildung 3.1): Jeder Agent-Manager hält eine Verbindung zu der zentralen Kommunikationskomponente. Gleiches gilt für die zu einem Agent-Manager gehörigen Agenteninstanzen. Dies ist notwendig, um Nachrichten zu empfangen, die bestimmte Ereignisse auslösen. Dies kann beispielsweise der Start eines Agenten sein oder der Beginn einer Analyse. Pro Analysekomponente existieren also eine plus n weitere Verbindungen, je nach Anzahl der Agenteninstanzen. Dies bietet zwar eine hohes Maß an Unabhängigkeit zwischen dem Agent-Manager und seinen Agenteninstanzen, sorgt aber gleichzeitig für eine höhere Belastung der Kommunikationskomponente. Werden m Analysekomponenten gestartet, die wiederum n Agenteninstanzen starten, ergeben sich m · (1 + n) = m + m · n aufgebaute Verbindungen. Abbildung 3.1.: Verbindungen pro Manager und Agenteninstanzen 27 3. Ansatz Da der Agent-Manager und seine Agenteninstanzen eng miteinander verbunden sind, ist eine weitere Verbindungskonfiguration denkbar. Anstatt einer neuen Verbindung für jedes Element, kann der Agent-Manager eine Verbindung aufbauen und diese mit seinen Agenteninstanzen teilen. Dadurch wird die Kommunikationskomponente entlastet. Pro Analysekomponente existiert nur noch eine Verbindung, d.h. bei n Analysekomponenten werden nur n Verbindungen aufgebaut (siehe Abbildung 3.2). Durch das Verwenden der Verbindung des Agent-Managers, sind die Agenten-Instanzen abhängiger von diesem. Ebenfalls ist der Aufwand, die Nachricht dem korrekten Empfänger zuzuordnen, höher. Erreicht eine Nachricht eine Analysekomponente, muss diese intern entscheiden, ob die empfangene Nachricht an den Agent-Manager oder an eine seiner zugehörigen Agenteninstanzen weitergeleitet wird. Wenn die Nachricht zu einer Agenteninstanz gehört, muss diese zusätzlich bestimmt werden. Abbildung 3.2.: Verbindungen pro Analysekomponente Um die Verbindungsanzahl weiter zu reduzieren, können Agenten als zusammengehörige Gruppe definiert werden (im Folgenden auch Agenten-Bundle genannt) (siehe Abbildung 3.3). Eine solche Gruppe beinhaltet Analysekomponenten, die innerhalb der selben Java Virtual Machine laufen. Dies können Analysekomponenten sein, die besonders häufig in einzelnen Workflows Anwendung finden oder einen ähnlichen Aufgabenbereich haben. Das Besondere hierbei ist, dass sich alle Analysekomponenten eine Verbindung zur Kommunikationskomponente teilen. Das heißt trotz einer beliebigen Anzahl von Analysekomponenten, bleibt nur eine Verbindung offen. Dadurch wird die Kommunikationskomponente stark entlastet, die Hauptkomplexität liegt bei den Analysekomponenten. Die Performanz dieser Verbindungskonfiguration hängt von der Anzahl der Analysekomponenten und der Agenteninstanzen innerhalb der Gruppe ab. Verwenden viele Analysekomponenten die gleiche Verbindung, wird diese stark beansprucht, was zur Überlastung oder zu einem Flaschenhalseffekt führen kann. Die Konfiguration eines solchen Agenten-Bundles kann zu Problemen führen, für den Fall, eine Analysekomponente in zwei Agenten-Bundles vorkommt. Dies führt zu einem fehlerhaften Zustand der betroffenen Analysekomponente. Die Wahl, der geeigneten Verbindungskonfiguration, hängt von der Kommunikationskomponente und dem gegebenen Anwendungsszenario ab. Bei einer gut skalierenden 28 3.2. Aufbau des Frameworks Abbildung 3.3.: Verbindungen pro Agenten-Gruppe Kommunikationskomponente kann die erste Konfiguration gewählt werden. Hat die Kommunikationskomponente Schwierigkeiten mit einer großen Menge an Verbindungen, bietet sich die zweite Konfiguration an. Die letzte Konfiguration ist ein Spezialfall. Anwendung findet dieser, wenn es gewünscht ist, das einzelne Analysekomponenten zusammengefasst werden. Welcher Anwendungsfall vorliegt, muss ein Benutzer mit administrativen Aufgaben entscheiden. Zu dem Zwecke bietet das neu gestaltete Framework eine Option mit der die Verbindungskonfiguration festgelegt werden kann 1 . 3.2.1.2. Nachrichten- und Datenaustausch Bisher findet innerhalb der Analytics Workbench keine Trennung zwischen Nachrichten statt. So werden Nachrichten mit Nutzlast auf dieselbe Art und Weise übertragen wie Nachrichten, die lediglich zur Koordination dienen. Wie in Abschnitt 2.5.3 beschrieben, gibt es drei verschiedene Nachrichtentypen, die für das System relevant sind. Zwischen den einzelnen Agenten und der Node.js-Serverkomponente werden Koordinationsnachrichten ausgetauscht. Zwischen den Agenten selbst werden Datennachrichten ausgetauscht. Letztendlich gibt es noch Informationsnachrichten, die nur für die Node.jsServerkomponente relevant sind. Diese umfassen beispielsweise gespeicherte Analysen oder von einem Benutzer erstellte Analyseworkflows. Zum Zwecke der Optimierung des Kommunikationsflusses, bietet sich eine Unterteilung an. Koordinationsnachrichten sollten über ein Kommunikationsmedium ausgetauscht werden, das seine Vorzüge in einem effizienten Nachrichtenaustausch hat, Datennachrichten über ein Kommunikationsmedium, das spezialisiert ist auf das Speichern und Abrufen von Dateien. Für die Informationsnachrichten wird eine Kommunikationskomponente benötigt, welche Informationen persistieren kann und auf Abruf zur Verfügung stellen kann. Gespeicherte Analysen und Analyseworkflows sollen auch zu einem späteren Zeitpunkt abrufbar sein können. Am stärksten frequentiert ist der Austausch von Koordinations- und Datennachrichten. Dementsprechend müssen die Kommunikationskomponenten 1 Näheres dazu in Abschnitt 3.2.2.3 29 3. Ansatz für diese Nachrichtentypen skalierbar sein. Gänzlich trennen lassen sich Koordination- und Datennachrichten nicht. Datennachrichten enthalten neben ihrer Nutzlast noch Informationen über den relevanten Empfänger und Informationen über die Nutzdaten. Um dies auch weiterhin zu gewährleisten, werden Datennachrichten aufgeteilt. Zunächst wird die Nutzlast bei der Kommunikationskomponente, die für das Speichern und Abrufen von Daten verantwortlich ist, hinterlegt. Danach wird eine Koordinationsnachricht an die Nachrichtenaustauschkomponente gesendet, die alle relevanten Informationen über die Nutzlast enthält. Diese Informationen beinhalten eine Zuordnung zu der aktuellen Analyse sowie einem Empfänger und einem Verweis auf die Nutzlast. Der Verweis innerhalb der Nachricht ermöglicht den Abruf der Nutzlast. Abbildung 3.4 zeigt die Architektur des gesamten Systems mit dem neu- Abbildung 3.4.: Architekturübersicht mit neuem Kommunikationsmodell en Kommunikationsmodell. Im Vergleich zu der bisherigen Architektur aus Abbildung 2.8 gibt es keine zentrale Kommunikationskomponente mehr. Stattdessen beinhaltet sie drei Kommunikationskomponenten, jeweils für verschiedene Aufgaben. Alle Analysekomponenten sowie die Node.js-Serverkomponente sind mit der Nachrichtenaustauschund Datenaustauschkomponente verbunden. Über diese Komponenten läuft, wie beschrieben, sämtliche Kommunikation hinsichtlich der Koordination und des Datenaustausches während einer Analyseaufgabe. Mit der Informationsspeicher-Komponente ist lediglich die Node.js-Serverkomponente verbunden. Hier werden Daten (Nachrichten) gespeichert, die für die Funktionalität der Weboberfläche und der Benutzerverwaltung relevant sind. 3.2.1.3. Datenaustauschformat und Nachrichtenspezifikation Wie in Abschnitt 2.1 beschrieben, ist innerhalb eines Multiagentensystems ein Datenaustauschformat erforderlich, welches alle Kommunikationsteilnehmer verarbeiten können. Dieses sollte leichtgewichtig sein und von allen für das System relevanten Programmiersprachen unterstützt werden. Hier ist die Wahl auf das Json-Format gefallen. Zum einen, weil es leichtgewichtig ist und zum anderen, weil es bereits innerhalb der auf JavaScript 30 3.2. Aufbau des Frameworks basierenden Node.js-Serverkomponente verwendet wird und gleichzeitig auch von der Programmiersprache Java unterstützt wird, auf der das Agenten-Framework basiert. Hinsichtlich der genauen Spezifikation der Nachrichten ist es sinnvoll, diese entsprechend der im vorherigen Abschnitt beschriebenen Kommunikation aufzuteilen. Dies bedeutet eine Aufteilung in Koordinationsnachrichten, Datennachrichten und Informationsnachrichten, welche für die Benutzeroberfläche relevant sind. Diese sollen im Folgenden weiter spezifiziert werden. Die Nachrichten werden nach dem Muster Name der Nachricht → Nachrichteninhalt beschrieben. Koordinationsnachrichten umfassen die Nachrichten CoordinationMessage, ErrorMessage, RunMessage und ResultMessage: • CoordinationMessage → {runid, agentstate, instanceid, agentid, pipes, parameters}. Sie dient dazu, den Status der Agenten zu repräsentieren. Die Felder runid, instanceid und agentid geben an, zu welchem Agent in welchem Workflow die Nachricht gehört. Das Feld agentstate repräsentiert den aktuellen Zustand des Agenten und das Feld parameters enthält Parameter, die für den Agenten relevant sind. Für die Zuordnung der ausgehenden Pipes ist das Feld pipes verantwortlich. • ErrorMessage → {runid, agentid, instanceid, message}. Die Felder runid, agentid und instanceid dienen der genauen Bestimmung des fehlerhaften Agenten. Im Feld message wird die Ursache des Fehlers angegeben. Datennachrichten: • DataMessage → {runid, pipe, payload}. Das Feld runid ordnet die Nachricht dem entsprechenden Analyseworkflow zu, Pipe spezifiziert hierbei die relevante Pipe eines Agenten (s. CoordinationMessage). Payload beinhaltet Informationen über die Nutzlast und einen Pfad, auf dem diese hinterlegt ist. Zu den Informationsnachrichten gehören WorkflowSaveMessage sowie Nachrichten für das Benutzermanagement: • WorkflowSaveMessage → {workflowid, name, description, workflow, userid, savedate}. Die WorkflowSaveMessage wird generiert, wenn der Benutzer innerhalb der Benutzeroberfläche seinen erstellten Analyseworkflow speichert, um ihn später wieder abrufen zu können. Für den Analyseworkflow wird eine Id generiert und im Feld workflowid gespeichert. Des Weiteren kann der Benutzer noch einen Namen angeben und eine Beschreibung. Die Zuordnung des Workflows zum Benutzer erfolgt über das Feld userid. Der Aufbau des Workflows wird im Feld workflow gespeichert. Das Erstellungsdatum wird im Feld savedate hinterlegt. • UserMessage → {userid, username, password, email}. Eine User-Message repräsentiert einen Benutzer. Für diesen wird eine Id generiert. Des Weiteren werden der Benutzername, Password und E-Mail des Benutzers gespeichert. • RoleMessage → {roleid, rolename}. Um innerhalb der Benutzerverwaltung verschiedenen Benutzern verschiedene Rechte zuweisen zu können, werden RoleMessages verwendet. Diese beinhalten eine ID und den Namen der Rolle. • GroupMessage → {groupid, groupname}. Benutzer können Gruppen zugeordnet werden. Hierzu werden Group-Messages verwendet. Diese beinhalten eine ID und den Gruppennamen. 31 3. Ansatz Eine Besonderheit stellen RunMessage- und ResultMessage-Nachrichten dar. Diese gehören sowohl zur Kategorie Koordinationsnachrichten als auch zur Kategorie der Informationsnachrichten. Zu den Koordinationsnachrichten werden sie gezählt, da sie während einer Analyse Rückmeldung über den aktuellen Status einer Analyse geben als auch signalisieren, wenn ein Resultat erstellt ist. Zu den Informationsnachrichten gehören sie, da sie für die Benutzeroberfläche benötigt werden, um durchgeführte Analysen inklusive Resultate abrufen zu können. • RunMessage → {runid, workflowid, userid, date, status, name, description}. RunMessage-Nachrichten beinhalten Informationen über den Status eines Analysedurchlaufs. Sie enthalten über die Felder runid und workflowid eine Zuordnung zu dem aktuellen Analyseworkflow und über das Feld userid eine Zuordnung zu dem Benutzer, der die Analyse durchführt. Die Felder date, status, name und description sind Eigenschaften des Durchlaufs, zu denen beispielsweise Datum und Uhrzeit, Name und Beschreibung sowie Angaben über den Erfolg oder Misserfolg der Durchführung. • ResultMessage → {runid, agentid, link, name, description}. Resultate von Analyseabläufen werden in ResultMessages abgebildet. Dazu erfolgt mittels runid und agentid eine Zuordnung zu dem Agenten, der das Resultat innerhalb eines Durchlaufs produziert hat. Um auf das Resultat zuzugreifen, wird der Link zu dem Resultat in dem Feld link gespeichert. Die Felder name und description beinhalten Name und Beschreibung des Resultats. Für die Benutzerzuordnung gibt es noch weitere Nachrichtentypen, die dem Benutzer eine Gruppe und eine Rolle zuordnen sowie Workflows und Analysedurchläufe zu Gruppen. Diese beinhalten jeweils die Ids der zuzuordnenden Elemente, beispielsweise {userid, groupid}. Um alle für die Weboberfläche verfügbaren Analysekomponenten zu repräsentieren, dienen AgentDescriptionMessages. Sie beinhalten eine Beschreibung der Komponente. 3.2.2. Struktur des Agenten-Frameworks Das Agenten-Framework dient als grundlegende Struktur für die Entwicklung von Analysekomponenten und soll in der Programmiersprache Java entwickelt werden. Dennoch ist es möglich, Agenten in anderen Programmiersprachen zu entwickeln. Diese müssen lediglich in die neue Kommunikationsinfrastruktur eingebunden werden. Wie in Abschnitt 2.5.4 beschrieben, bestehen Analysekomponenten immer aus einem Agent-Manager und einem Agenten, von dem zur Laufzeit mehrere Instanzen existieren können. Abbildung 3.5 verdeutlicht den Sachverhalt. Um die Entwicklung von Analysekomponenten zu vereinfachen und zu vereinheitlichen, werden bei der Entwicklung von Agent-Manager und Agent die Klassen AgentManager und Agent erweitert. Im Folgenden sollen der Aufbau und die Aufgaben der Klassen AgentMananger und Agent sowie des Executors, der für das Ausführen von Analysekomponenten verantwortlich ist, vorgestellt werden. Des Weiteren wird die Umsetzung der im vorherigen Abschnitt beschriebenen Konzepte der Verbindungen und der Verbindungsverwaltung beschrieben. Zur Nomenklatur: Im Nachfolgenden wird die Kommunikationskomponente für den Austausch von Koordinationsnachrichten als Nachrichtenaustauschkomponente, die Kommunikationskomponente für den Austausch von binären Daten als Datenaustauschkom- 32 3.2. Aufbau des Frameworks ponente und die Kommunikationskomponente für den Austausch von Nachrichten, welche lediglich relevant sind für die Node.js-Serverkomponente, als InformationsspeicherKomponente bezeichnet. Abbildung 3.5.: Vereinfachte Darstellung des Vererbungsmodells von Agent und AgentManager 3.2.2.1. AgentManager Das Klassendiagramm in Abbildung 3.6 zeigt die Klasse AgentManager mit allen Attributen und Methoden. Sie ist die Basis für alle Agent-Manager der Analysekomponenten und stellt Möglichkeiten zur Verwaltung der Agenteninstanzen bereit. Diese kann beispielsweise Agenten starten und beenden oder den Status eines Agenten aktualisieren. Wird eine Instanz eines AgentManagers erzeugt, verbindet dieser sich zunächst mit der Nachrichtenaustauschkomponente (Methode initialize()). Je nach Konfiguration verwendet der AgentManager eine Verbindung, die zuvor bereits erstellt wurde (wenn als Verbindungsoption ’Agent-Bundle’ gewählt wird) oder bekommt eine Neue von der Verbindungsverwaltung zugewiesen. Ist die Verbindung aufgebaut, registriert sich der AgentManager auf CoordinationMessages (s. 3.2.1.3). Erreicht ihn eine CoordinationMessage (Methode notifyManager()), die für ihn relevant ist, also die Id der zu dem Manager gehörigen Analysekomponente beinhaltet, ruft er die Methode createAgent() auf. Diese ist im AgentManager nur abstrakt definiert, da die Umsetzung dieser Methode innerhalb des konkreten Agent-Managers geschieht. Nach der Registrierung sendet der AgentManager eine für ihn spezifische AgentDescription-Nachricht an die Nachrichtenaustauschkomponente und signalisiert damit, dass die zu dem Manager zugehörige Analysekomponente für Analyseaufgaben verfügbar ist (Methode createAndSendDescription()). Während seiner Laufzeit, die über das boolesche Attribut isAlive charakterisiert wird, sendet er alle 60 Sekunden seine AgentDescription-Nachricht um anzuzeigen, dass er weiterhin existiert. Hat sich der Status eines Agenten verändert, wird der Manager benachrichtigt (Methode notifyManager()). Der Status eines Agenten kann unter normalen Umständen RUNNING 2 , DONE3 und ERROR4 sein. In all diesen Fällen wird 2 laufend abgeschlossen 4 fehlerhaft 3 33 3. Ansatz eine CoordinationMessage mit dem aktuellen Status an die Nachrichtenaustauschkomponente gesendet (Methode updateAgentState()). Im Falle von DONE oder ERROR wird der entsprechende Agent beendet und aus der Liste der verwalteten Agenten entfernt. Eine Besonderheit ist der Status FINISH 5 . Dieser wird verwendet, wenn eine Analysekomponente gezwungenermaßen gestoppt werden soll. In diesem Fall wird keine Nachricht an die Kommunikationskomponente gesendet. Stattdessen der Agent beendet und aus der Liste aller verwalteten Agenten entfernt. Um den Agent-Manager zu stoppen, wird die Methode shutdown() verwendet. Sie beendet alle Agenten, meldet sich von der Nachrichtenaustauschkomponente ab und schließt je nach Verbindungstyp die Verbindung. Im Falle des Verbindungstyps ’Agent-Bundle’ darf die Verbindung nicht geschlossen werden, da dies Auswirkungen auf alle anderen Analysekomponenten hat. Die Liste selfDescriptionMessages beinhaltet alle AgentDescription-Nachrichten, die an die Kommunikationskomponente gesendet wurden. Das Attribut coordinationMessageTemplate ist ein Json-Objekt und beinhaltet den Namen der Analysekomponente, wie dieser in der Weboberfläche dargestellt ist. Es wird verwendet für den Registrierungsvorgang bei der Nachrichtenaustauschkomponente. ManagerName beschreibt den Namen des Agent-Managers. Das Attribut dataConnection repräsentiert eine Verbindung zur Datenaustauschkomponente. Dieses findet keine direkte Verwendung innerhalb des Managers und ist außer im Falle des Verbindungstyps ’Agent-Bundle’ auch nicht initialisiert. Um zu bestimmen, um welchen Verbindungstyp es sich handelt, wird das Attribut connectionType verwendet. Diese erhält der Manager bei seiner initialen Ausführung. Problematisch ist die strikte Trennung zwischen Verwaltungs- und Analyseeinheit nur Abbildung 3.6.: Klassendiagramm des AgentManagers (getter und setter-Methoden nicht in Darstellung) in dem seltenen Fall, dass vor dem Erstellen eines Agenten bereits Daten für diesen 5 beendet 34 3.2. Aufbau des Frameworks vorhanden sind. Diese würden den Agenten niemals erreichen. Um dies zu verhindern, müsste ein Agent-Manager zusätzlich noch auf eingehende Datennachrichten warten und diese sammeln. Vor dem Starten eines Agenten müsste er dann überprüfen, ob für diesen Agenten bereits eine Datennachricht verfügbar ist. Ist dies der Fall, muss er diese dem Agenten übergeben. Dies bedeutet einen höheren Verwaltungsaufwand für ein sehr unwahrscheinliches Ereignis und soll deshalb an dieser Stelle vernachlässigt werden. 3.2.2.2. Agent Als Ergänzung zu der Klasse AgentManager dient die Abstrakte Klasse Agent als Basis für alle Agenten der Analysekomponenten. Abbildung 3.7 zeigt das zugehörige Klassendiagramm. Eine Instanz der Agenten-Klasse einer Analysekomponente wird durch den zugehörigen Agent-Manager erstellt und existiert so lange, bis der Agent Analysedaten erhalten und verarbeitet hat. Um Analysedaten zu erhalten, registriert sich der Agent bei der Nachrichtenaustauschkomponente auf DataMessages (initializeAgent()). Dazu wird je nach konfiguriertem Verbindungstyp eine neue Verbindung erstellt (im Falle von einzelnen Verbindungen pro Agent bzw. Agent-Manager) oder die Verbindung von dem Agent-Manager übernommen. Ähnliches gilt für die Datenverbindung. Diese wird auch neu erstellt, wenn die Nachrichtenverbindung von dem Agent-Manager übergeben wird. Lediglich im Falle der Verbindungsoption ’Agent-Bundle’ verwendet der Agent eine zuvor erstellte Datenverbindung. Welche DataMessages für den Agenten relevant sind, wird durch die eingehenden Pipes der Analysekomponente bestimmt, welche in der Weboberfläche festgelegt werden können (s. Abschnitt 2.5). Die Pipes werden in dem Json-Objekt dataStructure gespeichert. Neben der Registrierung bei der Kommunikationskomponente wird entschieden, ob der Agent ein Ausgabeagent ist. Ausgabeagenten sind diejenigen Agenten, die sich am Ende der Analyse befinden und eine Ausgabe produzieren, sei es in Form von abrufbaren Daten oder einer Visualisierung der Analyseergebnisse. Falls ein Agent ein Ausgabeagent ist, erstellt er bevor er beendet wird, eine ResultMessage-Nachricht und schreibt das Resultat in das Result-Repository. Diese Nachricht wird verwendet, um dem Benutzer nach dem Abschluss der Analyse die Ergebnisse anzeigen zu können oder Ergebnisse von bereits durchgeführten Analysen abrufen zu können. Erreicht den Agenten eine für ihn relevante DataMessage (notifyMessage()), fängt der Agent mit der eigentlichen Analysearbeit an (handleDataMessage()). Dazu extrahiert er sich aus der DataMessage den Pfad zu den Nutzdaten, die zu der DataMessage gehören (s. 3.2.1.3) und lädt diese mittels seiner Datenverbindung herunter. Um keine Überreste zu hinterlassen, werden die heruntergeladen Daten von der Datenaustauschkomponente gelöscht. Haben den Agenten alle zur Analyse benötigten Daten erreicht, wird die Methode executeAgent() aufgerufen. Diese ist in der Klasse Agent nur abstrakt definiert, da jeder Agent eine andere Analyse durchführt und die Klasse Agent nur die Basis für alle Agenten darstellt. Ist die Analyse durchgeführt, werden die Daten, auf denen die Analyse durchgeführt wurde, bei der Datenaustauschkomponente hinterlegt. Nach dem Vorgang wird eine DateMessage erstellt, die neben den Informationen über die Nutzlast einen Pfad zu den hinterlegten Daten enthält. Diese DataMessage wird an die Nachrichtenaustauschkomponente gesendet. Danach ändert der Agent seinen Status auf DONE und benachrichtigt seinen zugehörigen Agent-Manager. Dieser beendet den Agenten. 35 3. Ansatz Abbildung 3.7.: Klassendiagramm des Agenten (getter und setter-Methoden sowie Hilfsmethoden nicht in Darstellung) 36 3.2. Aufbau des Frameworks 3.2.2.3. Executor, Verbindungsverwaltung und Konfiguration Der Executor dient, wie in der Ursprungsversion des Frameworks, zur Ausführung von Analysekomponenten. Diese zu startenden Komponenten werden in einer XML-Datei konfiguriert. Beim Ausführen des Executors wird diese eingelesen und die entsprechenden Komponenten gestartet. Eng verbunden mit dem Executor ist die Verbindungsverwaltung. Für die Umsetzung der in Abschnitt 3.2.1 beschriebenen Konzepte, gehört zu dem Framework eine Verbindungsverwaltung. Diese ist Verantwortlich für das Erstellen der Verbindungen zu den jeweiligen Kommunikationskomponenten. Da das Erstellen der Verbindungen nicht innerhalb der einzelnen Analysekomponenten geschieht, werden so Inkonsistenzen verhindert. Weiterhin wird die Kommunikationsschicht abstrahiert, sodass neue Verbindungswege leicht hinzugefügt werden können. Das Festlegen der Verbindungskonfigurationen für das Agenten-Framework erfolgt über eine Konfigurationsdatei, die beim Starten des Executors geladen wird. Innerhalb dieser kann über Attribute festlegt werden, welcher Verbindungstyp sowie welche Kommunikationskanäle Verwendung finden sollen. Diese Verbindungskonfiguration ist gültig für alle Komponenten, die mittels eines Executors gestartet werden. Auf diese Weise ist es möglich, verschiedene Analysekomponenten mit unterschiedlichen Verbindungskonfigurationen zu starten. Die Verwaltung der Verbindungen erfolgt über einen Connection-Client. Dieser dient als Schnittstelle zur Erstellung von Nachrichten- und Datenverbindungen, gleichzeitig hält er im Falle des Verbindungstyps ’Agenten-Bundle’ eine globale Nachrichten- und Datenverbindung. Um zu verhindern, dass an mehreren Stellen innerhalb des Systems ein neuer Connection-Client instanziiert wird, ist der Connection-Client als Singleton realisiert. Dies garantiert, dass nur eine Instanz des Connection-Clients existiert. Das Erstellen neuer Nachrichten- bzw. Datenverbindungen erfolgt über das Abstrakte Farbik-Entwurfsmuster (s. 2.3.4), zu sehen in Abbildung 3.8. Für jede Nachrichten- bzw. Datenverbindung gibt es eine konkrete Fabrik, die das Interface AbstractConnectionFactory realisiert. Eine konkrete Fabrik ist dafür verantwortlich eine zugehörige, konkrete Nachrichten- beziehungsweise Datenverbindung zu erstellen. Die konkreten Nachrichten- bzw. Datenverbindungen implementieren die Interfaces MessageConnection bzw. DataConnection. Deren kompletter Aufbau ist in den Abbildungen 3.10, 3.12, 3.13 und 3.14 zu sehen. Ob eine neue Nachrichten- bzw. Datenverbindung aufgebaut wird oder auf die Globalen des Connection-Clients zurückgegriffen wird, hängt je von gewählter Verbindungsart ab. Bei der Option ’Einzelne Verbindungen’ erstellen Agent-Manager und Agent mittels Connection-Client jeweils eigene Verbindungen. Anders verhält es sich im Falle der Option ’Manager-basiert’. Hier erstellt lediglich der Manager neue Verbindungen und gibt diese beim Erstellen des Agenten an diesen weiter. Im Falle der Option ’Agenten-Bundle’ greifen Agent-Manager und Agenten aus dem ’Agenten-Bundle’ auf die globalen Verbindungen des Connection-Clients zu. Diese werden zuvor durch den Executor erstellt. 37 3. Ansatz Abbildung 3.8.: Verbindungsverwaltung als abstrakte Fabrik 38 3.2. Aufbau des Frameworks 3.2.3. Node.js-Serverkomponente Die Node.js-Serverkomponente ist für die Benutzeroberfläche und die Koordination der einzelnen Analysekomponenten während einer Analyse verantwortlich. Im Zuge des ReEngineering und den damit einhergehenden Veränderungen, sind auch Anpassungen an der Node.js-Serverkomponente vorzunehmen. Die Veränderungen betreffen vor allem die Kommunikation mit allen anderen Framework-Komponenten aus ihrer direkten Umgebung. 3.2.3.1. Verbindungen und Konfiguration Die Node.js-Serverkomponente benötigt Verbindungen zu allen Kommunikationskomponenten; zur Nachrichtenaustauschkomponente, um die Analyse zu steuern, zur Datenaustauschkomponente, für den ’Direct Uploader’ und zur Informationsspeicherkomponente, um Daten hinsichtlich der Weboberfläche zu speichern. Um auch hier den Ansatz so flexibel wie möglich zu halten, gibt es für jeden Kommunikationstyp eine implementierte Verbindung. Eine Umsetzung mit Interfaces ist hier nicht möglich, da die Node.js-Serverkomponente auf der Programmiersprache JavaScript basiert, in welcher kein Interface-Konzept vorgesehen ist. Daher müssen die Namen der Methoden in allen verwendeten Verbindungsansätzen gleich lauten, zur Laufzeit werden dann die korrekten Methoden aufgerufen. Dieser Ansatz wird als ’Duck-typing’ bezeichnet. Welche Verbindung konkret verwendet wird, entscheidet sich anhand eines Attributs in einer Konfigurationsdatei. Diese ist eine JavaScript-Datei, die eine direkt Verarbeitung innerhalb der Node.js-Serverkomponente ermöglicht. Durch die drei Attribute messageConnection, dataConnection und workbenchConnection wird festgelegt, welche konkrete Kommunikationskomponente verwendet wird. Dazu gibt es drei weitere Attribute, die messageConnectionConfig, die dataConnectionConfig und die workbenchConnectionConfig, in denen Verbindungsparameter, wie Adresse zur Komponente und Port, gespeichert sind. 3.2.3.2. Erkennen von aktiven Analysekomponenten Beim Aufbau der Benutzeroberfläche muss die Node.js-Serverkomponente in der Lage sein, alle verfügbaren Analysekomponenten zu erkennen und entsprechend dem Benutzer anzuzeigen. Realisiert wird dies durch AgentDescriptionMessage-Nachrichten, die von den Agent-Managern versendet werden. Um eine solche AgentDescriptionMessageNachricht auch zu einem beliebigen Zeitpunkt zu erhalten, verwendet die Node.js-Serverkomponente einen Broadcast-Ansatz. Hierzu sendet sie eine Nachricht mit dem Inhalt {broadcast:true} an alle Analysekomponenten und wartet dann auf eingehende Nachrichten. Die Analysekomponenten senden bei Erhalten der Broadcast-Nachricht ihre AgentDescriptionMessage-Nachricht. Diese werden von der Node.js-Serverkomponente gesammelt und dem Benutzer angezeigt. 39 3. Ansatz 3.2.3.3. Sammeln von Resultaten Die Resultate einer Analyse sollen dem Benutzer nach erfolgreichem Durchlaufen angezeigt werden. Der Ablauf ist also Folgender: Ausgabe-Analyseagenten schreiben Resultate in das Result-Repository und benachrichtigen mit einer ResultMessage-Nachricht die Node.js-Serverkomponente darüber. Diese ResultMessage-Nachrichten werden verwendet, um die Ergebnisse zu laden, sobald die Analyse abgeschlossen ist. Dazu muss entschieden werden können, zu welchem Zeitpunkt eine Analyse abgeschlossen ist. Dies ist der Fall, wenn alle Analysekomponenten erfolgreich ihre Arbeit abgeschlossen haben oder, falls ein Agent fehlerhaft, ist, alle anderen möglichen Agenten abgearbeitet wurden. Der Status eines Agenten ist innerhalb der CoordinationMessage-Nachrichten enthalten. Um abzugleichen, wie viele Agenten noch besucht werden müssen bzw. besucht werden können, kann ein Analyseworkflow als gerichteter, azyklischer Graph gesehen werden. Vor dem Beginn einer Analyse wird eine Liste aufgebaut, die alle möglichen Knoten, also Analysekomponenten, enthält. Ist eine Analysekomponente abgeschlossen, wird diese aus der Liste der Knoten entfernt. Abgeschlossen ist eine Analyse, wenn die Liste aller Knote leer ist. Problematisch ist der Fall einer fehlerhaften Analysekomponente. Alle nachfolgenden Komponenten können in diesem Fall nicht mehr besucht werden. In Abbildung 3.9 fällt Analysekomponente 2 aus, die Analysekomponenten 4 und 5 können infolgedessen nicht mehr erreicht werden. Entsprechend müssten die Komponenten aus der Liste der zu erreichenden Knoten entfernt werden. Um dies zu realisieren, kennt jeder Knoten jeden seiner Nachfolger. Diese werden zu Beginn einer Analyse bestimmt. Tritt ein Fehler auf, wird aus der Liste der zu besuchenden Knoten der Knoten entfernt, bei dem der Fehler aufgetreten ist sowie alle Nachfolger dieses Knotens. Abbildung 3.9.: Analyseworkflow als Graph 40 3.3. Kommunikation innerhalb des Frameworks - konkrete Ansätze 3.3. Kommunikation innerhalb des Frameworks - konkrete Ansätze Nach den bereits vorgestellten abstrakten Ansätzen zur Kommunikationsinfrastruktur des Frameworks, sollen in diesem Kapitel konkrete Ansätze zur Realisierung der einzelnen Kommunikationskanäle beschrieben werden. Nach Abbildung 3.4 läuft die Verbindung über drei Kanäle, zu denen Verbindungen umzusetzen sind. Für das AgentenFramework sind diese hauptsächlich die Kommunikationskanäle zum reinen Nachrichtenaustausch und zum Speichern von Zwischenresultaten. Für die Node.js-Serverkomponente kommt weiterhin ein Kommunikationskanal hinzu zum Speichern von sitzungsübergreifenden Daten hinzu. 3.3.1. Nachrichtenaustausch Die konkrete Umsetzung der Nachrichtenkanäle soll hier gezeigt werden. Die eingesetzte Kommunikationskomponente sollte die lose Kopplung zwischen den Agenten unterstützen, das heißt es wird eine Art Publisher/Subscriber-Mechanismus benötigt. Des Weiteren sollte sie auch bei einer hohen Zahl an Klienten gut skalieren und zuverlässig arbeiten. Die Wahl fällt hier auf einen Nachrichtenaustausch über das MQTT-Protokoll mit einem Message-Broker als zentraler Nachrichtenaustauschkanal sowie das Austauschen von Nachrichten über eine PostgreSQL-Datenbank, die über einen Interprozesskommunikationsmechanismus verfügt, wodurch ein Publisher/Subscriber-ähnliches Verfahren realisiert werden kann. 3.3.1.1. MQTT MQTT hat seine stärken vor allem im schnellen Austausch von Nachrichten (s. Abschnitt 2.6.1). Daher eignet es sich in dem Framework der Analytics Workbench als Mittel für den Nachrichtenaustausch. Wie für alle Publisher/Subscriber-basierten Systeme, benötigt MQTT dazu einen Message-Broker. Dieser ist verantwortlich für das korrekte Koordinieren von Nachrichten und Verwalten von Klienten. Übertragen auf das Framework bedeutet dies, dass alle Analysekomponenten sowie die Node.js-Serverkomponente mit dem Message-Broker verbunden sind. Die einzelnen Systembestandteil müssen entsprechende Verbindungen realisieren. Innerhalb des Agenten-Framework wird dazu eine eine MQTTMessageConnection realisiert. Diese ist eine konkrete Implementierung des Interfaces MessageConnection (s. Abschnitt 3.2.2.3 und Abbildung 3.10). Sie baut über setupConnection() eine Verbindung zum Message-Broker auf. Die Kommunikation über den Message-Broker läuft über Topics. Entsprechend werden die einzelnen Nachrichtentypen zu Topics zugeordnet. AgentDescription-Nachrichten laufen über die Topics ’/agentdescription/new’ sowie ’/agentdescription/delete’; Topics für neue AgentDescriptionMessage-Nachrichten sowie für selbige, falls eine Analysekomponente entfernt werden soll. DataMessage-Nachrichten laufen über das Topic ’/data’ ab, CoordinationMessage-Nachrichten über die Topics ’/coordination/new’ und ’/coordination/update’, ErrorMessage-Nachrichten über das Topic ’/error’. Für Nachrichten die Resultate betreffen, wird das Topic ’/result’ verwendet. 41 3. Ansatz Je nach konfiguriertem Verbindungstyp erfolgt das Registrieren auf Topics direkt nach Verbindungsaufbau oder dann, wenn es von Agent beziehungsweise Agent-Manager gewollt ist. Bei dem auf den Agent-Manager basierenden Verbindungstyp sowie ’AgentBundle’ ist es notwendig, sich bereits nach Verbindungsaufbau auf alle relevanten Topics zu registrieren. Andernfalls müsste bei jedem Registrierungswunsch die Verbindung zu dem Message-Broker unterbrochen und wieder neu aufgebaut werden. Dies könnte dazu führen, dass Nachrichten verloren gehen. Die Agent-Manager und Agent relevanten Topics zum Erhalten von Nachrichten sind ’/agentdescription/delete’, ’/coordination/update’ und ’/data’. Die Zuordnung, welche Nachricht für welchen Agent beziehungsweise Agent-Manager relevant ist, erfolgt über zwei Map-Datenstrukturen, die für Agenten und die für Agent-Manager. Sie ordnen ein bestimmtes Nachrichtenmuster einem Agent bzw. einem Agent-Manager zu. Wird eine Nachricht empfangen, wird mittels dieser beiden Map-Datenstrukturen abgeglichen, welcher Agent bzw. Agent-Manager der korrekte Empfänger der Nachricht ist. Über writeDescription() werden lediglich AgentDescriptionMessage-Nachrichten versendet. Neben der Möglichkeit Nachrichten zu empfangen, muss auch die Möglichkeit gegeben sein Nachrichten zu senden. Hierzu wird in den Methoden write(), update() zunächst bestimmt, um welche Art von Nachricht es sich handelt. Ist der Nachrichtentyp zugeordnet, erfolgt ein ’publish’ auf das zu dem Nachrichtentyp gehörige Topic an den Message-Broker. Ähnliches gilt auch für die Node.js-Serverkomponente. Sie muss ebenfalls eine Verbindung zum Message-Broker besitzen. Wie in Abschnitt 3.2.2.3 beschrieben, existiert für JavaScript kein Interface-Konzept. Daher muss darauf geachtet werden, dass alle Umgesetzten Verbindungen dieselben Methoden anbieten. Relevante Topics für das Erhalten von Nachrichten sind hier ’coordination/update’, ’run/update’, ’agentdescription/new’ und ’result’. Diese werden für das Aktualisieren der Benutzeroberfläche und zum Verarbeiten der Analyseresultate verwendet. Abbildung 3.10.: MQTTMessageConnection Klassendiagramm 42 3.3. Kommunikation innerhalb des Frameworks - konkrete Ansätze 3.3.1.2. PostgresSQL PostgreSQL eignet sich für den Einsatz innerhalb der Analytics Workbench aufgrund seines Interprozesskommunikationsmechanismus und der Möglichkeit Daten im JsonFormat zu verarbeiten. Da PostgreSQL ein relationales Datenbanksystem ist (s. Abschnitt 2.6.2), werden Daten auch in Relationen (oder auch Tabellen) gespeichert. Entsprechend müssen Relationen erstellt werden, die die in 3.2.1.3 vorgestellten Nachrichten speichern können. Diese Relationen haben alle das gleiche Schema: {id, Json-Objekt}. Die Id wird durch das Datenbanksystem generiert und das Json-Objekt enthält die Nachricht. Folgende Relationen sind für den reinen Nachrichtenaustausch relevant: AGENTDESCRIPTION, COMMANDMESSAGE, DATAMESSAGE, ERRORMESSAGE. Auf diesen Relationen müssen Trigger implementiert werden, die bei einer Operation auf der Relation (sei es schreiben oder updaten) eine Nachricht über einen bestimmten Kanal senden. Abbildung 3.11 veranschaulicht den Vorgang. Ein Agent setzt einen ’LISTEN COORDINATION NEW’-Befehl ab (1). Danach schreibt die Node.js-Serverkomponente eine neue CoordinationMessage-Nachricht in die Datenbank (2). Infolgedessen wird der Agent benachrichtigt (3). Abbildung 3.11.: Listen/Notify-Mechanismus Ebenfalls wie bei der Verwendung von MQTT, muss für PostgreSQL eine Nachrichtenverbindung sowohl für das Agenten-Framework als auch für die Node.js-Serverkomponente realisiert werden. Diese implementiert ebenso wie die MQTTMessageConnection das Interface MessageConnection. Anstelle des Registrierens auf Topics, wird eine Verbindung zur Datenbank aufgebaut und auf entsprechenden Kanäle gehorcht. Das Empfangen von Nachrichten erfolgt über einen separaten Notifier. Dieser hält im Hintergrund eine Datenbankverbindung aufrecht, empfängt Nachrichten und leitet diese an die PostgresMessageConnection weiter. Die Zuordnung der Nachrichten erfolgt auch hier über zwei Map-Datenstrukturen, eine für die Agenten, eine für Agent-Manager. Beim Schreiben bzw. Veröffentlichen einer Nachricht, wird zunächst bestimmt, um welche Art von Nachricht es sich handelt. Danach wird eine Verbindung zur Datenbank aufgebaut, die Nachricht gespeichert und die Verbindung zur Datenbank wieder geschlossen. 43 3. Ansatz Abbildung 3.12.: PostgresMessageConnection Klassendiagramm 3.3.2. Datenspeicher Neben reinen Nachrichten werden während einer Analyse auch Daten zwischen den einzelnen Analysekomponenten ausgetauscht. Diese werden nicht über den Nachrichtenkanal transportiert, sondern separat gespeichert. Dabei müssen Kommunikationskomponenten gewählt werden, die besonders für den Datentransfer geeignet sind. Hier fällt die Wahl sowohl auf das File Transfer-Protokoll (FTP), ein bewährtes Protokoll zum Austausch von Dateien zwischen zwei Parteien, als auch auf eine PostgreSQL-Datenbank, welche auch das Speichern von binären Daten unterstützt. Innerhalb einer PostgreSQLDatenbank können Daten bis zu einem Gigabyte gespeichert werden 2.6.2. Für FTP gibt es keine Limitierungen hinsichtlich der Datengröße. 3.3.2.1. FTP Das File Transfer Protocol dient zum Austausch von Dateien zwischen Client und Server (s. 2.6.3). Entsprechend eignet es sich zum Austausch von Zwischenergebnissen zwischen verschieden Analysekomponenten. Ähnlich wie bei den Verbindungen zu einem MQTT-Broker oder zur PostgreSQL-Datenbank, müssen entsprechende FTPVerbindungsschichten realisiert werden. 44 3.3. Kommunikation innerhalb des Frameworks - konkrete Ansätze Innerhalb des Agenten-Frameworks ist dies die FTPDataConnection. Diese konkretisiert die Methoden des Interfaces DataConnection. Zum Verbindungsaufbau zu einem FTP-Server wird, neben Url und Port, ein Benutzername und ein Passwort benötigt (setupConnection()). Diese Eigenschaften werden aus der Konfigurationsdatei, die für Umgebungsvariablen verantwortlich ist, extrahiert (s. 3.2.2.3). Da die meisten Netzwerke durch eine Firewall geschützt sind, ist es sinnvoll, passives FTP zu verwenden (s. 2.6.3). Ist die Verbindung aufgebaut, können über writeData() Daten auf den FTP-Server geladen werden. Dazu muss ein Pfad angegeben werden. Dieser setzt sich aus einer generierten Id und einer Dateiendung zusammen. Die Dateiendung ist in den Metadaten über die zu speichernden Daten hinterlegt. Neben dem Pfad muss zusätzlich eine Beschreibung über den Dateiinhalt erfolgen. Dies sind im Falle der ausgetauschten Zwischenergebnisse Binärdateien. Nach der erfolgreichen Dateiübertragung wird die Verbindung wieder getrennt. Zum Dateidownload vom Server muss zunächst eine Verbindung aufgebaut werden. Um eine konkrete Datei zu laden, wird der Pfad zu der Datei angegeben. Daraufhin wird die Datei heruntergeladen und kann von den einzelnen Agenten weiter verarbeitet werden. Um den Server frei von nicht benötigten Dateien zu halten, werden nach erfolgreichem Laden der Daten durch einen Agenten, diese auf dem FTP-Server gelöscht (removeData()). Die Node.js-Serverkomponente benötigt eine FTP-Verbindung lediglich für den ’Direct Uploader’. Abbildung 3.13.: FTPDataConnection Klassendiagramm 45 3. Ansatz 3.3.2.2. PostgreSQL als Speicher für binäre Daten Alternativ zu FTP kann auch PostgreSQL zum Speichern von Zwischenergebnissen verwendet werden. Anstatt die Daten Dateisystemebene zu speichern, werden hier die Daten als BLOB 6 in einer Relation gespeichert. Dazu wird Seitens der PostgreSQL eine neue Relation erstellt, die den Namen ’Data’ trägt. Sie besteht aus den Attributen ’id’ und ’data’. ’id’ besteht aus einer generierten Id und einer Dateiendung. ’data’ beinhaltet die binären Daten. Das Lesen und Speichern von Daten aus bzw. in diese Relation erfolgt durch SQL-Anfragen. Speichern erfolgt über eine ’INSERT INTO ..’-Anfrage und Lesen über eine ’SELECT data FROM data WHERE id = ..’-Anfrage. Zuständig für den Aufbau der Verbindung zur PostgreSQL-Datenbank und zum Speichern der binären Daten ist die PostgresDataConnection. Diese realisiert, wie die FTPDataConnection, das Interface DataConnection. Entsprechend wird bei writeData() eine Verbindung aufgebaut und innerhalb eine Transaktion die Daten in die Relation der Datenbank persistiert. Selbiges Verfahren erfolgt beim Löschen von Daten aus der Relation. Innerhalb einer Transaktion wird die Anfrage ’DELETE FROM data WHERE id = ..’ ausgeführt, wobei ’id’ der für die Datei generierten Id entspricht. Abbildung 3.14.: PostgresDataConnection Klassendiagramm 3.3.3. Sitzungsübergreifende Persistenz Für die Node.js-Serverkomponente ist auch ein Kommunikationskanal von Bedeutung, der es ermöglicht Daten zu speichern, die auch nach Ablauf einer Analyse erhalten bleiben müssen. Dies betrifft Daten zur Benutzerverwaltung, zu durchgeführten Analysen 6 Binary Large Object 46 3.3. Kommunikation innerhalb des Frameworks - konkrete Ansätze und Ergebnissen sowie gespeicherten Analyseworkflows. Entsprechend muss das System, bei dem diese Daten hinterlegt werden sollen einen permanenten Speicher anbieten. Besonders geeignet sind dazu Datenbanksysteme. Weiterhin sollte der Zugriff auf das Speichersystem Daten im Json-Format unterstützen oder es nur einen geringen Aufwand darstellen, die Daten in das für das Speichersystem relevante Format umzuwandeln. Um die Verbindungen zu abstrahieren, werden für jedes gewählte Speichersystem Verbindungen umgesetzt. Diese haben alle dieselben Methoden, wobei die Umsetzung innerhalb der Methoden je nach Kommunikationskanal variiert. Die Logik zum Verbindungsaufbau und die Anfrage werden in die entsprechenden Verbindungsumsetzungen ausgelagert. 3.3.3.1. SQLSpaces SQLSpaces basiert zwar auf einer SQL-Datenbank (s. 2.4), bietet aber durch eine einfache Schnittstelle Zugriff auf das Datenbanksystem und erfordert somit kein Formulieren komplexer Anfragen. Ebenfalls ist das Starten und Konfigurieren eines SQLSpaces-Servers schnell erfolgt. Aus diesen Gründen eignet er sich für den Einsatz als Datenspeicher für die sitzungsübergreifenden Daten, wie zum Beispiel in Kombination mit MQTT-Message Broker als Nachrichtenaustauschkanal und FTP als Datenaustauschkanal. Für den Zugang zu dem SQLSpaces-Server wird, wie bereits erwähnt, eine Verbindung realisiert. Je nach zu speichernden Daten, wird der ’Space’ gewählt, in dem die Daten abgespeichert werden sollen. Der ’Space’ gibt innerhalb eines SQLSpaces-Servers zusammengehörige Tupel an. Alle benutzerrelevanten Tupel werden in dem ’userSpace’ gespeichert, alle anderen im ’defaultSpace’. Da innerhalb der Node.js-Serverkomponente Daten im Json-Format ausgetauscht werden, muss eine Konvertierung in das TupelFormat erfolgen und umgekehrt. Beim Schreiben eines Tupels werden alle Werte der Schlüssel/Werte-Paare eines Json-Objekts in Tupel-Felder überführt. Das so entstandene Tupel wird dann dem SQLSpaces-Server hinzugefügt. Entsprechend werden beim Lesen von Tupeln diese wieder in Json-Objekte überführt. 3.3.3.2. PostgreSQL PostgreSQL kann auch als Komponente für alle sitzungsübergreifende Daten verwendet werden, besonders wenn es bereits als Technologie für den Nachrichten- oder Datenaustausch verwendet wurde. Dazu müssen der Datenbank weitere Relationen hinzugefügt werden. Diese werden zum einen für Benutzer, Rollen und Gruppen verwendet sowie für Relationen, die Benutzer zu Rollen und Gruppen zuordnen. Da PostgreSQL zur Abfrage der Daten die Abfragesprache SQL benutzt, sind Relationen, die lediglich zur Zuordnung dienen nicht notwendig. Über JOINS lassen sich auch Daten über mehrere Relationen abfragen. Da der Ansatz aber so abstrakt wie möglich sein soll und beispielsweise die SQLSpaces keine JOINS unterstützen, werden die Zuordnungen separat gespeichert. Neben den Relationen für die Benutzerverwaltung, muss eine weitere Relation existieren, die erstellte Workflows speichert und eine, die diese den Workflow-Gruppen zuordnet. Weiterhin müssen durchgeführte Analysen sowie Informationen über Resultate in zwei weiteren Relationen gespeichert werden. Ebenfalls muss, wie bei allen anderen Kommunikationskanälen, für die Verwendung innerhalb der Node.js-Serverkomponente eine Verbindung umgesetzt werden. Da PostgreS- 47 3. Ansatz QL das Json-Format unterstützt, müssen die aus der Datenbank gelesene Ergebnisse nicht konvertiert werden, sondern können direkt weiterverarbeitet werden. 48 4. Implementierung In diesem Kapitel sollen Auszüge aus der Implementierung des in Kapitel 3 beschriebenen Konzepts vorgestellt werden. Hierzu werden zunächst verwendete Bibliotheken aufgelistet und kurz skizziert. Darauffolgend wird der Algorithmus des in Abschnitt 3.2.3.3 erläuterten Konzepts zur Bestimmung des Status einer Analyse und des Sammelns von Resultaten vorgestellt. Abgeschlossen wird diese Kapitel durch die Beschreibung des Einsatzes von Triggern auf Relationen der PostgreSQL-Datenbank, die nötig sind, um den Interprozesskommunikationsmechanismus verwenden zu können. 4.1. Verwendete Bibliotheken In diesem Abschnitt sollen alle wichtigen Bibliotheken, die während der Implementierung verwendet worden sind, vorgestellt werden. Diese werden unterteilt in Java-Bibliotheken, die relevant sind für das Agenten-Framework und die JavaScript-Bibliotheken für die Node.js-Serverkomponente. Verwendete Java-Bibliotheken sind Eclipse Paho, PostgresJDBC und Apache Commons. • Eclipse Paho. Eclipse Paho [Foundation, 2015b] bietet Clients zur Kommunikation mit MQTT-Message Brokern in verschiedenen Programmiersprachen, darunter auch Java. Das Aufbauen einer neuen Verbindung erfolgt über eine Url, eine eindeutige Client-Id sowie eine Angabe, wie Nachrichten persistiert werden sollen, solange sie sich im Zustellungsprozess befinden [Foundation, 2014]. Durch MqttConnectionOptions können Optionen festgelegt werden, die die Verbindung betreffen, wie beispielsweise eine clean-session (s. 2.6.1). M q t t C l i e n t c l i e n t = new M q t t C l i e n t ( c o n n e c t i o n U r l , c l i e n t I d , persistence ) ; MqttConnectOptions connOpts = new MqttConnectOptions ( ) ; connOpts . s e t C l e a n S e s s i o n ( true ) ; c l i e n t . c o n n e c t ( connOpts ) ; Ist die Verbindung aufgebaut, kann der MqttClient verwendet werden, um ein Topic zu abonnieren als auch eine Nachricht zu veröffentlichen. // s u b s c r i b e t o t o p i c d a t a c l i e n t . s u b s c r i b e ( ” data ” ) ; // p u b l i s h message t o t o p i c d a t a String content = ” Hello ! ” ; MqttMessage message = new MqttMessage ( c o n t e n t . g e t B y t e s ( ) ) ; c l i e n t . p u b l i s h ( ” data ” , message ) ; 49 4. Implementierung • Postgres-JDBC. Zum Verbindungsaufbau zur PostgreSQL-Datenbank wird die Postgres-JDBC-Bibliothek verwendet [Group, 2013]. Dies ist der JDBC-Treiber für die Postgresql-Datenbank. Seine Verwendung erfolgt ähnlich wie die des Standard JDBC-Treibers. Die Verbindung wird wie folgt aufgebaut: try { C l a s s . forName ( ” o r g . p o s t g r e s q l . D r i v e r ” ) ; } catch ( ClassNotFoundException e ) {} // s e t u p c o n n e c t i o n Connection c o n n e c t i o n = null ; try { c o n n e c t i o n = DriverManager . g e t C o n n e c t i o n ( ” j d b c : p o s t g r e s q l : / / 1 2 7 . 0 . 0 . 1 : 5 4 3 2 / t e s t d b ” , ” t e s t ” , ” 123 ” ) ; } catch ( SQLException e ) {} Ist die Verbindung aufgebaut, können Anfragen durchgeführt werden. Bei datenmanipulierenden Operationen werden Transaktionen verwendet. Ein Beispiel für diese, ist das Folgende: try { c o n n e c t i o n . setAutoCommit ( f a l s e ) ; Statement stmt = c o n n e c t i o n . c r e a t e S t a t e m e n t ( ) ; S t r i n g SQL = ”UPDATE m a h l z e i t e n SET p i z z a a n z a h l = 3 WHERE p i z z a a n z a h l = 1 ” ; stmt . executeUpdate (SQL) ; c o n n e c t i o n . commit ( ) ; } catch ( SQLException e ) { connection . rollback () ; } • Apache Commons. Apache Commons ist eine Sammlung von Bibliotheken für die Programmiersprache Java, entwickelt von der Apache Software Foundation [Foundation, 2015a]. Diese unterstützen den Entwickler bei Aufgaben wie dem versenden von E-Mails, dem Hochladen von Dateien, der Durchführung einer Konvertierung oder Input/Ouput-Operationen. Unter der großen Anzahl an Komponenten befindet sich Apache Commons Net. Sie bietet Implementierungen von Netzwerkprotokollen unter anderem auch für FTP. Im folgenden Beispiel wird das Aufbauen einer Verbindung, das Herunterladen einer Datei vom Server und das Speichern einer Datei auf dem Server gezeigt. FTPClient c l i e n t = new FTPClient ( ) ; // c o n n e c t t o f t p s e r v e r w i t h g i v e n u r l and p o r t c l i e n t . connect ( url , port ) ; // l o g i n w i t h username and password c l i e n t . l o g i n ( username , password ) ; // download f i l e 50 4.2. Status und Resultate eines Analyseworkflows client . retrieveFileStream ( path to file ) ; // u p l o a d f i l e c l i e n t . s e t F i l e T y p e (FTP. BINARY FILE TYPE) ; c l i e n t . s t o r e F i l e ( p a t h f o r f i l e , inputstream with data ) ; // d i s c o n n e c t c l i e n t . disconnect () ; Innerhalb Node.js-Serverkomponente werden Bibliotheken verwendet, um eine Verbindung zu einer PostgreSQL-Datenbank, zu einem MQTT-Message Broker und zu einem FTP-Server herzustellen. • node-postgres. Für die Verbindung zur PostgreSQL-Datenbank wird die Bibliothek node-postgres verwendet, welche in JavaScript entwickelt ist. Sie unterstützt Connection-Pooling, parametrisierte Anfragen sowie asynchrone Benachrichtigungen durch den Interprozesskommunikationsmechanismus von PostgreSQL [C, 2010]. • mqtt.js. Als Client für die Verbindung zum MQTT-Message Broker wird die Bibliothek mqtt.js verwendet. Sie bietet alle Features, wie beispielsweise das Veröffentlichen von Nachrichten, das Abonnieren von Topics und Empfangen von asynchronen Benachrichtigungen bei eintreffenden Nachrichten. Bei der Verbindung können weitere Optionen angegeben werden, wie die Client-Id, die clean-session oder der Benutzername und das Password [Collina und Rudd, 2011]. • node-ftp. Zum Herunterladen und Hochladen von Dateien von/zu einem FTPServer wird für die Node.js-Serverkomponente die Bibliothek node-ftp verwendet. Sie bietet eine Implementierung aller in RFC 959 spezifizierten FTP-Befehle, darunter auch das Speichern und Herunterladen von Dateien [White, 2011]. 4.2. Status und Resultate eines Analyseworkflows Um zu bestimmen, zu welchem Zeitpunkt eine Analyse abgeschlossen ist, wird ein Analyseworkflow in Liste aller Analysemodule überführt. Der zugehörige Algorithmus soll in dem nachfolgenden Abschnitt vorgestellt werden. Im darauffolgenden Abschnitt wird erläutert, wie die Liste der Analysemodule während einer Analyse verwendet wird. 4.2.1. Überführen eines Analyseworkflows in eine Liste Wenn ein Benutzer eine Analyse startet, wird der zu der Analyse gehörige Workflow in eine Liste von Analysemodulen, die alle ihre Nachfolger kennen, überführt. Dies ist notwendig, um während der Analyse festzustellen, welche Analysekomponenten bereits abgearbeitet wurden. Die Kenntnis über sämtliche Nachfolger wird benötigt, um im Falle einer fehlerhaften Komponente alle nachfolgenden Komponenten bestimmen zu können. Diese können aufgrund des Fehlers nicht mehr erreicht werden und dürfen nicht in der Liste der noch abzuarbeitenden Komponenten erhalten bleiben. Gespeichert ist ein Analyseworkflow als eine Menge von Modulen und Relationen zwischen den Modulen und kann als gerichteter, azyklischer Graph betrachtet werden. Die 51 4. Implementierung einzelnen Analysemodule repräsentieren hierbei Knoten des Graphen. Um alle Nachfolger eines Moduls zu finden, wird für jedes Modul eine Tiefensuche zur Traversierung des Graphen durchgeführt. Der komplette Algorithmus hierzu, findAllSuccessors, wird in Listing 1 beschrieben. Beim Aufruf des Algorithmus ist die Liste ’result’ leer, danach wird initial das Ausgangsmodul hinzugefügt. In einem nächsten Schritt werden alle direkten Nachfolger dieses Moduls bestimmt. Dies geschieht über den Algorithmus, findDirectSuccesors (Listing 2). Dieser nimmt ein Modul entgegen und durchläuft alle Relationen (wires). Ist das übergebene Modul der Ausgangspunkt einer Relation, wird der Liste der direkten Nachfolger des Moduls das Modul übergeben, welches als Endpunkt der Relation angegeben ist. Die auf diese Weise gefundenen direkten Nachfolger eines Moduls werden durchlaufen und für jeden Nachfolger rekursiv erneut der Algorithmus findAllSuccessors aufgerufen. Das Resultat ist eine Liste aller Module. Jedes Modul innerhalb dieser Liste, enthält eine weitere Liste, die alle Nachfolger dieses Moduls beinhaltet. Algorithm 1 Finden aller Nachfolger eines Moduls function findAllSuccessors(module, result) result ← result ∪ module children ← findDirectSuccesors(module) for child in children do findAllSuccessors(child, result) end for end function Algorithm 2 Finden der direkten Nachfolger eines Moduls function findDirectSuccesors(module) children ← empty for wire in wires do if wire.source == module then children ← children ∪ wire.target end if end for return children end function 4.2.2. Abarbeiten der Analysemodule und Resultate Das Resultat der beiden zuvor beschriebenen Algorithmen, eine Liste aller Module mit deren Nachfolgern, wird während einer Analyse benötigt und dementsprechend Zwischengespeichert. Trifft während einer Analyse eine CoordinationMessage ein, wird überprüft, welchen Status das durch die CoordinationMessage beschriebene Analysemodul hat. Ist der Status 3, also die Analyse des Moduls erfolgreich abgeschlossen, wird aus der Liste aller Module das abgeschlossene Analysemodul entfernt. Komplizierter ist der Sachverhalt im Falle eines fehlerhaften Analysemoduls. Hier wird aus der gespeicherten Liste das betroffene Modul sowie dessen Nachfolger gesucht. Diese werden geschlossen aus der gesamten Liste aller Module entfernt. Auf diese Weise werden nicht mehr erreichbare Module entfernt. Im nächsten Schritt wird überprüft, ob die Liste leer ist. 52 4.3. PostgreSQL: Datenbank Initialisierung und Trigger Eine leere Liste bedeutet eine abgeschlossene Analyse. Während einer Analyse erreichen die Node.js-Serverkomponente ResultMessage-Nachrichten von Analysemodulen, die Resultate in das Result-Repository geschrieben haben. Diese empfangenen Informationen über ein geschriebenes Resultat werden in der Informationsspeicher-Komponente hinterlegt. Ist die Analyse abgeschlossen, werden diese Informationen abgerufen und dem Benutzer angezeigt. 4.3. PostgreSQL: Datenbank Initialisierung und Trigger Wird PostgreSQL als Nachrichtenaustausch-, Datenaustauschkomponente oder zur Speicherung von Informationen für die Benutzeroberfläche verwendet, müssen bei der ersten Benutzung Relationen erstellt werden. Dies geschieht zum einen innerhalb des AgentenFrameworks durch den Executor und zum anderen innerhalb der Node.js-Serverkomponente beim Startvorgang. Innerhalb des Agenten-Frameworks gibt es zusätzlich die Unterscheidung hinsichtlich der Verwendung der PostgreSQL-Datenbank als Nachrichten- oder Datenaustauschkomponente oder beider Komponenten gleichzeitig. Dies erfolgt über Boolesche Attribute, die anhand der festgelegten Konfiguration gesetzt werden. Um zunächst zu überprüfen, ob eine Tabelle angelegt werden muss oder ob sie bereits existiert, wird die Anfrage ’SELECT relname FROM pg class WHERE relname = ’relation relation’; ausgeführt. Ist das Ergebnis dieser Anfrage leer, wird über ’CREATE TABLE table name ..’ die neue Tabelle erstellt. Um den Interprozesskommunikationsmechanismus, dessen Verwendung innerhalb des Frameworks in Abschnitt 3.3.1.2 beschrieben wird, nutzen zu können, müssen Datenbanktrigger umgesetzt werden. Diese finden Anwendung auf Relationen, die für Benachrichtigungen bei Veränderungen relevant sind, so z.B. für die Relation CoordinationMessage, die alle CoordinationMessage-Nachrichten beinhaltet. Ein Datenbanktrigger ist eine Funktion, die ausgelöst wird, sobald bestimmte, festgelegte Bedingungen bei einer Operation auf einer Relation eintreten. Listing 4.1 zeigt den Code, der einen Trigger auf der Relation CoordinationMessage definiert. Dieser wird ausgeführt vor dem Einfügen einer neuen Zeile in die Relation. Die Hauptfunktionalität, nämlich das Auslösen der Benachrichtigung, findet in Zeile 3 statt. Hier wird die Funktion pg notify aufgerufen, eine Funktion der PostgreSQLDatenbank, die als ersten Parameter den Kanal erwartet und als zweiten Parameter die Nachricht, die über den angegeben Kanal verschickt werden soll. In diesem Fall soll über den Kanal ’coordination new’, die neu eingefügte Zeile als Json-Objekt versendet werden. Die Überführung der neuen Zeile in ein Json-Objekt geschieht über die Funktion row to json(). Listing 4.1: Trigger auf der Relation coordinationmessage 1 2 3 4 5 6 7 CREATE FUNCTION c o o r d i n a t i o n n e w ( ) RETURNS t r i g g e r AS $$ BEGIN PERFORM p g n o t i f y ( ’ c o o r d i n a t i o n n e w ’ , r o w t o j s o n (NEW) : : t e x t ) ; RETURN NEW; END; CREATE TRIGGER c o o r d i n a t i o n n e w BEFORE i n s e r t ON c o o r d i n a t i o n m e s s a g e FOR EACH ROW EXECUTE PROCEDURE c o o r d i n a t i o n n e w ( ) ; 53 5. Anwendungsbeispiel In diesem Kapitel soll die Tragfähigkeit des neuen Frameworks gezeigt werden. Dazu wird zunächst ein Analyseworkflow, der im Rahmen des KOLEGEA-Projekts relevant ist, verwendet. Dieser wird mit einer großen Menge Analysedaten durchgeführt. Dies ist mit dem ursprünglichen Framework nicht möglich. Danach erfolgt ein Performancetest des neuen Frameworks. Hier wird ein Analyseworkflow verwendet, der eine große Zahl von Agenten beinhaltet und in verschiedenen Konfigurationen durchgeführt wird. 5.1. Analysesystem Alle im Folgenden durchgeführten Analysen und Tests werden auf einem System mit diesen Spezifikationen durchgeführt: Name Reihe Prozessor Arbeitsspeicher Festplatte Betriebssystem Browser MacBook Pro Ende 2011 2,4 GHz Intel Core i5 8 GB 1333 MHz DDR3 256 GB SSD (M4-CT256M4SSD2) OS X Yosemite (10.10.5) Google Chrome v. 45.0.2454.85 (64 Bit) Sämtliche Nachrichten- als auch Datenaustauschkomponenten laufen lokal auf dem angegebenen System. Als MQTT-Message Broker wird Apache ActiveMQ (Version 5.12.0) verwendet. PostgreSQL findet in der Version 9.4.1.1 Anwendung. Als FTP-Server wird der Betriebssystemeigene FTP-Server verwendet. 5.2. Beispielanalyse im Rahmen des KOLEGEA Projektes Das Verwenden von Analysedaten über 4 Megabyte ist innerhalb des bisherigen Frameworks der Analytics Workbench nicht möglich. Anhand einer Analyse aus dem KOLEGEAProjekt soll gezeigt werden, dass das neue Framework auch große Datenmengen behandeln kann. 55 5. Anwendungsbeispiel 5.2.1. Analysedaten Bei den Analysedaten handelt es sich um Daten im Json-Activity Stream-Format [Snell et al., 2011], welches verwendet wird, um Aktivitäten innerhalb sozialer Webapplikationen aufzuzeichnen. Ein Beispiel für einen Eintrag im Activity Stream- Format zeigt Listing 5.1. Listing 5.1: Beispiel eines Json-ActivityStreams { 1 " published " : " 2 0 1 5 -0 2 -0 5 T 1 5 : 0 4 : 5 5 Z " , " actor " : { " objectType " : " person " , " id " : " stefan " , }, " verb " : " add " , " object " : { " objectType " : " video " , " video " : { " link " : " www . somelink . de " } }, " target " : { " objectType " : " blog " , " id " : " Stefans Blog " , } 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 } 18 Die Einträge sind Event-Logs aus der KOLEGEA-Plattform. Dies kann beispielsweise das Login eines Benutzers sein. Insgesamt befinden sich in der Datei 38528 Event-Logs, bei einer Dateigröße von 22,4 Megabyte. 5.2.2. Analyseworkflow Abbildung 5.1 zeigt den Analyseworkflow. Das Modul ’Data Repository’ liest Daten im Json-Format vom Webserver. Die Daten werden in den ’Stream Filter’ weitergeleitet. Hier werden sie im Activity Stream-Format nach bestimmten Kriterien gefiltert. In diesem Beispiel werden Einträge ausgeschlossen, deren ’actor’ die ’role’ ’admin’ hat, also alle Aktivitäten, die ein Administrator des Portals durchgeführt hat. Die gefilterten Einträge werden im Modul ’Sequencial Pattern Mining’ einer Sequenzmuster-Erkennung unterzogen. Die Ergebnisse der Sequenzmuster-Erkennung werden durch das ’Table Viewer’Modul in eine Tabelle überführt. Ein Ausschnitt des Analyseergebnisses wird in Abbildung 5.2 dargestellt. 56 5.2. Beispielanalyse im Rahmen des KOLEGEA Projektes Abbildung 5.1.: KOLEGEA Analyseworkflow Abbildung 5.2.: Ergebnis der Analyse 5.2.3. Ergebnisse Der beschriebene Workflow wird in verschiedenen Konfigurationen jeweils fünf mal durchgeführt. Dabei wird die Zeit gestoppt. Das Messen der Zeit erfolgt programmatisch. Beginn der Zeitmessung ist das Laden der Datei durch das Modul ’Data Repository’. Die Zeitmessung endet nach dem Schreiben der Resultate durch das Modul ’Table Viewer’. Die Zeiten werden in Sekunden angegeben. Die Darstellung der Ergebnisse erfolgt in Form einer Tabelle, in der der Mittelwert der benötigten Zeit für verschiedene Konfigurationen abgetragen ist. In der ersten Spalte sind alle möglichen Verbindungsarten aufgelistet, d.h. einzelne Verbindung pro Agent und Manager, eine Verbindung pro Manager und eine Verbindung pro ’Agenten-Bundle’. In der ersten Zeile sind alle Kombinationen möglicher Technologien dargestellt, beispielsweise MQTT zum Nachrichtenaustausch und FTP als Datenspeicher. Nach diesem Schema sind auch alle weiteren Kombinationen dargestellt, wie zunächst die Komponenten zum Nachrichtenaustausch, danach die Komponenten zum Datenaustausch. 57 5. Anwendungsbeispiel Einzelne Verbindungen Manager-basierte Verbindungen Agenten-Bundle MQTT + FTP 28,996 26,184 24,587 MQTT + PSQL 17,925 20,082 18,872 PSQL + FTP 27,823 28,082 26,657 PSQL + PSQL 21,778 22,493 21,591 5.3. Performancetest Eine Anforderung an das System ist, seine Stabilität und Performanz auch bei einer großen Anzahl an Agenten. Um das neue Framework hinsichtlich seiner Tragfähigkeit zu überprüfen, wird ein Performancetest durchgeführt. Dazu wird ein Analyseworkflow erstellt, der durch viele Analysemodule künstlich vergrößert wird. Dieser Analyseworkflow führt bei Verwendung innerhalb des alten Frameworks zu einem fehlerhaften Systemzustand und letztendlich dazu, dass das gesamte System nicht mehr nutzbar ist. 5.3.1. Analyseworkflow und Testdaten Abbildung 5.3 zeigt einen Auschnitt des für den Performancetest verwendeten Analyseworkflows (der gesamte Workflow befindet sich auf dem Datenträger in Anhang B). Dieser beinhaltet 54 Analysemodule. Darunter befinden sich auch Analysemodule, die mehr als einmal verwendet wurden. Die Berechnung der Anzahl aufgebauter Verbindungen funktioniert wie folgt: Pro Agent-Manager einer Analysekomponente wird eine Verbindung aufgebaut, außer im Fall der Verbindungsoption ’Agenten-Bundle’. Ist die gewählte Verbindungsoption einzelne Verbindungen pro Agent-Manager und Agenten herzustellen, wird für jede erstellte Agenten-Instanz eine weitere Verbindung erstellt. Die einfachste Rechnung ist die für die Verbindungsoption ’Agenten-Bundle’. Hier ist die Verbindungszahl pro gestarteter Analysekomponenten-Gruppe konstant eins. Im Falle der Verbindungsoption, dass pro Agent-Manager eine Verbindung aufgebaut wird, ist die Verbindungszahl gleich den gestarteten Analysekomponenten. So gibt es im Falle des Beispiel-Workflows 11 Verbindungen. Bei der Verbindungsoption, dass pro AgentManager und Agenten eine Verbindung hergestellt wird, werden 11 Verbindungen für die Agent-Manager und zusätzlich Weitere für die Agenteninstanzen aufgebaut. Da sich in dem Analyseworkflow 54 Analysemodule befinden, werden 53 Agenteninstanzen erstellt (für den ’Direct Uploader’ wird keine Agenteninstanz erstellt, da er Teil der Node.jsServerkomponente ist). Dies bedeutet, dass insgesamt 64 Verbindungen aufgebaut werden. Als Testdaten dient der Inhalt einer gml-Datei mit einer Größe von 201 Kilobyte. Die Datei beinhaltet einen in Textform überführten Graphen, repräsentiert durch einzelne Knoten und Kanten, die Knoten zueinander zuordnen. 58 5.3. Performancetest Abbildung 5.3.: Ausschnitt des Analyseworkflows zur Performanceanalyse 5.3.2. Durchführung Der zuvor vorgestellte Analyseworkflow wird in verschiedenen Kombinationen zwischen Kommunikationskanälen und Verbindungskonfigurationen jeweils fünf mal ausgeführt. Die erste Kombination bildet MQTT als Medium für den Nachrichtenaustausch mit FTP für den Datenaustausch. Weitere bestehen in der Verbindung von MQTT mit PostgreSQL für den Datenaustausch sowie PostgreSQL als Nachrichtenaustauschkomponente mit FTP. Eine weitere Möglichkeit bildet PostgreSQL für beide Kommunikationswege. Für jeden Durchlauf wird die benötigte Zeit bestimmt. Dies erfolgt innerhalb der Node.jsServerkomponente. Die Messung beginnt, sobald der Analyseworkflow gestartet wird (der Benutzer klickt auf ’Execute’ innerhalb der Weboberfläche) und endet, sobald die Analyse abgeschlossen ist (s. 3.2.3.3 und 4.2). Die Zeitangabe erfolgt in Sekunden. 5.3.3. Ergebnisse Die Ergebnisse der Performancetests werden nachfolgend in drei Tabellen dargestellt, jeweils für die entsprechende Verbindungskonfiguration. Die einzelnen Spalten repräsentieren die Kombinationen der verschiedenen Kommunikationskanäle. Durchlauf 1. 2. 3. 4. 5. Mittelwert MQTT + FTP 42,488 41,25 41,454 44,541 38,599 41,6664 MQTT + PSQL 26,824 24,193 23,443 23,927 23,277 24,3328 PSQL + FTP 40,188 43,365 42,514 42,42 39,317 41,5608 PSQL + PSQL 26,27 26,757 27,109 26,406 27,18 26,7444 Tabelle 5.1.: Ergebnisse für einzelne Verbindungen für Agent-Manager und Agenten 59 5. Anwendungsbeispiel Durchlauf 1. 2. 3. 4. 5. Mittelwert MQTT + FTP 44,417 41,47 40,514 42,697 41,15 42,0496 MQTT + PSQL 25,624 25,136 24,13 24,637 24,685 24,8424 PSQL + FTP 58,950 58,464 49,658 50,542 51,000 53,7228 PSQL + PSQL 34,643 29,726 28,319 32,276 30,365 31,0658 Tabelle 5.2.: Ergebnisse für eine Verbindung pro Manager Durchlauf 1. 2. 3. 4. 5. Mittelwert MQTT FTP 74,394 81,207 77,346 62,654 62,654 71,651 + MQTT PSQL 37,569 31,926 31,957 32,016 33,897 33,473 + PSQL + FTP 77,877 76,381 77,795 72,079 70,939 75,0142 PSQL + PSQL 42,599 43,891 38,58 51,843 45,503 44,4832 Tabelle 5.3.: Ergebnisse für ein Agenten-Bundle 5.4. Auswertung Für die Beispielanalyse aus dem KOLEGEA-Projekt 5.2 liefern die Kombinationen MQTT mit PostgreSQL und PostgreSQL für alle Kommunikationswege die schnellsten Ergebnisse (Mittelwerten 18,96 und 21,95 Sekunden). Das lässt den Rückschluss zu, dass FTP als Datenaustauschkanal für dieses Anwendungsbeispiel langsamer ist als PostgreSQL. Auch erkennt man, dass die Zeiten zwischen den einzelnen Konfigurationsvarianten nicht stark variieren. Dies liegt daran, dass Dank der wenigen verwendeten Analysemodule die Verbindungsanzahl nicht drastisch steigt. Die verwendeten Analysemodule könnten auch zu einem ’Agenten-Bundle’ gruppiert werden. Auch im Performancetest schneidet die Kombination aus MQTT und PostgreSQL, mit Mittelwerten von 24,3228 Sekunden, 24,8424 Sekunden und 33,473 Sekunden am besten ab. Betrachtet man im Vergleich die Zeiten zwischen den Konfigurationen in Tabelle 5.3.3 und in Tabelle 5.3.3, lässt sich erkennen, dass die Zeiten nahe beieinander liegen, außer im Falle von PostgreSQL und FTP. Dies zeigt, dass die gewählten Nachrichtenaustauschkomponenten gut skalieren, aber auch, dass die Konfiguration ’Agent-Manager’ trotz der reduzierten Zahl an Verbindungen und der höheren Komplexität auf Seiten der Analysekomponenten nahezu die gleiche Leistung bringen kann. Bei der Verwendung der Verbindungskonfiguration ’Agenten-Bundle’ steigen die benötigten Zeiten zum Abarbeiten des Workflows stark an. Sind es bei einzelnen Verbindungen die Mittelwerte 41,6664 Sekunden, 24,3328 Sekunden, 41,5608 Sekunden und 26,7444 Sekunden, steigt diese bei der Verbindungskonfiguration ’Agenten-Bundle’ auf 62,654 Sekunden, 33,897 Sekunden, 70,939 Sekunden und 45,503 Sekunden. Dieses Ergebnis ist zu erwarten, da durch die einzelne Verbindung, die sich alle Agent-Manager und Agenten 60 5.4. Auswertung teilen, ein Flaschenhals-Effekt erzeugt wird. Ein solcher Analyseworkflow ist daher kein Anwendungsbeispiel für die Verbindungskonfiguration ’Agenten-Bundle’. Insgesamt zeigt sich, dass das neue Framework sowohl große Datenmengen verarbeiten kann als auch unter Last und bei einer Vielzahl von Analysekomponenten stabil bleibt. Als Speicher für binäre Daten schneidet in den Anwendungsbeispielen PostgreSQL besser ab als FTP. Für den Nachrichtenaustausch liegen MQTT und PostgreSQL gleich auf. 61 6. Zusammenfassung und Ausblick 6.1. Zusammenfassung Im Rahmen dieser Masterarbeit wurde ein Re-Engineering des Frameworks der Analytics Workbench durchgeführt. Hierzu wurde die Struktur aller im Framework befindlichen Komponenten überarbeitet und zusätzlich eine neue Kommunikationsinfrastruktur konzipiert und realisiert. Statt wie bisher über eine zentrale Kommunikationskomponente, verläuft der Kommunikationsfluss über verschiedene Kommunikationskanäle, die jeweils für unterschiedliche Aufgaben verantwortlich sind. So gibt es einen Kommunikationskanal für den reinen Nachrichtenaustausch, einen für das Speichern von Resultaten als auch einen, der für das Speichern von binären Daten verantwortlich ist. Daten, die auch nach einer Analyse verfügbar sein müssen, wie beispielsweise die durch einen Benutzer gespeicherten Analyseworkflows, werden über einen vierten Kommunikationskanal gespeichert. Dadurch kann für jeden dieser Aufgabenbereiche eine Technologie eingesetzt werden, die für die jeweilige Aufgabe geeignet ist. Im Rahmen dieser Arbeit wurde hierzu das Nachrichtenaustauschprotokoll MQTT und PostgreSQL für den reinen Nachrichtenaustausch verwendet so wie FTP und PostgreSQL zum Speichern von binären Daten. Analyseübergreifende Daten können auf einem SQLSpaces-Server oder ebenfalls in einer PostgreSQL-Datenbank hinterlegt werden. Die Wahl des Kommunikationsmediums, erfolgt durch einen administrativen Benutzer. Da sich in Zukunft die Anforderungen an die Analytics Workbench ändern können und mit diesen auch die Anforderungen an die verwendeten Technologien, wurde das Framework so flexibel und abstrakt wie möglich gestaltet, sodass leicht neue Technologien eingesetzt werden können. Um die Belastung, die auf den Kommunikationskomponenten liegt zu verringern, wurden neue Verbindungsmodelle gestaltet. Bisher hielten innerhalb einer Analysekomponente der Agent-Manager und seine Agenten jeweils eine Verbindung aufrecht. Dies hatte mehrere Verbindungen pro Analysekomponente zur Folge. Da Agent-Manager und zugehörige Agenten auch als logische Einheit betrachtet werden können, wurde eine Verbindungskonfiguration hinzugefügt, sodass sich Agent-Manager und zugehörige Agenten eine Verbindung teilen. Weiterhin wurde eine zusätzliche Verbindungskonfiguration vorgestellt, die es ermöglicht, mehrere Analysekomponenten zu einer Einheit zusammenzufassen. Diese zusammengefassten Analysekomponenten teilen sich eine Verbindung. Welches Verbindungsmodell zum Einsatz kommt, entscheidet der Benutzer über einen Eintrag in einer Konfigurationsdatei. Neben der Gestaltung einer neuen Kommunikationsinfrastruktur wurde auch die Struktur der Analysekomponenten und der Node.js-Serverkomponente verändert. Insbesondere wurden diese an die neue Kommunikationsinfrastruktur angepasst. Des Weiteren wurden neue Lösungsansätze gestaltet, wie beispielsweise ein Mechanismus zur Erkennung abgeschlossener Analysen und die Bereitstellung der Ergebnisse dieser für den Benutzer. 63 6. Zusammenfassung und Ausblick Um die Tragfähigkeit des neuen Frameworks zu demonstrieren, wurde zum einen eine Analyse aus dem KOLEGEA-Projekt verwendet. Diese wurde mit Analysedaten durchgeführt, die das vorherige Framework nicht behandeln konnte. Zum anderen wurde ein Performancetest für unterschiedliche Kommunikationskanäle und Verbindungskonfigurationen durchgeführt. Hierzu wurde eine Analyse entworfen, die durch das Hinzufügen mehrerer Analysekomponenten künstlich vergrößert wurde. 6.2. Ausblick Das Verwalten von Analysekomponenten und Festlegen von Konfigurationen kann benutzerfreundlicher gestaltet werden. Bisher ist es möglich, mittels Executor Analysekomponenten zu starten, die dann zu einer Gruppe zusammengefasst werden können. Dies ist unter Umständen problematisch. Fügt ein Benutzer in zwei verschiedenen Gruppen dieselbe Analysekomponente ein, führt dies zu einem fehlerhaften Zustand des Systems. Sinnvoll wäre daher eine Verwaltungskomponente einzusetzen, die es ermöglicht, Analysekomponenten zu starten und zu beenden als auch Verbindungskonfigurationen festzulegen und Analysekomponenten zu gruppieren. Dies kann beispielsweise über eine Weboberfläche erfolgen, die gleichzeitig dafür sorgt, dass ein Benutzer bei der Konfiguration der Analysekomponenten keinen Fehler begehen kann. So kann die Verwaltungskomponente dafür sorgen, dass eine zu einer Gruppe hinzugefügte Analysekomponente nicht zu einer weiteren Gruppe hinzugefügt werden kann. Neben dem neu gestalteten Framework ist es sinnvoll, die Benutzeroberfläche der Analytics Workbench ebenfalls zu überarbeiten. Dies betrifft zum einen die Darstellung von Ergebnissen, zum anderen die Benutzerfreundlichkeit. Dem Benutzer sollte die Fehlermeldung eines Moduls auch dann angezeigt werden, wenn es weitere Ergebnisse gibt. Bisher erhält der Nutzer nur Rückmeldung über Fehler, wenn die komplette Analyse nach Auftreten des Fehlers nicht mehr durchführbar ist. Um die Benutzerfreundlichkeit zu steigern, sollten Analysekomponenten dynamisch funktionieren. Beispielsweise muss bei dem Modul ’Data Repository’, falls eine neue Datei hinzugefügt wurde, erst das Modul neu gestartet werden, damit diese Datei verfügbar ist. Auch kann man dem Benutzer die Option geben, eine Analyse vorzeitig zu beenden. Da die Kommunikationskanäle flexibel konfigurierbar sind bietet es sich an, neben den bereits umgesetzten Verbindungen Weitere zu realisieren. So könnte man einen Datenaustausch über das Dateisystem realisieren, vorausgesetzt entsprechende Analysekomponenten laufen auf demselben System. 64 Anhang A. Eidesstattliche Erklärung Ich erkläre, dass ich die vorliegende Masterarbeit selbstständig und ohne Benutzung anderer als der angegebenen Hilfsmittel angefertigt habe und dass ich alle Stellen, die ich wörtlich oder sinngemäß aus Veröffentlichungen entnommen habe, als solche kenntlich gemacht habe. Die Arbeit hat bisher in gleicher oder ähnlicher Form oder auszugsweise noch keiner Prüfungsbehörde vorgelegen. Hünxe, den 16.11.2015 Stefan Remberg 65 Anhang B. Datenträger Der beiliegende Datenträger hat folgenden Inhalt: Ordner Sources Präsentation Dokumentation Anwendung Inhalt 1. Quellcode des Frameworks sowie der angepassten Komponenten 2. Quellcode der Node.js-Serverkomponente 1. Folien der ersten Präsentation 2. Folien der zweiten Präsentation 1. Masterarbeit in PDF-Format 2. Installationsanleitung und Anleitung für die Entwicklung von Agenten 3. Analyseworkflows 1. Analysekomponenten 2. Node.js-Serverkomponente und Weboberfläche 67 Literaturverzeichnis [Alexander et al., 1977] Alexander, Christopher, S. Ishikawa und M. Silverstein (1977). A pattern language: towns, buildings, construction, Bd. 2. Oxford University Press. [Baldoni et al., 2003] Baldoni, Roberto, M. Contenti und A. Virgillito (2003). The evolution of publish/subscribe communication systems. In: Future directions in distributed computing, S. 137–141. Springer. [Bontcheva et al., 2004] Bontcheva, Kalina, V. Tablan, D. Maynard und H. Cunningham (2004). Evolving GATE to Meet New Challenges in Language Engineering. Nat. Lang. Eng., 10(3-4):349–373. [Börner et al., 2010] Börner, Katy, W. Huang, M. Linnemeier, R. J. Duhon, P. Phillips, N. Ma, A. M. Zoss, H. Guo und M. A. Price (2010). Rete-netzwerkred: analyzing and visualizing scholarly networks using the Network Workbench Tool . Scientometrics, 83(3):863–876. [Buschmann, 1998] Buschmann, F. (1998). Pattern-orientierte Software-Architektur: ein Pattern-System. Professionelle Softwareentwicklung. Addison-Wesley. [C, 2010] C, Brain (2010). node-postgres - PostgreSQL client for node.js.. https: //github.com/brianc/node-postgres. letzter Stand: 30.10.2015. [COLLIDE, 2012] COLLIDE (2012). Configuration - SQLSpaces - COLLIDE projects. http://projects.collide.info/projects/sqlspaces/wiki/Configuration. letzter Stand: 18.09.2015. [Collina und Rudd, 2011] Collina, Matteo und A. Rudd (2011). https://github.com/mqttjs/MQTT.js. letzter Stand: 30.10.2015. MQTT.js. [Corkill, 1991] Corkill, Daniel D (1991). Blackboard systems. AI expert, 6(9):40– 47. [Cunningham, 2014] Cunningham, et al (2014). Developing Language Processing Components with GATE Version 8 . University of Sheffield Department of Computer Science. [Cunningham, 2002] Cunningham, Hamish (2002). GATE, a general architecture for text engineering. Computers and the Humanities, 36(2):223–254. [Cunningham et al., 2002] Cunningham, Hamish, D. Maynard, K. Bontcheva und V. Tablan (2002). GATE: an architecture for development of robust HLT applications. In: Proceedings of the 40th annual meeting on association for computational linguistics, S. 168–175. Association for Computational Linguistics. 69 Literaturverzeichnis [Douglas und Douglas, 2003] Douglas, Korry und S. Douglas (2003). PostgreSQL: a comprehensive guide to building, programming, and administering PostgreSQL databases. SAMS publishing. [Ebert, 2003] Ebert, Jürgen (2003). Software-Reengineering Umgang mit SoftwareAltlasten. Konradin-Verlag. Grasbrunn. Informatiktage, S. 224–31. [Erman et al., 1980] Erman, Lee D, F. Hayes-Roth, V. R. Lesser und D. R. Reddy (1980). The Hearsay-II speech-understanding system: Integrating knowledge to resolve uncertainty. ACM Computing Surveys (CSUR), 12(2):213–253. [Eugster et al., 2003] Eugster, Patrick Th, P. A. Felber, R. Guerraoui und A.-M. Kermarrec (2003). The many faces of publish/subscribe. ACM Computing Surveys (CSUR), 35(2):114–131. [Ferrucci und Lally, 2004] Ferrucci, David und A. Lally (2004). UIMA: an architectural approach to unstructured information processing in the corporate research environment. Natural Language Engineering, 10(3-4):327–348. [Finin et al., 1994] Finin, Tim, R. Fritzson, D. McKay und R. McEntire (1994). KQML As an Agent Communication Language. In: Proceedings of the Third International Conference on Information and Knowledge Management, CIKM ’94, S. 456–463, New York, NY, USA. ACM. [Fipa, 2002] Fipa, ACL (2002). Message structure specification. [Foundation, 2015a] Foundation, Apache Software (2015a). Apache Commons. https://commons.apache.org/. letzter Stand: 30.10.2015. [Foundation, 2014] Foundation, The Eclipse (2014). org.eclipse.paho.client.mqttv3 1.0.0 API . http://www.eclipse.org/paho/files/javadoc/index.html. letzter Stand: 30.10.2015. [Foundation, 2015b] Foundation, The Eclipse (2015b). Paho - Open Source messaging for M2M . http://www.eclipse.org/paho/clients/java/. letzter Stand: 30.10.2015. [Gamma et al., 1995] Gamma, Erich, R. Helm, R. Johnson und J. Vlissides (1995). Design Patterns: Elements of Reusable Object-oriented Software. AddisonWesley Longman Publishing Co., Inc., Boston, MA, USA. [Gelernter, 1985] Gelernter, David (1985). Generative communication in Linda. ACM Transactions on Programming Languages and Systems (TOPLAS), 7(1):80–112. [Giemza et al., 2007] Giemza, Adam, S. Weinbrenner, J. Engler und H. U. Hoppe (2007). Tuple spaces as a flexible integration platform for distributed learning environments. FRONTIERS IN ARTIFICIAL INTELLIGENCE AND APPLICATIONS, 162:313. [Göhnert et al., 2013] Göhnert, Tilman, A. Harrer, T. Hecking und H. U. Hoppe (2013). A Workbench to Construct and Re-use Network Analysis Workflows Concept, Implementation, and Example Case. Niagara Falls, Canada. 70 Literaturverzeichnis [Göhnert et al., 2014] Göhnert, Tilman, S. Ziebarth, N. Malzahn und H. U. Hoppe (2014). Einbettung von Learning Analytics in Lernplattformen durch Integration mit einer Analyseworkbench. Bd. 1227, S. 96–103, Freiburg, Deutschland. CEUR-WS. [Götz und Suhre, 2004] Götz, Thilo und O. Suhre (2004). Design and implementation of the UIMA Common Analysis System. IBM Systems Journal, 43(3):476–489. [Grishman, 1997] Grishman, R (1997). TIPSTER Architecture Design Document Version 2.3 . Technischer Bericht, DARPA. [Group, 2013] Group, The PostgreSQL Global Development (2013). PostgreSQL JDBC Driver . https://jdbc.postgresql.org/. letzter Stand: 30.10.2015. [Hahn et al., 2008] Hahn, Udo, E. Buyko, R. Landefeld, M. Mühlhausen, M. Poprat, K. Tomanek und J. Wermter (2008). An overview of JCoRe, the JULIE lab UIMA component repository. In: Proceedings of the LREC , Bd. 8, S. 1–7. [Herr et al., 2006] Herr, Bruce W, W. Huang, S. Penumarthy und K. Börner (2006). Designing highly flexible and usable cyberinfrastructures for convergence. Annals of the New York Academy of Sciences, 1093(1):161–179. [Hunkeler et al., 2008] Hunkeler, U., H. L. Truong und A. Stanford-Clark (2008). MQTT-S A publish/subscribe protocol for Wireless Sensor Networks. In: Communication Systems Software and Middleware and Workshops, 2008. COMSWARE 2008. 3rd International Conference on, S. 791–798. [Ihaka und Gentleman, 1996] Ihaka, Ross und R. Gentleman (1996). R: a language for data analysis and graphics. Journal of computational and graphical statistics, 5(3):299–314. [Jennings, 2000] Jennings, Nicholas R. (2000). On agent-based software engineering. Artificial Intelligence, 117(2):277 – 296. [Jennings, 2001] Jennings, Nicholas R (2001). An agent-based approach for building complex software systems. Communications of the ACM, 44(4):35–41. [Milo et al., 2007] Milo, Tova, T. Zur und E. Verbin (2007). Boosting topic-based publish-subscribe systems with dynamic clustering. In: Proceedings of the 2007 ACM SIGMOD international conference on Management of data, S. 749–760. ACM. [for Network Science Center, 2011] Network Science Center, Cyberinfrastructure for (2011). Cyberinfrastructure Shell . http://cishell.org/home. html. letzter Stand: 14.11.2015. [OSGi-Alliance, 2015] OSGi-Alliance (2015). OSGi Alliance — The Dynamic Module System for Java. https://www.osgi.org/. letzter Stand: 14.11.2015. [Postel und Reynolds, 1985] Postel, J. und J. Reynolds (1985). File Transfer Protocol . RFC 959 (INTERNET STANDARD). Updated by RFCs 2228, 2640, 2773, 3659, 5797, 7151. [PostgreSQL, 2015a] PostgreSQL (2015a). Appendix D. SQL Conformance. http://www.postgresql.org/docs/9.5/static/features.html. letzter Stand: 01.09.2015. 71 Literaturverzeichnis [PostgreSQL, 2015b] PostgreSQL (2015b). PostgreSQL: About. postgresql.org/about/. letzter Stand: 01.09.2015. http://www. [PostgreSQL, 2015c] PostgreSQL (2015c). PostgreSQL: Documentation: 9.4: JSON Functions and Operators. http://www.postgresql.org/docs/9.4/static/ functions-json.html. letzter Stand: 01.09.2015. [Rosenblum und Wolf, 1997] Rosenblum, David S. und A. L. Wolf (1997). A Design Framework for Internet-scale Event Observation and Notification. In: Proceedings of the 6th European SOFTWARE ENGINEERING Conference Held Jointly with the 5th ACM SIGSOFT International Symposium on Foundations of Software Engineering, ESEC ’97/FSE-5, S. 344–360, New York, NY, USA. Springer-Verlag New York, Inc. [Schumacher, 2001] Schumacher, Michael (2001). Multi-agent systems. Objective Coordination in Multi-Agent System Engineering: Design and Implementation, S. 9– 32. [Snell et al., 2011] Snell, James M, M. Atkins, W. Norris, C. Messina, M. Wilkinson und R. Dolin (2011). Activity Streams Working Group: JSON Activity Streams 1.0 . http://activitystrea.ms/specs/json/1.0/#toc. letzter Stand: 30.10.2015. [Standard., 2014] Standard., OASIS (2014). MQTT Version 3.1.1 . http://docs. oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html. letzter Stand: 13.09.2015. [Team, 2009] Team, NWB (2009). Network Workbench Tool User Manual 1.0.0 . http: //nwb.cns.iu.edu/Docs/NWBTool-Manual.pdf. letzter Stand: 14.11.2015. [Weinbrenner, 2012] Weinbrenner, Stefan (2012). SQLSpaces-A Platform for Flexible Language-Heterogeneous Multi-Agent Systems. Verlag Dr. Hut. [White, 2011] White, Brian (2011). node-ftp. letzter Stand: 30.10.2015. node-ftp. https://github.com/mscdex/ [Wooldridge, 1997] Wooldridge, Michael (1997). Agent-based software engineering. IEE Proceedings-software, 144(1):26–37. [Xia et al., 2012] Xia, Feng, L. T. Yang, L. Wang und A. Vinel (2012). Internet of things. International Journal of Communication Systems, 25(9):1101. 72