Wenn man sich dieses Bild mit einer Liste von Big-Data-Tools ansieht, könnte man meinen, dass alle möglichen Nischen in diesem Bereich bereits besetzt sind. Bei so viel Konkurrenz dürfte es sehr schwer sein, eine bahnbrechende Technologie zu entwickeln.
Die Entwickler von Apache Flink sehen das anders. Es begann als ein Forschungsprojekt namens Stratosphere. Stratosphere wurde geforkt, und dieser Fork wurde zu dem, was wir als Apache Flink kennen. Im Jahr 2014 wurde es als Apache-Inkubator-Projekt akzeptiert, und nur wenige Monate später wurde es zu einem Apache-Projekt der obersten Ebene. Zum Zeitpunkt der Erstellung dieses Artikels hat das Projekt fast 12.000 Commits und mehr als 300 Mitwirkende.
Warum so viel Aufmerksamkeit? Das liegt daran, dass Apache Flink als Big-Data-Verarbeitungsframework der neuen Generation bezeichnet wurde und über genügend Innovationen verfügt, um Apache Spark zu ersetzen und das neue De-facto-Tool für die Batch- und Stream-Verarbeitung zu werden.
Sollten Sie zu Apache Flink wechseln? Sollten Sie noch eine Weile bei Apache Spark bleiben? Oder ist Apache Flink nur ein neues Gimmick? Dieser Artikel versucht, Antworten auf diese und andere Fragen zu geben.
Wenn Sie in den letzten Jahren nicht unter einem Stein gelebt haben, haben Sie von Apache Spark gehört. Es sieht so aus, als ob jedes moderne System, das irgendeine Art von Datenverarbeitung durchführt, Apache Spark auf die eine oder andere Weise verwendet.
Für eine lange Zeit war Spark das neueste und beste Tool in diesem Bereich. Es bot im Vergleich zu seinen Vorgängern einige beeindruckende Funktionen, wie zum Beispiel:
- Beeindruckende Geschwindigkeit: Es ist zehnmal schneller als Hadoop, wenn Daten auf einer Festplatte verarbeitet werden, und bis zu 100-mal schneller, wenn Daten im Speicher verarbeitet werden.
- Einfacheres Modell für gerichtete azyklische Graphen: Anstatt Ihre Datenverarbeitungsjobs mit Hilfe eines starren MapReduce-Frameworks zu definieren, ermöglicht Spark die Definition eines Graphen von Aufgaben, die komplexe Datenverarbeitungsalgorithmen implementieren können
- Stream Processing: Mit dem Aufkommen neuer Technologien wie dem Internet der Dinge reicht es nicht mehr aus, einfach nur eine riesige Menge an Daten zu verarbeiten. Jetzt müssen wir eine große Menge an Daten verarbeiten, wenn sie in Echtzeit ankommen. Aus diesem Grund hat Apache Spark die Stream-Verarbeitung eingeführt, die es ermöglicht, einen potenziell unendlichen Datenstrom zu verarbeiten.
- Reichhaltiger Satz von Bibliotheken: Zusätzlich zu den Kernfunktionen bietet Apache Spark leistungsstarke Bibliotheken für maschinelles Lernen, Graphenverarbeitung und die Durchführung von SQL-Abfragen.
Um eine bessere Vorstellung davon zu bekommen, wie Sie Anwendungen mit Apache Spark schreiben, lassen Sie uns einen Blick darauf werfen, wie Sie eine einfache Wortzählungsanwendung implementieren können, die zählen würde, wie oft jedes Wort in einem Textdokument verwendet wurde:
// Read fileval file = sc.textFile("file/path")val wordCount = file // Extract words from every line .flatMap(line => line.split(" ")) // Convert words to pairs .map(word => (word, 1)) // Count how many times each word was used .reduceByKey(_ + _)
Wenn Sie Scala kennen, sollte dieser Code einfach erscheinen und ähnelt der Arbeit mit regulären Sammlungen. Zuerst lesen wir eine Liste von Zeilen aus einer Datei, die sich in file/path“ befindet. Diese Datei kann entweder eine lokale Datei oder eine Datei im HDFS oder S3 sein.
Dann wird jede Zeile mit der Methode flatMap
, die eine Zeichenkette einfach durch das Leerzeichen teilt, in eine Liste von Wörtern aufgeteilt. Zur Implementierung der Wortzählung verwenden wir dann die Methode map
, um jedes Wort in ein Paar umzuwandeln, bei dem das erste Element des Paares ein Wort aus dem Eingabetext und das zweite Element einfach eine Zahl ist.
Im letzten Schritt wird einfach gezählt, wie oft jedes Wort verwendet wurde, indem die Zahlen für alle Paare für dasselbe Wort addiert werden.
Apache Spark scheint ein großartiges und vielseitiges Tool zu sein. Aber was bringt Apache Flink mit?
Auf den ersten Blick scheint es nicht viele Unterschiede zu geben. Das Architekturdiagramm sieht sehr ähnlich aus:
Wenn Sie einen Blick auf das Codebeispiel für die Wortzählungsanwendung für Apache Flink werfen, werden Sie sehen, dass es fast keinen Unterschied gibt:
val file = env.readTextFile("file/path")val counts = file .flatMap(line => line.split(" ")) .map(word => (word, 1)) .groupBy(0) .sum(1)
Wenige bemerkenswerte Unterschiede sind, dass wir in diesem Fall die readTextFile
-Methode anstelle der textFile
-Methode verwenden müssen und dass wir ein Paar von Methoden verwenden müssen: groupBy
und sum
anstelle von reduceByKey
.
Was soll also die ganze Aufregung? Apache Flink mag äußerlich keine sichtbaren Unterschiede aufweisen, aber es hat definitiv genug Innovationen, um das Datenverarbeitungstool der nächsten Generation zu werden. Hier sind nur einige davon:
- Implementiert die eigentliche Streaming-Verarbeitung: Wenn Sie einen Stream in Apache Spark verarbeiten, wird er wie viele kleine Stapelverarbeitungsprobleme behandelt, wodurch die Stream-Verarbeitung zu einem Spezialfall wird. Apache Flink hingegen behandelt die Stapelverarbeitung als Sonderfall und verwendet kein Micro-Batching.
- Bessere Unterstützung für zyklische und iterative Verarbeitung: Flink bietet einige zusätzliche Operationen, die die Implementierung von Zyklen in Ihrer Streaming-Anwendung und von Algorithmen ermöglichen, die mehrere Iterationen auf Stapeldaten durchführen müssen.
- Benutzerdefinierte Speicherverwaltung: Apache Flink ist eine Java-Anwendung, aber sie verlässt sich nicht vollständig auf den JVM Garbage Collector. Er implementiert einen eigenen Speichermanager, der die zu verarbeitenden Daten in Byte-Arrays speichert. Dadurch wird die Belastung des Garbage Collectors verringert und die Leistung erhöht. Sie können darüber in diesem Blogbeitrag lesen.
- Geringere Latenz und höherer Durchsatz: Mehrere von Dritten durchgeführte Tests deuten darauf hin, dass Apache Flink eine geringere Latenz und einen höheren Durchsatz als seine Konkurrenten hat.
- Leistungsstarke Windows-Operatoren: Wenn Sie einen Datenstrom verarbeiten müssen, müssen Sie in den meisten Fällen eine Funktion auf eine endliche Gruppe von Elementen in einem Strom anwenden. Sie müssen zum Beispiel zählen, wie viele Klicks Ihre Anwendung in jedem Fünf-Minuten-Intervall erhalten hat, oder Sie möchten wissen, was der beliebteste Tweet auf Twitter in jedem Zehn-Minuten-Intervall war. Während Spark einige dieser Anwendungsfälle unterstützt, bietet Apache Flink einen weitaus leistungsfähigeren Satz von Operatoren für die Stream-Verarbeitung.
- Implementiert leichtgewichtige verteilte Snapshots: Dies ermöglicht es Apache Flink, bei der Stream-Verarbeitung einen geringen Overhead und eine Nur-einmal-Verarbeitungsgarantie zu bieten, ohne Mikrostapelung wie bei Spark zu verwenden.
So, Sie arbeiten an einem neuen Projekt und müssen eine Software dafür auswählen. Was soll ypi verwenden? Spark? Flink?
Natürlich gibt es hier keine richtige oder falsche Antwort. Wenn Sie eine komplexe Stream-Verarbeitung durchführen müssen, würde ich Apache Flink empfehlen. Es bietet eine bessere Unterstützung für die Stream-Verarbeitung und einige bedeutende Verbesserungen.
Wenn Sie keine hochmodernen Stream-Verarbeitungsfunktionen benötigen und auf der sicheren Seite bleiben wollen, ist es vielleicht besser, bei Apache Spark zu bleiben. Es ist ein ausgereifteres Projekt, hat eine größere Benutzerbasis, mehr Schulungsmaterial und mehr Bibliotheken von Drittanbietern. Aber bedenken Sie, dass Apache Flink diese Lücke von Minute zu Minute schließt. Immer mehr Projekte entscheiden sich für Apache Flink, da es ein ausgereifteres Projekt ist.
Wenn Sie andererseits gerne mit der neuesten Technologie experimentieren, sollten Sie Apache Flink auf jeden Fall eine Chance geben.
Bedeutet das alles, dass Apache Spark veraltet ist und wir in ein paar Jahren alle Apache Flink verwenden werden? Die Antwort mag Sie überraschen. Während Flink einige beeindruckende Funktionen hat, bleibt Spark nicht gleich. So führte Apache Spark beispielsweise 2015 mit der Veröffentlichung des Projekts Tungsten eine benutzerdefinierte Speicherverwaltung ein und hat seitdem Funktionen hinzugefügt, die zuerst von Apache Flink eingeführt wurden. Der Sieger steht noch nicht fest.
In den kommenden Blogbeiträgen werde ich mehr darüber schreiben, wie Sie Apache Flink für Batch- und Stream-Verarbeitung verwenden können, also bleiben Sie dran!
Wenn Sie mehr über Apache Flink erfahren möchten, können Sie einen Blick auf meinen Pluralsight-Kurs werfen, in dem ich Apache Flink ausführlicher behandle. Hier ist eine kurze Vorschau auf diesen Kurs.