Im Rahmen eines Java-Projektes sind wir mit Flink in Verbindung gekommen. Wir waren von der Datenverarbeitung mit Flink sehr begiestert und wollen in diesem Blog zuerst die Grundlagen und dann einige Ergebnisse unserer Arbeit vorstellen. Dieser Post ist dabei erstmal eine Einführung in die Grundlagen von Flink.
Was ist Flink?
Grob gesagt ist Flink eine Java-Erweiterung (Flink gibt es auch für Scala) die dabei hilft große Datenmengen verteilt zu verarbeiten. Eine verteilte Verarbeitung kann innerhalb eines Computers auf mehreren Prozessorkernen, innerhalb eines Unternehmensnetzwerkes oder aber auch über verschiedene global-verteilte Cluster geschehen. Flink hiflt einem dabei von dieser Verteilung zu abstrahieren. Die Programmierung mit Flink unterscheidet sich jedoch in einigen Punkten von der Programmierung die man sonst mit Java gewohnt ist.
Grundlegender Aufbau
Die Datenverarbeitung mit Flink folgt einem grundlegenden Muster (mehr Infos).
- Es gibt eine initiale Daten Quelle. Diese erhält man typischerweise in dem man irgendwelche Ausgangsdaten einliest.
- Auf diese Datenmenge werden eine Reihe von Transformationen angewendet, die letztlich das gewünschte Ergebnis produzieren.
- Das Ergebnis dieser Transformationen wird in einer Senke gespeichtert, ausgegeben oder abgelegt (DataSink).
Also ist der grundlegende Prozess: Datasource –> Transformation –> DataSink
Einbindung mit Maven
Die Einbindung mit Maven ist denkbar einfach. Im Folgenden Ausschnitt der pom.xml wird die Flink DataSet API eingebunden.
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.10</artifactId>
<version>1.1-SNAPSHOT</version>
</dependency>
Datentypen
Daten werden unter anderem in sogenannten DataSets gespeichert. Das sind einfach nicht-änderbare Mengen an Daten eines bestimmten Typs, die ebenfalls Duplikate enthalten können. Da innerhalb des DataSets grundsätzlich erstmal keine Reihenfolge herrscht und somit einzelne Zuordnungen zwischen einzelnen Daten nicht möglich sind gibt es die Tuple-Datentypen. In einem Tuple können mehrere Daten gebündelt werden.
DataSet<Tuple2<String, Integer>>
Diese Zeile Zeigt die Deklaration eines DataSets, dass eine Menge von Tuplen aus String und Integer enthält. Dabei gehören genau immer ein String und ein Interger in einem Tupel zusammen.
Auf diesen Datentypen lassen sich nun verschiedenste Operationen ausführen, welche es ermöglichen jegliche Art an Datenanalysen und transformationen durchzuführen. Das besondere daran: Dieser gesamte Prozess lässt sich später extrem einfach auf verschiedene Worker aufteilen und paralellisiert durchführen. So ist es möglich, auch sehr komplexe Operationen sehr gut zu skalieren und damit die Gesamtdauer von Prozessen zu reduzieren.
Und es steckt noch viel mehr dahinter
Dies ist nur ein kurzer Einblick in die Welt von Flink und Streaming-basierten Frameworks. Wir können nur jeder programmieraffinen Person dazu raten, selber mal in das Thema reinzuschauen und das ein oder andere auszuprobieren: https://flink.apache.org/
Für uns ist das Framework definitiv sehr spannend und eines von vielen Möglichkeiten, sich Big-Data-Problematiken anzunehmen.