Spring XD für Big Data

Eberhard Wolff

Das Thema „Big Data“ ist in aller Munde – und natürlich darf eine passende Lösung im Spring-Portfolio nicht fehlen. Spring XD [1] steht für „Spring Extreme Data“ und basiert auf Lösungen wie Spring Integration, Spring Data und Spring Batch. Mit diesen Technologien können große Datenmengen analysiert werden. Spring XD ergänzt sie um Support für einige Big-Data-Technologien, eine DSL für Konfigurationen – und eine Container-Architektur.

Meistens denkt man bei „Big Data“ an die Speicherung großer Datenmengen. Aber die Daten müssen auch verarbeitet werden. Beispielsweise müssen Daten aus verschiedenen Quellen in Big-Data-Speicher importiert werden. Beim Import können auch schon die ersten Verarbeitungsschritte stattfinden – beispielsweise das Zählen, Aufsummieren oder Verdichten der Werte. Ebenso müssen Daten aus Big-Data-Quellen beispielsweise in relationale Datenbanken oder NoSQL-Stores exportiert werden.

Dabei ist eine Verarbeitung der Daten als Batch genauso denkbar wie die Online-Verarbeitung. Für solche Szenarien existieren auch schon die beiden Frameworks Spring Batch und Spring Integration. Sie sind jedoch nicht miteinander integriert. Spring XD stellt eine solche Integration bereit – und ergänzt sie um eine Ablaufumgebung.

Grundsätzlich bietet Spring XD dazu folgende Elemente:

  • Jobs sind Batch-Verarbeitungen. Sie können entweder mit Spring Batch oder mit Spring for Apache Hadoop umgesetzt werden. Sie sind aber noch nicht Teil des aktuellen ersten Meilensteins von Spring XD.
  • Streams dienen dazu, Daten von einer Source zu einem Sink zu transportieren. Source können HTTP, ein Tail auf eine Datei, eine Suche bei Twitter, eine Continuous Query im Gemfire Cache von Pivotal, Syslog Events oder Werte, die über TCP eingehen, sein. Liegen in den Sources neue Werte vor, werden sie an die Sinks geschickt. Sinks können ein Log über ein Logging Framework, eine Datei im Dateisystem des Computers, eine Datei im Hadoop-Dateisystem HDFS, ein TCP-Port oder der GemFire Server sein. Wem das nicht reicht: Existierende Spring-Integration-Adapter können sehr einfach mit Spring XD genutzt werden – und es werden in Zukunft sicher noch Technologien nachgeliefert.
  • Außerdem gibt es Taps, mit denen die Verbindung zwischen einer Source und einem Sink „abgehört“ werden können. Neben der eigentlichen Verarbeitung kann so noch eine zweite Verarbeitung angestoßen werden.

Die Streams werden bereits im ersten Meilenstein [2 ,3] unterstützt. Als Schnittstelle enthält Spring XD ein HTTP-REST-Interface, mit dem der Nutzer Streams erstellen und löschen kann. Die Schnittstelle wird entweder von einem Single-Node-Server angeboten, auf dem dann auch die Streams laufen. Oder es wird ein XD-Admin-Server genutzt, der die Streams auf mehrere XD-Container verteilen kann und so eine hohe Skalierbarkeit sicherstellt.

Der Umgang mit dem Server gestaltet sich recht einfach. Streams können mit einer DSL beschrieben werden, die an UNIX-Pipes erinnert. So verbindet http | file die Source HTTP mit dem Sink File. Es können auch Optionen angegeben werden, beispielsweise
http –port=9020 | file –name=eineDatei –dir=/tmp

Nach dem Start des Single-Node-Servers mit xd-singlenode kann ein Stream angelegt werden – z.B. mit curl:

curl -d „http –port=9020 | file –name=eineDatei –dir=/tmp“ http://localhost:8080/streams/meinStream

Wenn nun an den Port 9020 ein HTTP Request ankommt, wird er in die Datei geschrieben:

curl -d „Landet in der Datei“ http://localhost:9020/

Entsprechend dem REST-Gedanken kann der Stream mit einem HTTP DELETE wieder gelöscht werden:

curl -X DELETE http://localhost:8080 streams/meinStream

Neben der direkten Verbindung kann Spring XD auch Prozessoren in den Stream einfügen, um die Nachrichten zu verarbeiten. Spring XD bringt dazu Filter oder Transformer mit der Spring Expression Language (SpEL) oder Groovy. Eine weitere Möglichkeit sind der JSON Field Value Filter zum Herausfiltern von JSON-Dokumenten mit bestimmten Werten und der JSON Field Extractor, bei dem nur ein bestimmtes Feld aus dem JSON-Dokument weitergeleitet wird. Außerdem können Groovy-Skripte als Prozessoren genutzt werden. Sie können die Daten beliebig bearbeiten. Es ist natürlich auch möglich, mehrere Prozessoren zu kombinieren. In Zukunft werden in diesem Bereich sicher noch weitere Technologien unterstützt.

Ein Beispiel für einen Stream mit einem Prozessor ist:

http | filter –expression=payload.contains(‚good‘)  | file

Wegen des Prozessors werden nur die Nachrichten in der Datei landen, die den String „good“ enthalten. Für den Ausdruck wurde übrigens SpEL genutzt.

Wie erwähnt, können Streams durch Taps zusätzlich an weitere Sinks gebunden werden. Beispielsweise werden mit curl -d „tap@meinStream | log“ http://localhost:8080/streams/ die Ausgaben zusätzlich mit dem Logger im Server ausgegeben. Solche Taps können beispielsweise genutzt werden, um die Daten in Echtzeit zu analysieren – beispielsweise können Zähler für bestimmte Arten von Nachrichten so implementiert werden. Für solche Metriken bietet Spring XD auch eine Unterstützung. Beispielsweise können Daten durch Spring XD In-Memory oder in der NoSQL-Datenbank Redis abgelegt werden. Außerdem unterstützt Spring XD Tuples, bei denen neben den eigentlichen Daten zusätzliche Informationen übertragen werden können.

Fazit

Spring XD ist im Moment noch in einer sehr frühen Phase – aber die grundlegenden Features sind schon erkennbar. Es macht den Aufbau von Verarbeitungspipelines für Datenströme sehr einfach und kann dabei auf etablierte Ansätze von Spring Integration und Spring Batch zurückgreifen. Gleichzeitig werden typische Big-Data-Technologien unterstützt. Die angekündigte Nutzung von Reactor [4] als Basis von Spring XD lässt erwarten, dass Spring XD auch sehr anspruchsvolle Szenarien bezüglich Performance und Skalierbarkeit unterstützen wird.

Geschrieben von
Eberhard Wolff
Eberhard Wolff
Eberhard Wolff ist Fellow bei innoQ und arbeitet seit mehr als fünfzehn Jahren als Architekt und Berater, oft an der Schnittstelle zwischen Business und Technologie. Er ist Autor zahlreicher Artikel und Bücher, u.a. zu Continuous Delivery und Microservices und trägt regelmäßig als Sprecher auf internationalen Konferenz vor. Sein technologischer Schwerpunkt sind moderne Architektur- und Entwicklungsansätze wie Cloud, Continuous Delivery, DevOps, Microservices und NoSQL.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.