Apache Flink vs. Apache Spark

Als je naar dit plaatje kijkt met een lijst van big data tools, lijkt het misschien alsof alle mogelijke niches op dit gebied al bezet zijn. Met zoveel concurrentie zou het erg moeilijk moeten zijn om met baanbrekende technologie op de proppen te komen.

De makers van Apache Flink hebben daar een andere gedachte over. Het begon als een onderzoeksproject genaamd Stratosphere. Stratosphere werd gevorkt, en deze vork werd wat we kennen als Apache Flink. In 2014 werd het geaccepteerd als een Apache Incubator project, en slechts een paar maanden later werd het een top-level Apache project. Op het moment van dit schrijven heeft het project bijna twaalfduizend commits en meer dan 300 bijdragers.

Waarom is er zo veel aandacht? Dat komt omdat Apache Flink een nieuwe generatie big data-verwerkingsraamwerk werd genoemd en genoeg innovaties onder de riem heeft om Apache Spark te vervangen en de nieuwe de-facto tool voor batch- en streamverwerking te worden.

Moet je overstappen naar Apache Flink? Moet je het nog een tijdje bij Apache Spark houden? Of is Apache Flink gewoon een nieuwe gimmick? Dit artikel zal proberen je antwoorden te geven op deze en andere vragen.

Tenzij je de laatste paar jaar onder een steen hebt geleefd, heb je gehoord over Apache Spark. Het lijkt erop dat elk modern systeem dat enige vorm van gegevensverwerking doet, Apache Spark op de een of andere manier gebruikt.

Voor een lange tijd was Spark de nieuwste en grootste tool op dit gebied. Het leverde een aantal indrukwekkende functies in vergelijking met zijn voorgangers, zoals:

  • Indrukwekkende snelheid: Het is tien keer sneller dan Hadoop als de gegevens worden verwerkt op een schijf en tot 100 keer sneller als de gegevens worden verwerkt in het geheugen.
  • Eenvoudiger directed acyclic graph model: In plaats van het definiëren van uw gegevensverwerking taken met behulp van rigide MapReduce kader Spark maakt het definiëren van een grafiek van taken die complexe gegevensverwerking algoritmen kunnen implementeren
  • Stream verwerking: Met de komst van nieuwe technologieën, zoals het Internet of Things, is het niet genoeg om alleen maar een enorme hoeveelheid gegevens te verwerken. Nu moeten we een enorme hoeveelheid gegevens verwerken terwijl ze in realtime binnenkomen. Daarom heeft Apache Spark stream processing geïntroduceerd, waarmee een potentieel oneindige stroom van data kan worden verwerkt.
  • Rijke set van bibliotheken: Naast de kernfuncties biedt Apache Spark krachtige bibliotheken voor machine learning, grafiekverwerking en het uitvoeren van SQL-query’s.

Om een beter idee te krijgen van hoe je applicaties schrijft met Apache Spark, laten we eens kijken hoe je een eenvoudige woordentellingstoepassing kunt implementeren die zou tellen hoe vaak elk woord werd gebruikt in een tekstdocument:

// 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(_ + _)

Als je Scala kent, moet deze code rechttoe rechtaan lijken en is vergelijkbaar met het werken met reguliere verzamelingen. Eerst lezen we een lijst van regels uit een bestand dat zich in file/path” bevindt. Dit bestand kan zowel een lokaal bestand zijn als een bestand in HDFS of S3.

Dan wordt elke regel gesplitst in een lijst van woorden met behulp van de flatMap methode die eenvoudig een string splitst door het spatie symbool. Dan, om de woordentelling te implementeren, gebruiken we de methode map om elk woord om te zetten in een paar waarbij het eerste element van het paar een woord uit de ingevoerde tekst is en het tweede element is gewoon een nummer één.

De laatste stap telt gewoon hoe vaak elk woord werd gebruikt door getallen op te tellen voor alle paren voor hetzelfde woord.

Apache Spark lijkt een geweldige en veelzijdige tool te zijn. Maar wat brengt Apache Flink op tafel?

Op het eerste gezicht lijken er niet veel verschillen te zijn. Het architectuur diagram lijkt erg op elkaar:

Als je naar het code voorbeeld kijkt voor de woordentelling applicatie voor Apache Flink, zou je zien dat er bijna geen verschil is:

val file = env.readTextFile("file/path")val counts = file .flatMap(line => line.split(" ")) .map(word => (word, 1)) .groupBy(0) .sum(1)

Weinig opmerkelijke verschillen, is dat we in dit geval de readTextFile methode moeten gebruiken in plaats van de textFile methode en dat we een paar methoden moeten gebruiken: groupBy en sum in plaats van reduceByKey.

Dus waar is al die ophef over? Apache Flink heeft misschien geen zichtbare verschillen aan de buitenkant, maar het heeft zeker genoeg vernieuwingen, om de volgende generatie data processing tool te worden. Hier zijn er een paar van:

  • Implementeert daadwerkelijke streaming verwerking: Wanneer je een stream verwerkt in Apache Spark, behandelt het het als vele kleine batch problemen, waardoor stream verwerking een speciaal geval is. Apache Flink, in tegenstelling, behandelt batchverwerking als een speciaal en maakt geen gebruik van micro batching.
  • Betere ondersteuning voor cyclische en iteratieve verwerking: Flink biedt een aantal extra operaties die het mogelijk maken om cycli te implementeren in uw streaming applicatie en algoritmen die meerdere iteraties moeten uitvoeren op batch data.
  • Aangepast geheugenbeheer: Apache Flink is een Java-toepassing, maar het vertrouwt niet volledig op JVM garbage collector. Het implementeert een aangepaste geheugenbeheerder die de te verwerken gegevens opslaat in byte-arrays. Dit maakt het mogelijk om de belasting op een garbage collector te verminderen en de prestaties te verbeteren. Je kunt erover lezen in deze blog post.
  • Lagere latency en hogere doorvoer: Meerdere tests gedaan door derden suggereren dat Apache Flink een lagere latency en een hogere throughput heeft dan zijn concurrenten.
  • Krachtige windows operators: Wanneer u een stroom van gegevens moet verwerken, moet u in de meeste gevallen een functie toepassen op een eindige groep elementen in een stroom. Bijvoorbeeld, je moet tellen hoeveel kliks je applicatie heeft ontvangen in elke vijf minuten interval, of je wilt weten wat de meest populaire tweet was op Twitter in elke tien minuten interval. Hoewel Spark een aantal van deze use-cases ondersteunt, biedt Apache Flink een veel krachtigere set van operatoren voor stream processing.
  • Implementeert lichtgewicht gedistribueerde snapshots: Hierdoor kan Apache Flink lage overhead en only-once verwerkingsgaranties bieden bij streamverwerking, zonder gebruik te maken van micro batching zoals Spark doet.

Dus, je werkt aan een nieuw project, en je moet er een software voor kiezen. Wat moet ypi gebruiken? Spark? Flink?

Natuurlijk is er hier geen goed of fout antwoord. Als je complexe stream processing moet doen, dan zou ik aanraden om Apache Flink te gebruiken. Het heeft betere ondersteuning voor streamverwerking en een aantal belangrijke verbeteringen.

Als je geen bloeden-edge streamverwerkingsfuncties nodig hebt en aan de veilige kant wilt blijven, is het misschien beter om bij Apache Spark te blijven. Het is een meer volwassen project het heeft een grotere gebruikersbasis, meer trainingsmateriaal, en meer bibliotheken van derden. Maar houd in gedachten dat Apache Flink dit gat met de minuut kleiner wordt. Meer en meer projecten kiezen voor Apache Flink naarmate het een meer volwassen project wordt.

Als je aan de andere kant graag experimenteert met de nieuwste technologie, moet je Apache Flink zeker een kans geven.

Betekent dit allemaal dat Apache Spark verouderd is en dat we over een paar jaar allemaal Apache Flink gaan gebruiken? Het antwoord kan je verrassen. Terwijl Flink een aantal indrukwekkende functies heeft, blijft Spark niet hetzelfde. Apache Spark introduceerde bijvoorbeeld aangepast geheugenbeheer in 2015 met de release van project Tungsten, en sindsdien voegt het functies toe die eerst door Apache Flink werden geïntroduceerd. De winnaar is nog niet beslist.

In de komende blogposts zal ik meer schrijven over hoe je Apache Flink kunt gebruiken voor batch- en streamverwerking, dus stay tuned!

Als je meer wilt weten over Apache Flink, kun je een kijkje nemen in mijn Pluralsight-cursus waarin ik Apache Flink in meer detail behandel. Hier is een korte preview van deze cursus.

Plaats een reactie