Apache Flink vs. Apache Spark

Podíváte-li se na tento obrázek se seznamem nástrojů pro big data, může se zdát, že všechny možné niky v této oblasti jsou již obsazeny. Při tak velké konkurenci by mělo být velmi těžké přijít s převratnou technologií.

Tvůrci Apache Flink na to mají jiný názor. Začalo to jako výzkumný projekt s názvem Stratosféra. Stratosféra byla rozvětvena a z tohoto rozvětvení se stalo to, co známe jako Apache Flink. V roce 2014 byl přijat jako projekt Apache Incubator a jen o několik měsíců později se stal projektem nejvyšší úrovně Apache. V době psaní tohoto článku má projekt téměř dvanáct tisíc revizí a více než 300 přispěvatelů.

Proč je mu věnována taková pozornost? Je to proto, že Apache Flink byl označen za framework nové generace pro zpracování velkých dat a má za sebou dostatek inovací, aby nahradil Apache Spark a stal se novým de facto nástrojem pro dávkové a proudové zpracování.

Měli byste přejít na Apache Flink? Měli byste ještě chvíli zůstat u Apache Spark? Nebo je Apache Flink jen nový trik? Tento článek se vám pokusí dát odpovědi na tyto a další otázky.

Pokud jste posledních pár let nežili pod kamenem, o Apache Spark jste určitě slyšeli. Vypadá to, že každý moderní systém, který zpracovává jakýkoli druh dat, tak či onak používá Apache Spark.

Po dlouhou dobu byl Spark nejnovějším a nejlepším nástrojem v této oblasti. Ve srovnání se svými předchůdci přinesl několik působivých vlastností, jako například:

  • Působivá rychlost: Je desetkrát rychlejší než Hadoop, pokud se data zpracovávají na disku, a až stokrát rychlejší, pokud se data zpracovávají v paměti.
  • Jednodušší model směrovaných acyklických grafů: Spark umožňuje místo definování úloh zpracování dat pomocí rigidního rámce MapReduce definovat graf úloh, který může implementovat složité algoritmy zpracování dat
  • Proudové zpracování: S nástupem nových technologií, jako je internet věcí, nestačí pouze zpracovávat obrovské množství dat. Nyní potřebujeme zpracovávat obrovské množství dat tak, jak přicházejí v reálném čase. Proto Apache Spark zavedl proudové zpracování, které umožňuje zpracovávat potenciálně nekonečný proud dat.
  • Bohatá sada knihoven:

Pro lepší představu o psaní aplikací s Apache Spark se podívejme, jak lze implementovat jednoduchou aplikaci pro počítání slov, která by spočítala, kolikrát bylo které slovo použito v textovém dokumentu:

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

Pokud znáte jazyk Scala, měl by vám tento kód připadat jednoduchý a podobá se práci s běžnými kolekcemi. Nejprve načteme seznam řádků ze souboru umístěného v adresáři file/path“. Tímto souborem může být buď lokální soubor, nebo soubor na HDFS či S3.

Poté každý řádek rozdělíme na seznam slov pomocí metody flatMap, která jednoduše rozdělí řetězec pomocí symbolu mezery. Poté pro realizaci počítání slov použijeme metodu map, která převede každé slovo na dvojici, kde prvním prvkem dvojice je slovo ze vstupního textu a druhým prvkem je jednoduše číslo jedna.

V posledním kroku se jednoduše spočítá, kolikrát bylo každé slovo použito, a to tak, že se sečtou čísla pro všechny dvojice pro stejné slovo.

Apache Spark se jeví jako skvělý a všestranný nástroj. Co ale přináší Apache Flink?

Na první pohled se zdá, že rozdílů není mnoho. Schéma architektury vypadá velmi podobně:

Pokud se podíváte na příklad kódu aplikace pro počítání slov pro Apache Flink, zjistíte, že se téměř neliší:

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

Málo výrazné rozdíly jsou v tom, že v tomto případě musíme použít metodu readTextFile místo metody textFile a že musíme použít dvojici metod: groupBy a sum místo reduceByKey.

Tak o co jde? Apache Flink možná nemá navenek žádné viditelné rozdíly, ale rozhodně má dostatek inovací, aby se stal nástrojem pro zpracování dat nové generace. Zde jsou jen některé z nich:

  • Implementuje skutečné proudové zpracování: Při zpracování proudu v Apache Spark s ním zachází jako s mnoha malými dávkovými problémy, a proto je proudové zpracování speciálním případem. Naproti tomu Apache Flink považuje dávkové zpracování za speciální a nepoužívá mikrodávkování.
  • Lepší podpora cyklického a iterativního zpracování:
  • Vlastní správa paměti: Flink poskytuje některé další operace, které umožňují implementovat cykly ve vaší streamovací aplikaci a algoritmy, které potřebují provést několik iterací nad dávkovými daty: Apache Flink je aplikace v jazyce Java, ale nespoléhá se zcela na garbage collector JVM. Implementuje vlastní správce paměti, který ukládá data ke zpracování do polí bajtů. To umožňuje snížit zatížení garbage collectoru a zvýšit výkon. Můžete si o tom přečíst v tomto příspěvku na blogu.
  • Nižší latence a vyšší propustnost:
  • Výkonné operátory oken: Z několika testů provedených třetími stranami vyplývá, že Apache Flink má nižší latenci a vyšší propustnost než jeho konkurenti: Když potřebujete zpracovat proud dat, ve většině případů potřebujete aplikovat funkci na konečnou skupinu prvků v proudu. Například můžete potřebovat spočítat, kolik kliknutí získala vaše aplikace v každém pětiminutovém intervalu, nebo můžete chtít vědět, jaký byl nejpopulárnější tweet na Twitteru v každém desetiminutovém intervalu. Spark sice některé z těchto případů použití podporuje, ale Apache Flink poskytuje mnohem výkonnější sadu operátorů pro zpracování proudů.
  • Implementuje lehké distribuované snímky:

Takže pracujete na novém projektu a potřebujete pro něj vybrat software. Jaký by měl ypi použít? Spark? Flink?

Jistěže zde neexistuje správná nebo špatná odpověď. Pokud potřebujete provádět komplexní proudové zpracování, pak bych doporučil použít Apache Flink. Má lepší podporu pro zpracování proudů a některá významná vylepšení.

Pokud nepotřebujete špičkové funkce pro zpracování proudů a chcete zůstat na bezpečné straně, bude možná lepší zůstat u Apache Spark. Je to vyspělejší projekt, má větší uživatelskou základnu, více školicích materiálů a více knihoven třetích stran. Mějte však na paměti, že Apache Flink tuto mezeru každou minutou zmenšuje. Stále více projektů se rozhoduje pro Apache Flink, protože se stává vyzrálejším projektem.

Pokud naopak rádi experimentujete s nejnovějšími technologiemi, rozhodně musíte dát šanci Apache Flink.

Znamená to všechno, že Apache Spark je zastaralý a za pár let budeme všichni používat Apache Flink? Odpověď vás možná překvapí. Zatímco Flink má některé působivé funkce, Spark nezůstane stejný. Například Apache Spark zavedl vlastní správu paměti v roce 2015 s vydáním projektu Tungsten a od té doby přidává funkce, které poprvé představil Apache Flink. O vítězi zatím není rozhodnuto.

V příštích příspěvcích na blogu budu psát více o tom, jak můžete Apache Flink používat pro dávkové a proudové zpracování, takže zůstaňte s námi!

Pokud se chcete o Apache Flink dozvědět více, můžete se podívat na můj kurz Pluralsight, kde se Apache Flink věnuji podrobněji. Zde je krátký náhled tohoto kurzu.

Napsat komentář