Java Mag Mit Kubernetes in der Entwicklung starten 48 3.2016 magazin Java • Architekturen • Web • Agile www.javamagazin.de AngularJS TensorFlow Die Fallstricke 70 Der Weg des maschinellen Lernens 11 infos Programm 5! ab Seite 3 ! h c t a M a s ’ It Finde die NoSQL-­ Datenbank, die zu dir passt r ü f k c u r d Sonder © iStockphoto.com/bowie15 e d . c i r t n e c e www.cod Technische Schulden managen 30 Mobile Apps mit eigenem Backend 54 AngularJS-Performance verbessern 78 Sonderdruck Agile Auswahl einer NoSQL-Lösung k n a b n e t a D e h c l We ? r i m u z t ss a p HBase, MongoDB, Couchbase, Redis … Die Zahl der verschiedenen NoSQL-Systeme ist groß und der Markt unübersichtlich. Gleichzeitig wird der Einsatz dieser Lösungen für viele Unternehmen zunehmend relevanter. Daher stellt sich bei Entwicklungsprojekten immer öfter die Frage: Welche NoSQL-Datenbank ist die richtige für meine Anwendung? Und welche Implikationen bringt die neue Technologie mit sich? von Stefan Siprell und Philip Stroh 2 javamagazin 2 | 2016 © Software & Support Media GmbH www.JAXenter.de Sonderdruck Agile Unternehmensanwendungen müssen heute in immer kürzerer Zeit immer größere Datenmengen verarbeiten. Gerade im Bereich hochverfügbarere Webanwendungen, die performant mit großen Datenmengen umgehen müssen, sind relationale Datenbanksysteme oft nicht mehr in der Lage, moderne Anforderungen zu befriedigen. In vielen Unternehmen halten daher seit einiger Zeit NoSQL-Datenbanken Einzug. Die Auswahl eines geeigneten NoSQL-Systems fällt durch die Vielfalt der Lösungen allerdings schwer. Anders als bei relationalen Datenbanksystemen, deren Funktionalitäten sich oft überdecken, ist die NoSQLWelt wesentlich heterogener und ein Vergleich dadurch umso schwieriger. Aktuell werden über 200 unterschiedliche Lösungen unter dem Oberbegriff NoSQL geführt [1]. Die TimoCom, eine Laderaum- und Frachtenbörse, hat sich im Zuge eines Projektvorhabens die Frage gestellt, welche NoSQL-Lösung die richtige Wahl für die zukünftige Weiterentwicklung ihrer B2B-Plattform ist. Dabei lag der Fokus zum einen auf der Einführung einer Messenger-Applikation für die Kunden-zu-Kunden-Kommunikation, die sich in das bestehende Webangebot integriert. Zum anderen lag der Fokus auf dem Konsolidieren der bereits existierenden NoSQL-Systeme und dem Abgrenzen dieser Systeme hinsichtlich ihres Einsatzgebiets. Mit Unterstützung der codecentric wurde hierzu ein Auswahlprozess gestartet, ursprünglich mit dem zugegebenermaßen naiven Ziel, möglichst nur ein System zu ermitteln, das den gewünschten Anforderungskatalog abdeckt. Hierbei wurde allerdings schnell klar, dass eine Universallösung durch die unterschiedlichen Stärken und Schwächen der Technologien nicht zu finden ist. Stattdessen galt es, für die Anforderungen des jeweiligen Projekts die passende Datenbank auszuwählen. Doch welche markanten Kriterien gibt es, nach denen die NoSQL-Welt geordnet werden kann und die den bestehenden Anforderungen gerecht werden? Die Unterscheidung zwischen dokumenten- und spaltenorientierten Systemen sowie Key-Value Stores ist bekannt. Aber welche Vor- und Nachteile bringen die unterschiedlichen Kategorien mit sich und für welche Anwendungsfälle eignen sie sich? Vorgehen bei der Systemauswahl: Was ist wichtig? Die Systemauswahl in unserem Beispiel erfolgte in mehreren Schritten. Zuerst haben wir einen allgemeinen Überblick über die verschiedenen Systeme erstellt, der diese nach bestimmten Kategorien gruppiert. Pro Kategorie unterscheiden sich die Systeme in der Regel in Bezug auf Betriebs- und Entwicklungsaspekte, wie z. B. der Clustering-Konfiguration. Relativ ähnlich verhalten sie sich aber im Hinblick auf grundlegende Eigenschaften, z. B. für welche Art von Daten sich diese Systeme eignen und wie sich die Datenmodellierung gestaltet (u. a. [2]). Diese gemeinsamen Charakteristiken wurden in einem Entscheidungsbaum für den weiteren Auswahlprozess berücksichtigt. www.JAXenter.de Bereits im Vorfeld der Untersuchung haben wir die Anforderungen an die Systeme und Einsatzszenarien aus bestehenden und geplanten Projekten abgeleitet. Nachdem die zu betrachtenden Systemkategorien und deren grundlegende Eigenschaften bestimmt waren, haben wir im nächsten Schritt pro Kategorie die Unterschiede zwischen den Systemen untersucht, um hieraus letztendlich die geeignete Lösung im Abgleich mit den Anforderungen zu bestimmen. Hierbei wurden u. a. die folgenden Aspekte geprüft: •CAP-Theorem: Welche Aspekte der Konsistenz, Verfügbarkeit und Partitionstoleranz werden durch die Lösung unterstützt [3]? •Schreib- und Leseverhalten: Ist die Datenbank eher für Schreib- oder Lesezugriffe optimiert? Ist auch ein Mixed Workload möglich? •Performance und Skalierbarkeit: Werden die notwendigen Performanceanforderungen erfüllt? Skaliert die Lösung idealerweise linear? •Entwicklung: Wie gestaltet sich die Nutzung in der Entwicklung? Welche Treiber gibt es und wie gut integrieren sich diese mit den bereits verwendeten Java-Frameworks? •Infrastruktur: Welche Hardwareanforderungen stellt das System und wie verträgt es sich mit der bestehenden Infrastruktur? Ist die Lösung On-Premise zu betreiben? •Betrieb und Administration: Wie komplex sind der Aufbau und der Betrieb eines entsprechenden Clusters? Welche Administrations- und Monitoringtools gibt es? Wie funktionieren Backup- und FailoverMechanismen? •Weitere Aspekte: Wie verbreitet ist die Lösung? Ist sie für den kommerziellen Einsatz geeignet? Gibt es kommerziellen Support? Im Entscheidungs- und Bewertungsprozess wurden Kollegen aus Betrieb, Administration und Entwicklung einbezogen und deren Erfahrungen und Anforderungen an zukünftige Tools berücksichtigt. Teilweise wurden kleinere Prototypen entwickelt, um das System bspw. aus Entwicklersicht zu bewerten. Dies führte letztendlich auch zu einem breiten Konsens über das zukünftige Toolset. Online vs. offline Grundsätzlich gibt es zwei Zugriffsprofile für Daten: Man möchte diese entweder transaktional (= online) ansprechen oder analytisch (= offline) auswerten. Für den allgemeinen Überblick über die verschiedenen Datenbanken wurde daher auf oberster Ebene zwischen Artikelserie: Teil 1: Auswahl einer NoSQL-Lösung Teil 2: Einführung einer NoSQL-Lösung © Software & Support Media GmbH javamagazin 3 | 2016 3 Sonderdruck Agile Datenbanken für den Onlineeinsatz und Produkten für den Offlineeinsatz unterschieden. Online impliziert dabei immer eine wartende Anfrage eines Kunden oder anderen Systems. Der Abschluss der Operation wird benötigt, um einen Geschäftsvorfall anzubahnen, auszuführen oder zu beenden. Typische Applikationen sind E-Commerce-Systeme, Social-Media-Netzwerke oder Suchmaschinen. Hier sind niedrige Latenzzeiten über aktuelle Daten entscheidend. Im Onlinebereich sollten somit vorrangig Systeme gewählt werden, die einzelne Anfragen schnell und verlässlich ausführen können. Offlinesysteme hingegen werden nicht direkt für Kundenanfragen benötigt. Die Daten in Offlinesystemen werden häufig per Batch Job verarbeitet, und es werden zu bestimmten Zeiten Ergebnisse erwartet. Typische Muster sind Klassifizierungs-, Reporting- und Analyseanwendungen. Im Gegensatz zu den Onlinesystemen sind Verfügbarkeit und Geschwindigkeit einzelner Transaktionen hier zweitrangig. Daten in Offlinesystemen speichern und analysieren Wenn es darum geht, große Datenmengen im Offlinebereich zu speichern und zu analysieren, ist eine Hadoop-Lösung das Standardwerkzeug. Hadoop ist keine NoSQL-Datenbank im engeren Sinne. Es ist vielmehr ein Framework zur verteilten Datenspeicherung und -verarbeitung. Big-Data-Architekturen sehen Hadoopund NoSQL-Datenbanken vielfach als Ergänzung zueinander. Die NoSQL-Systeme speichern die Daten aus den Online-Use-Cases und befüllen nachgelagert auch Hadoop. Dort lassen sich die Daten daraufhin systemübergreifend analysieren. Um möglichst effektive Analysen im Offlinespeicher durchführen zu können, müssen die Rohdaten gespeichert werden, direkt wie sie anfallen. Aggregation oder Sampling der Daten würden die Daten hinsichtlich ihrer Qualität und Aussagekraft einschränken oder verfälschen. Hadoops HDFS (Hadoop Distributed File System) ist ein hochverfügbares Dateisystem, das es erlaubt, unstrukturierte Rohdaten in großen Mengen, verteilt auf mehreren Clusterknoten, zu speichern. HDFS repliziert die Daten auf dem Softwarelayer, sodass auf Commodity-Hardware günstig gearbeitet werden kann – mittlerweile ist der TCO (Total Cost of Ownership) eines Terabytes pro Jahr unter die 500-Euro-Marke gerutscht. Es existiert des Weiteren ein reichhaltiges Ökosystem, um aus den Rohdaten aussagekräftige Analysen zu extrahieren. Mit dem Ressourcenmanager YARN können zudem weitere Werkzeuge jenseits vom klassischen Map­Reduce genutzt werden, um die riesigen Datenmengen zu verarbeiten. Immer populärer wird hier bspw. die Kombination mit Apache Spark [4]. Daten in Onlinesystemen speichern und analysieren Bei den NoSQL-Systemen im Onlinebereich gibt es verschiedene Paradigmen, die zu speichernden Daten zu strukturieren: •Dokumentenbasiert: Datensätze werden als in sich geschlossene Dokumente gespeichert. Die Dokumente (meist im JSON-Format) können beliebig hierarchisch erweitert werden. •Spaltenbasiert: Analog zu RDBMS werden Datensätze in Zeilen und Attribute in Spalten gespeichert, allerdings erlauben die spaltenorientierten Systeme Milliarden an Spalten pro Zeile. •Schlüsselwertebasiert: Einträge werden als einfache Werte (skalare Strings, Listen, Sets und Maps) gespeichert und einem Schlüssel zugeordnet. Werte lassen sich nur über ihre Schlüssel finden. •Graphenbasiert: In Graphen stehen nicht die Daten selbst im Vordergrund, stattdessen werden vorrangig deren Beziehungen untereinander verwaltet. Graphdatenbanken haben wir aufgrund eines fehlenden Anwendungsfalls in der Untersuchung nicht weiter evaluiert. Key-Value-basierte Speicherungen sind eher Spezialfälle – hierzu später mehr. Grundsätzlich ist es möglich, jede Art von Information nach beliebigen Vorgaben zu strukturieren. Die Eignung einer Methode für einen Informationstyp ist daher keine eindeutige „Geht/ geht nicht“-Entscheidung, sondern vielmehr eine De­ sign­entscheidung dazu, wie gut sich Modellierung anwenden lässt. In dokumentenorientierten Lösungen wird ein Dokument (hierarchische Ansammlung von Datenknoten) in der Regel in ein binäres Format serialisiert, indiziert und persistiert. Das Dokument muss analog zu einer Zeile vollständig gelesen werden, um dieses auszuwerten – Aspekt Dokumentenorientiert Spaltenorientiert Größendynamik der Entität Starr – Wachsende Entitäten ziehen teure Reorganisationen nach sich Dynamisch – Wachsende Entitäten sind einfach weitere Spalten Wiederholende Strukturen Referenz – Strukturen und Inhalte werden als Dokumente referenziert Denormalisierung – Wiederholende Werte werden als Teil des Schlüssels gehalten Abfragedynamik Hoch – Durch Referenzen können neue Anfragetypen auf der gleichen Speicherstruktur ausgeführt werden Gering – Speicherstrukturen sind sehr stark für die jeweiligen Abfragen optimiert Grouped-Reads Schlecht – Dokumente können beliebig verteilt werden, hoher Koordinationsaufwand im Cluster Gut – Durch das Halten von verwandten Daten auf einem lokalen Knoten wird der Koordinationsaufwand im Cluster reduziert Tabelle 1: Dokumenten- oder spaltenorientierte Datenbank? Wie die verschiedenen Systeme mit verschiedenen Aspekten umgehen 4 javamagazin 3 | 2016 © Software & Support Media GmbH www.JAXenter.de Sonderdruck Agile auch wenn von vielen Dokumenten(-zeilen) immer nur eine Eigenschaft (Spalte) benötigt wird. Zudem gibt es wenige Möglichkeiten, Strukturen und Inhalte zu modellieren, die sich über eine Vielzahl von Dokumenten erstrecken – dies kann nur über Dokumentreferenzen analog zu einem Join in SQL erreicht werden. Zuletzt muss man relativ stark in das System eingreifen, um die Verteilung der Dokumente auf dem Cluster zu beeinflussen. In spaltenorientierten Systemen, auch BigTable-Systeme genannt, werden die Daten hingegen in einer multidimensionalen Map gespeichert und auf eine mehr oder weniger flache Tabellenstruktur projiziert. Wiederholt man z. B. millionenfach einen Teil des Schlüssels, wird der Wert nur einmal in der Map und die weiteren Teile des Schlüssels bzw. die Werte werden als Sub-Maps gespeichert. Da man die Daten mit geringem Overhead stark denormalisieren kann, optimiert man die Strukturen für die jeweiligen Abfragen – so entfällt in der Regel die Notwendigkeit, Daten während einer Abfrage zu dereferenzieren. BigTable-Systeme erlauben es außerdem, über den Aufbau der Schlüssel zu modellieren, wie die Daten im Cluster verteilt werden. So können bspw. bei Cassandra-Daten lokal (d. h. auf einer Node im Cluster) zusammengehalten werden, indem sie den obersten Schlüssel (Partition Key) teilen. Im direkten Vergleich der Systeme ist noch anzumerken, dass Dokumente eine hohe Varianz an Speicherlängen haben können. Dokumentenbasierte Systeme lassen in den persistierten Datenblöcken daher häufig leeren Platz zwischen den einzelnen Dokumenten. Sofern ein einzelnes Dokument nur beschränkt wächst, reicht der Platz meist aus. Ist dies aber nicht mehr der Fall, müssen mit hohem Aufwand die Blöcke physisch auf dem Massenspeicher reorganisiert werden. Cassandra, als Vertreter der spaltenorientierten Systeme, speichert hingegen die Änderungen im Append-only-Modus auf dem Massenspeicher und wird regelmäßig neue optimierte Versionen der Datenblöcke persistieren und die alten entsorgen. Durch die starken Unterschiede liegen die „Sweet Spots“ der Systeme in verschiedenen Bereichen (Tabelle 1). Es wurde schnell klar, dass kein Modell das andere ersetzen kann – stattdessen mussten die Systeme sich ergänzen, um allen Anforderungen gerecht zu werden. Zusammengefasst ergibt sich somit aus Sicht der Datenmodellierung folgendes Bild: In spaltenorientierten Systemen lassen sich insbesondere listenbasierte Datenmodelle mit kleinen und einfach strukturierten Entitäten gut abbilden. Einsatzszenarien sind bspw. Server-Events, Telematikdaten, Transaktionsprotokolle, Sensordaten und Ähnliches. Dokumentenbasierte Systeme dagegen sind geeignet, wenn Dokumente mit relativ konstanter Dokumentengröße vorliegen. Das Datenmodell kann dabei durchaus komplexer sein. Dies trifft u. a. für Stammdatensysteme zu. Bei der weiteren Systemauswahl wurden die dokumentenbasierten Datenbanken MongoDB und Couchbase genauer untersucht. An dieser Stelle kann al- www.JAXenter.de lerdings nur sehr verkürzt auf die Unterschiede zwischen den beiden Lösungen eingegangen werden. Couchbase hatte auf den ersten Blick die innovativeren Konzepte, bspw. ein hochperformantes, auf Memcached basierendes Backend, eine einfache Clusterkonfiguration und eine bessere Skalierung. MongoDB hingegen überzeugt beim Handling aus Entwicklersicht durch eine ausgereifte Query-Sprache, Out-of-the-box-Indizes, eine hohe Verbreitung in der Community, einen eingebauten verteilten Objectstore und auch eine bessere Unterstützung von Dokumentenupdates im API. Der Abgleich mit den potenziellen Einsatzszenarios ergab bei Betrachtung der erwarteten Last und der benötigten Clustergrößen, dass Couchbase seine wahren Stärken in diesen Punkten nicht ausspielen kann. Schließlich gab die einfachere Handhabung in der Entwicklung den Ausschlag, MongoDB als dokumentenbasierte Datenbank zu wählen. Bei den spaltenorientierten Datenbanken wurde die Auswahl aufgrund der Verbreitung schnell auf zwei Tools beschränkt [5] – Apache Cassandra und Apache HBase. Hier liefert HBase zwar die besseren Performanceergebnisse bei Leseoperationen mit Range Scans, allerdings sind die Schnelligkeit der individuellen Zugriffe über Spaltenindex oder Primärschlüssel sowie die Schreibperformance bei Cassandra ungeschlagen. Da bei Cassandra das Konsistenzlevel zudem dynamisch pro Statement eingestellt werden kann (dabei bedeutet höhere Konsistenz schlechtere Performance), können Konsistenz und Performance flexibel gegeneinander abgewogen werden [6]. Dies war einer der ausschlaggebenden Punkte für die Wahl von Cassandra. Systeme für spezielle Einsatzszenarien Die bisher untersuchten Datenbanken haben ihre Daten stets auf persistentem Speicher gesichert. Unter Umständen kann es sinnvoll sein, die Daten vorrangig im volatilen Hauptspeicher zu halten, um damit möglichst schnell Anfragen zu bedienen. Auf dieses Vorgehen setzen Key-Value Stores und Suchindizes. Suchindizes wurden in Abgrenzung zu den NoSQL-Datenbanken in der Analyse ebenfalls mit einbezogen, werden im Folgenden aber nicht im Detail beleuchtet [7]. Bei den Key-Value Stores obliegt es der Anwendung, die Daten in Schlüssel-Wert-Paare zu gliedern und deren Konsistenz zu gewährleisten. Da die Daten im Hauptspeicher liegen, sind mit dem schnellen Zugriff Anwendungsfälle denkbar, wie verteilte Locks, Queues, Caches oder Counter. In den bestehenden Applikationen wurde Ehcache bereits erfolgreich als In-Memory-Cache eingesetzt, eine andere verbreitete Alternative wäre Hazelcast. Beide Lösungen können als JAR in die Anwendungen eingebunden werden und benötigen keine weitere externe Installation. Falls eine Persistierung auf Festplatte z. B. für ein Desaster Recovery benötigt wird, ist Redis ein schlankes und horizontal gut skalierendes Tool. Als Suchindex wurde Elasticsearch für die Volltextsuchen und das Suchen über geografische Daten © Software & Support Media GmbH javamagazin 3 | 2016 5 Sonderdruck Agile Abb. 1: Entscheidungsbaum zur Auswahl der Systemkategorie vorgesehen, sofern die eingesetzte Datenbank hier keine entsprechenden Möglichkeiten bietet. Ergebnis Aus den genannten Beobachtungen wurde ein Entscheidungsbaum abgeleitet, der es erlaubt, eine geeignete Datenbankkategorie anhand bestimmter Charakteristika einer Applikation zu ermitteln (Abb. 1). Für jede Kategorie wurde des Weiteren ein System ausgewählt, das in der Kategorie besonders geeignet erscheint (Abb. 2). Hier sind tatsächlich in den meisten Fällen die Big Player im NoSQL-Bereich als Standards definiert worden. Zugegebenermaßen vereinfacht der Entscheidungsbaum die Vielseitigkeit der einzelnen Systeme. Er dient bei 6 javamagazin 3 | 2016 der Auswahl einer Lösung als ein erster Indikator, welche Datenbankkategorie den jeweiligen Anwendungsfall besonders gut abdeckt. Danach müssen weitere Eigenschaften des Systems geprüft und mit den Anforderungen der zu entwickelnden Anwendung abgeglichen werden. Im Laufe der Untersuchung wurden diese Eigenschaften ebenfalls dokumentiert (Clustering, Read-/Write-Performance, Konsistenzverhalten etc.). Beim Abgleich mit den Anforderungen kann sich beispielsweise auch ergeben, dass man die Modellierungssicht auf das System, die im Entscheidungsbaum hinterlegt ist, zugunsten anderer Kriterien aufgibt. Durch die Breite der untersuchten und zugelassenen Lösungen wurde hier aber genug Spielraum geschaffen, um sich bei der Systemauswahl innerhalb des ausgewählten Toolsets zu bewegen. © Software & Support Media GmbH www.JAXenter.de Sonderdruck Agile Abb. 2: Ausgewählte Systeme in der jeweiligen Kategorie Für die am Anfang des Artikels genannte MessengerAnwendung wurde im Rahmen der Analyse Apache Cassandra als Datenspeicher ausgewählt. Viele der Entitäten in der Messaging-Domäne haben folgende Eigenschaften gemein: •Sehr klein: Chatnachrichten haben wenige Attribute, die flach modelliert sind. •Dynamische Listen: Die Anzahl von Kontakten, Chats, Nachrichten o. Ä. wird kontinuierlich linear wachsen. •Starke Zuordnung: Chatnachrichten sind bspw. immer genau einem Chat zugeordnet. Das relativ einfache und auf Listen basierende Datenmodell der Anwendung lässt sich somit sehr gut in einer spaltenorientierten Datenbank abbilden. Zudem überzeugten die beindruckende Schreib- und sehr gute Leseperformance, die vielseitige Clustering-Konfiguration sowie die lineare Skalierbarkeit der Cassandra. Bei schnell steigender Akzeptanz der Anwendung und entsprechend wachsenden Request-Zahlen lässt sich daher durch das Hinzunehmen weiterer Knoten die Performance und Verfügbarkeit sehr leicht sicherstellen. Auch die Handhabung in einer Java-Anwendung ist durch entsprechende Bibliotheken gut abgedeckt. Datenvolumens, der Performance oder der Datenvarianz ist daher ein RDBMS weiter das Mittel der Wahl, insbesondere, wenn das entsprechende Know-how unter den Mitarbeitern vorhanden ist. Innerhalb des Unternehmens hat die Analyse außerdem dazu beigetragen, die NoSQL-Systeme und deren Stärken und Schwächen besser zu verstehen. Somit ist eine gute Grundlage für zukünftige Projekte im NoSQLBereich geschaffen. Das Ergebnis stellt gleichzeitig eine Momentaufnahme dar, die man durch die schnelle Weiterentwicklung im Bereich der NoSQL-Datenbanken regelmäßig überprüfen und aktualisieren muss. Nach Abschluss des Auswahlprozesses wurde begonnen, die Messaging-Anwendung auf Basis von Apache Cassandra umzusetzen. Die Erfahrungen aus diesem Projekt werden im zweiten Teil dieser Artikelserie, der in der nächsten Ausgabe erscheint, detaillierter dargestellt. Stefan Siprell ist bei der codecentric als Architekt tätig. Seine Schwerpunkte liegen in der Konzeption datengetriebener Anwendungen. Philip Stroh arbeitet als Softwarearchitekt bei der TimoCom Softund Hardware GmbH. Er hat langjährige Erfahrung in der Entwicklung und Konzeption von Java-basierten Webanwendungen. Fazit Mit dem Entscheidungsbaum wurde ein Hilfsmittel geschaffen, das Architekten und Entwicklern eine erste Einordnung erlaubt, welche Datenbank sich für das umzusetzende Projekt anbietet. Durch die Definition von Standardsystemen können sich Betrieb und Entwicklung nun gemeinsam auf die Technologien vorbereiten und die Kenntnisse in diesem Bereich gezielt ausbauen. Die extreme Heterogenität und Spezialisierung in der NoSQL-Welt hat auch gezeigt, welche Vorteile die vergleichsweise homogenen relationalen Datenbanksysteme mit ACID-Eigenschaften bieten. Für Anwendungsfälle ohne spezielle Anforderungen bzgl. des www.JAXenter.de Links & Literatur [1] List of NoSQL Databases: http://bit.ly/1rWAUxS [2] NoSQL Data Modeling Techniques: http://bit.ly/1zmWIpP [3] Visual Guide to NoSQL Systems: http://bit.ly/1vVCAzc [4] Spark and Hadoop: Working Together: http://bit.ly/1OfXAmN [5] DB-Engines Ranking: http://bit.ly/1ORFaM0 [6] Kalantzis, Christos: „Revisiting 1 Million Writes per second“: http://nflx. it/1BOd4xz [7] Elasticsearch as a NoSQL Database: http://bit.ly/1R7BtFh © Software & Support Media GmbH javamagazin 3 | 2016 7