Apache Flink vs Apache Spark

Om man tittar på den här bilden med en lista över big data-verktyg kan det tyckas att alla möjliga nischer inom området redan är upptagna. Med så mycket konkurrens borde det vara mycket svårt att komma med banbrytande teknik.

Apache Flink-skaparna har en annan uppfattning om detta. Det började som ett forskningsprojekt med namnet Stratosphere. Stratosphere gafflades och denna gaffel blev vad vi känner till som Apache Flink. År 2014 godkändes det som ett Apache Incubator-projekt, och bara några månader senare blev det ett Apache-projekt på högsta nivå. När detta skrivs har projektet nästan tolv tusen commits och mer än 300 bidragsgivare.

Varför finns det så mycket uppmärksamhet? Det beror på att Apache Flink kallades för en ny generation av ramverk för bearbetning av stora data och har tillräckligt med innovationer i bagaget för att ersätta Apache Spark och bli det nya de-facto verktyget för batch- och strömbearbetning.

Bör du byta till Apache Flink? Ska du hålla dig till Apache Spark ett tag till? Eller är Apache Flink bara en ny gimmick? Den här artikeln kommer att försöka ge dig svar på dessa och andra frågor.

Om du inte har levt under en sten de senaste åren har du hört talas om Apache Spark. Det verkar som om varje modernt system som gör någon form av databehandling använder Apache Spark på ett eller annat sätt.

Länge var Spark det senaste och bästa verktyget på detta område. Det levererade några imponerande funktioner jämfört med sina föregångare, till exempel:

  • Imponerande hastighet: Det är tio gånger snabbare än Hadoop om data behandlas på en disk och upp till 100 gånger snabbare om data behandlas i minnet.
  • Enklare riktad acyklisk grafmodell: Istället för att definiera dina databehandlingsjobb med hjälp av en rigid MapReduce-ram gör Spark det möjligt att definiera en graf av uppgifter som kan implementera komplexa databehandlingsalgoritmer
  • Strömbearbetning: Med nya tekniker som t.ex. sakernas internet räcker det inte längre med att bara bearbeta en stor mängd data. Nu behöver vi bearbeta en enorm mängd data när den anländer i realtid. Därför har Apache Spark infört strömbehandling som gör det möjligt att behandla en potentiellt oändlig ström av data.
  • Rik uppsättning bibliotek: För att få en bättre uppfattning om hur du skriver program med Apache Spark tar vi en titt på hur du kan implementera ett enkelt program för ordräkning som räknar hur många gånger varje ord används i ett textdokument:
    // 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(_ + _)

    Om du kan Scala bör den här koden verka okomplicerad och liknar arbete med vanliga samlingar. Först läser vi en lista med rader från en fil som ligger i file/path”. Denna fil kan antingen vara en lokal fil eller en fil i HDFS eller S3.

    Därefter delas varje rad upp i en lista med ord med hjälp av flatMap-metoden som helt enkelt delar upp en sträng med mellanslagssymbolen. För att implementera ordräkningen använder vi sedan map-metoden för att konvertera varje ord till ett par där det första elementet i paret är ett ord från inmatningstexten och det andra elementet helt enkelt är siffran ett.

    Det sista steget räknar helt enkelt hur många gånger varje ord användes genom att summera siffrorna för alla par för samma ord.

    Apache Spark verkar vara ett bra och mångsidigt verktyg. Men vad tillför Apache Flink?

    Vid en första anblick verkar det inte finnas många skillnader. Arkitekturdiagrammet ser väldigt likt ut:

    Om du tar en titt på kodexemplet för programmet för ordräkning för Apache Flink skulle du se att det nästan inte finns någon skillnad:

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

    Få anmärkningsvärda skillnader är att vi i det här fallet måste använda readTextFile-metoden istället för textFile-metoden och att vi måste använda ett par metoder: groupBy och sum i stället för reduceByKey.

    Så vad är allt ståhej om? Apache Flink kanske inte har några synliga skillnader på utsidan, men det har definitivt tillräckligt med innovationer för att bli nästa generations databehandlingsverktyg. Här är bara några av dem:

    • Genomför faktisk strömmingsbehandling: När du bearbetar en ström i Apache Spark behandlas den som många små batchproblem, vilket gör strömbearbetning till ett specialfall. Apache Flink behandlar däremot batchbehandling som ett specialfall och använder sig inte av mikrobatcher.
    • Bättre stöd för cyklisk och iterativ behandling: Flink tillhandahåller några ytterligare operationer som gör det möjligt att implementera cykler i ditt streamingprogram och algoritmer som behöver utföra flera iterationer på batchdata.
    • Anpassad minneshantering: Apache Flink är en Java-applikation, men den förlitar sig inte helt på JVM garbage collector. Den implementerar en anpassad minneshanterare som lagrar data som ska bearbetas i byte-matriser. Detta gör det möjligt att minska belastningen på en skräpplockare och öka prestandan. Du kan läsa om det i det här blogginlägget.
    • Lägre latenstid och högre genomströmning: Flera tester utförda av tredje part tyder på att Apache Flink har lägre latenstid och högre genomströmning än sina konkurrenter.
    • Kraftfulla fönsteroperatörer: När du behöver bearbeta en dataström behöver du i de flesta fall tillämpa en funktion på en begränsad grupp av element i strömmen. Du kan till exempel behöva räkna hur många klick som din applikation har fått i varje femminutersintervall, eller så vill du veta vad som var den mest populära tweeten på Twitter i varje tiominutersintervall. Spark stöder vissa av dessa användningsfall, men Apache Flink tillhandahåller en mycket kraftfullare uppsättning operatörer för strömbearbetning.
    • Implementerar lättviktiga distribuerade ögonblicksbilder: Detta gör det möjligt för Apache Flink att tillhandahålla låga omkostnader och garantier för endast en gång-bearbetning vid strömbearbetning, utan att använda micro batching som Spark gör.

    Så, du arbetar på ett nytt projekt och måste välja en programvara för det. Vad ska ypi använda? Spark? Flink?

    Det finns naturligtvis inget rätt eller fel svar här. Om du behöver göra komplex strömbearbetning skulle jag rekommendera att du använder Apache Flink. Den har bättre stöd för strömbearbetning och några betydande förbättringar.

    Om du inte behöver några banbrytande strömbearbetningsfunktioner och vill vara på den säkra sidan kan det vara bättre att hålla sig till Apache Spark. Det är ett mer moget projekt det har en större användarbas, mer utbildningsmaterial och fler bibliotek från tredje part. Men tänk på att Apache Flink minskar denna lucka för varje minut. Fler och fler projekt väljer Apache Flink i takt med att det blir ett mer moget projekt.

    Om du å andra sidan gillar att experimentera med den senaste tekniken måste du definitivt ge Apache Flink en chans.

    Betyder allt detta att Apache Spark är föråldrat och att vi alla om ett par år kommer att använda Apache Flink? Svaret kan överraska dig. Även om Flink har en del imponerande funktioner är Spark inte oförändrad. Apache Spark introducerade till exempel anpassad minneshantering 2015 i samband med lanseringen av projekt Tungsten och har sedan dess lagt till funktioner som först introducerades av Apache Flink. Vinnaren är inte bestämd ännu.

    I kommande blogginlägg kommer jag att skriva mer om hur du kan använda Apache Flink för batch- och strömbearbetning, så håll ögonen öppna!

    Om du vill veta mer om Apache Flink kan du ta en titt på min Pluralsight-kurs där jag tar upp Apache Flink mer i detalj. Här är en kort förhandsvisning av kursen.

Lämna en kommentar