der Ge- schwindigkeit der Daten. Vorhang auf für Spring XD Spring XD ist ein einheitliches, verteiltes und erweiterbares System für Datenaufnahme, Real Time Analytics, Batch- Verarbeitung und Datenexport [1]. Es ist im Gegensatz zu den meisten anderen Spring-Projekten kein Framework, sondern bietet eine eigene, verteilte Laufzeitumgebung für bestimmte Arten von Modulen: Source, Processor, Sink und Job. Die ersten drei werden in Streams organisiert, behandeln Einzeldatensätze, die aus der Source gelesen, durch beliebige Processors bearbeitet und in das Sink ge- schrieben werden. Dabei können Daten durch Taps an jeder Stelle des Streams abgezapft, durch spezielle Ana- lytics-Module ausgewertet und in neue Streams abgelei- tet werden. Jobs verarbeiten Massendaten, können durch Streams ausgelöst werden und Daten in Streams emissie- ren. Für alle Arten von Modulen gibt es viele vordefinierte Komponenten, sodass die meisten Standardtechnologien abgedeckt sind. Module können aber auch ohne Probleme selbst geschrieben werden, wenn man etwas Spring-Integ- ration- bzw. Spring-Batch-Know-how hat. Im Folgenden werden wir zunächst genauer auf Streams, Jobs und Taps eingehen und dabei die DSL zum Erzeugen von Streams und Jobs erläutern, um dann auf die spezielle, verteilte Architektur einzugehen. Zu guter Letzt werden wir zeigen, wie eigene Module ein- fach implementiert und verwendet werden können. Streams Eine Source ist dafür verantwortlich, Daten aus einer Quelle zu lesen. Spring XD bietet Sources für viele Tech- nologien, bisher sind die Moduldefinitionen http, tail, file, mail, twittersearch, twitterstream, gemfire, gemfire- cq, syslog-udp, syslog-tcp, reactor-syslog, tcp, tcp-cli- ent, rabbit, jms, time und mqtt vorhanden [2]. Ein Sink ist dafür verantwortlich, Daten aufzuneh- men. Für Sinks bietet Spring XD bisher die Modulde- finitionen log, file, hdfs, avro, jdbc, tcp, mail, rabbit, gemfire-json-server, splunk, mqtt und router. In zukünftigen Releases werden sicherlich noch viele weitere Module hinzukommen, außerdem ist es einfach möglich, selbst Module zu erstellen. Dies zeigen wir am Ende des Artikels. Technisch gesehen sind alle Stream- Module Spring-Integration-Module [3]. Unsere Anforderung ist es nun, Daten aus einem Log- file eines Webservers in unser Hadoop Distributed File System (HDFS) zu schreiben. Die Daten liegen dabei be- reits im JSON-Format vor (Listing 1). Wir verwenden das Source-Modul tail, das eine Datei überwacht und immer, wenn eine neue Zeile in die Datei geschrieben wird, diese an den Stream weiterliefert. Für das Schreiben verwenden wir das Sink-Modul hdfs. Spring XD hat eine eigene DSL zum Erzeugen von Streams, dessen Syntax an Unix Pipes und Filters an- gelehnt ist. Der folgende Code zeigt unseren Stream, wobei das tail-Modul mit dem Namen der Datei, aus der gelesen werden soll, parametrisiert ist. Spezielle Ein- stellungen für den Zugriff auf Hadoop werden nicht di- rekt der Stream-Definition mitgegeben, sondern in einer Konfigurationsdatei hadoop.properties abgelegt: tail --name=/tmp/logfile.json | hdfs Das Pipe-Symbol repräsentiert einen Message Channel, der, je nach Modus, unterschiedlich implementiert wird, siehe dazu den Abschnitt „Verteilte Architektur“. Spring XD stellt eine eigene Shell zur Verfügung, über die Kommandos zur Administration von Streams ab- gesetzt werden können. Listing 2 zeigt die wichtigsten Befehle in Bezug auf Streams, wobei hier jeweils von bei- spiel als Namen des Streams ausgegangen wird. Die XD Shell nutzt dafür das REST-API des XD-Adminservers. In einem weiteren Schritt soll ein zusätzlicher Processor hinzugefügt werden, der nur die Logmeldungen mit der Kategorie INFO durchlässt. Mit einem Processor können Daten beliebig manipuliert und gefiltert werden, Spring XD bietet aktuell dafür die Module filter, json-field-value-filter, transform, json-field-extractor, script, split- ter und aggregator. In unserem Fall verwenden wir den json-field- value-filter, der das JSON-Feld ca- tegory für die Filterung verwendet (Listing 3 und Abb. 1). Abb. 1: Darstel- lung des Streams „tail | json-field- value-filter | hdfs“ Listing 1 {"category":"INFO", "url":"http://server.local:8080/api", "duration":"200", "timestamp":"1354697760477", "http_code":"200", "message":"This is a logentry."} Listing 2 xd:> stream create --name beispiel --definition "tail --name=/tmp/logfile.json | hdfs" xd:> stream destroy --name beispiel xd:> stream undeploy --name beispiel xd:> stream deploy --name beispiel Listing 3 tail --name=/tmp/logfile.json | json-field-value-filter --fieldName=category --fieldValue=INFO | hdfs © Software & Support Media GmbH 3 www.JAXenter.de javamagazin 4 | 2014