Jeśli spojrzeć na ten obrazek z listą narzędzi do big data, może się wydawać, że wszystkie możliwe nisze w tej dziedzinie są już zajęte. Przy tak dużej konkurencji wymyślenie przełomowej technologii powinno być bardzo trudne.
Inne zdanie na ten temat mają twórcy Apache Flink. Zaczęło się jako projekt badawczy o nazwie Stratosphere. Stratosphere został rozwidlony, a ten widelec stał się tym, co znamy jako Apache Flink. W 2014 roku został zaakceptowany jako projekt Apache Incubator, a zaledwie kilka miesięcy później stał się projektem Apache najwyższego poziomu. W momencie pisania tego tekstu projekt ma prawie dwanaście tysięcy commitów i ponad 300 współtwórców.
Dlaczego jest tak dużo uwagi? To dlatego, że Apache Flink został nazwany frameworkiem nowej generacji do przetwarzania dużych danych i ma wystarczająco dużo innowacji pod swoim paskiem, aby zastąpić Apache Spark i stać się nowym narzędziem de-facto do przetwarzania wsadowego i strumieniowego.
Czy powinieneś przejść na Apache Flink? Czy powinieneś pozostać przy Apache Spark przez jakiś czas? A może Apache Flink to tylko nowa sztuczka? Ten artykuł postara się udzielić odpowiedzi na te i inne pytania.
Jeśli nie żyłeś pod kamieniem przez ostatnie kilka lat, słyszałeś o Apache Spark. Wygląda na to, że każdy nowoczesny system, który zajmuje się przetwarzaniem danych, używa Apache Spark w taki czy inny sposób.
Przez długi czas Spark był najnowszym i najwspanialszym narzędziem w tej dziedzinie. Dostarczył kilka imponujących funkcji w porównaniu do swoich poprzedników, takich jak:
- Imponująca szybkość: Jest dziesięć razy szybszy niż Hadoop, jeśli dane są przetwarzane na dysku i do 100 razy szybszy, jeśli dane są przetwarzane w pamięci.
- Prostszy model skierowanego grafu acyklicznego: Zamiast definiować swoje zadania przetwarzania danych za pomocą sztywnych ram MapReduce Spark umożliwia definiowanie grafu zadań, które mogą implementować złożone algorytmy przetwarzania danych
- Przetwarzanie strumieniowe: Wraz z nadejściem nowych technologii, takich jak Internet Rzeczy, nie wystarczy już po prostu przetwarzać ogromnej ilości danych. Teraz potrzebujemy przetwarzania ogromnej ilości danych w miarę ich napływu w czasie rzeczywistym. Właśnie dlatego Apache Spark wprowadził przetwarzanie strumieniowe, które pozwala na przetwarzanie potencjalnie nieskończonego strumienia danych.
- Bogaty zestaw bibliotek: Oprócz podstawowych funkcji Apache Spark udostępnia potężne biblioteki do uczenia maszynowego, przetwarzania grafów i wykonywania zapytań SQL.
Aby lepiej wyobrazić sobie, jak pisze się aplikacje z Apache Spark, przyjrzyjmy się, jak można zaimplementować prostą aplikację zliczającą słowa, która liczyłaby, ile razy każde słowo zostało użyte w dokumencie tekstowym:
// 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(_ + _)
Jeśli znasz Scalę, ten kod powinien wydawać się prosty i jest podobny do pracy ze zwykłymi kolekcjami. Po pierwsze, odczytujemy listę linii z pliku znajdującego się w file/path”. Ten plik może być zarówno plikiem lokalnym, jak i plikiem w HDFS lub S3.
Następnie każda linia jest dzielona na listę słów za pomocą metody flatMap
, która po prostu dzieli ciąg znaków przez symbol spacji. Następnie, aby zaimplementować liczenie słów, używamy metody map
do konwersji każdego słowa na parę, gdzie pierwszy element pary jest słowem z tekstu wejściowego, a drugi element jest po prostu liczbą jeden.
Ostatni krok po prostu liczy, ile razy każde słowo zostało użyte przez sumowanie liczb dla wszystkich par dla tego samego słowa.
Apache Spark wydaje się być świetnym i wszechstronnym narzędziem. Ale co Apache Flink wnosi do stołu?
Na pierwszy rzut oka, nie wydaje się, aby było wiele różnic. Diagram architektury wygląda bardzo podobnie:
Jeśli spojrzysz na przykład kodu dla aplikacji word count dla Apache Flink, zobaczysz, że nie ma prawie żadnych różnic:
val file = env.readTextFile("file/path")val counts = file .flatMap(line => line.split(" ")) .map(word => (word, 1)) .groupBy(0) .sum(1)
Kilka zauważalnych różnic, to to, że w tym przypadku musimy użyć metody readTextFile
zamiast metody textFile
oraz to, że musimy użyć pary metod: groupBy
i sum
zamiast reduceByKey
.
O co więc chodzi w tym całym zamieszaniu? Apache Flink może nie ma żadnych widocznych różnic na zewnątrz, ale na pewno ma wystarczająco dużo innowacji, aby stać się narzędziem do przetwarzania danych nowej generacji. Oto tylko niektóre z nich:
- Implementuje rzeczywiste przetwarzanie strumieniowe: Kiedy przetwarzasz strumień w Apache Spark, traktuje go jako wiele małych problemów wsadowych, czyniąc tym samym przetwarzanie strumieniowe szczególnym przypadkiem. Z kolei Apache Flink traktuje przetwarzanie wsadowe jako specjalny przypadek i nie używa mikropatchingu.
- Lepsze wsparcie dla przetwarzania cyklicznego i iteracyjnego: Flink zapewnia kilka dodatkowych operacji, które pozwalają zaimplementować cykle w twojej aplikacji strumieniowej i algorytmach, które muszą wykonać kilka iteracji na danych wsadowych.
- Niestandardowe zarządzanie pamięcią: Apache Flink jest aplikacją Java, ale nie polega całkowicie na garbage collectorze JVM. Implementuje on niestandardowy menedżer pamięci, który przechowuje dane do przetworzenia w tablicach bajtowych. Pozwala to na zmniejszenie obciążenia garbage collectora i zwiększenie wydajności. Możesz o tym przeczytać w tym wpisie na blogu.
- Niższe opóźnienia i wyższa przepustowość: Wielokrotne testy wykonane przez strony trzecie sugerują, że Apache Flink ma niższe opóźnienia i wyższą przepustowość niż jego konkurenci.
- Potężne operatory windowsowe: Kiedy trzeba przetworzyć strumień danych w większości przypadków trzeba zastosować funkcję do skończonej grupy elementów w strumieniu. Na przykład, możesz potrzebować policzyć ile kliknięć otrzymała Twoja aplikacja w każdym pięciominutowym przedziale czasowym, lub możesz chcieć wiedzieć jaki był najpopularniejszy tweet na Twitterze w każdym dziesięciominutowym przedziale czasowym. Podczas gdy Spark obsługuje niektóre z tych przypadków użycia, Apache Flink zapewnia znacznie potężniejszy zestaw operatorów do przetwarzania strumieniowego.
- Implementuje lekkie, rozproszone migawki: Pozwala to Apache Flink zapewnić niski narzut i gwarancje przetwarzania only-once w przetwarzaniu strumieniowym, bez używania mikropatchingu, jak robi to Spark.
Więc, pracujesz nad nowym projektem i musisz wybrać dla niego oprogramowanie. Czego powinien użyć ypi? Spark? Flink?
Oczywiście, nie ma tu dobrej lub złej odpowiedzi. Jeśli potrzebujesz wykonać złożone przetwarzanie strumieniowe, to polecam użycie Apache Flink. Ma lepsze wsparcie dla przetwarzania strumieni i kilka znaczących ulepszeń.
Jeśli nie potrzebujesz najnowocześniejszych funkcji przetwarzania strumieni i chcesz pozostać po bezpiecznej stronie, może lepiej trzymać się Apache Spark. Jest to bardziej dojrzały projekt, który ma większą bazę użytkowników, więcej materiałów szkoleniowych i więcej bibliotek stron trzecich. Należy jednak pamiętać, że Apache Flink z każdą minutą wypełnia tę lukę. Coraz więcej projektów wybiera Apache Flink, ponieważ staje się on bardziej dojrzałym projektem.
Jeśli z drugiej strony lubisz eksperymentować z najnowszą technologią, zdecydowanie musisz dać Apache Flink szansę.
Czy to wszystko oznacza, że Apache Spark jest przestarzały i za kilka lat wszyscy będziemy używać Apache Flink? Odpowiedź może Cię zaskoczyć. Podczas gdy Flink ma kilka imponujących funkcji, Spark nie pozostaje taki sam. Na przykład Apache Spark wprowadził niestandardowe zarządzanie pamięcią w 2015 roku wraz z wydaniem projektu Tungsten, a od tego czasu dodaje funkcje, które po raz pierwszy zostały wprowadzone przez Apache Flink. Zwycięzca nie jest jeszcze rozstrzygnięty.
W nadchodzących postach na blogu napiszę więcej o tym, jak można wykorzystać Apache Flink do przetwarzania wsadowego i strumieniowego, więc stay tuned!
Jeśli chcesz dowiedzieć się więcej o Apache Flink, możesz rzucić okiem na mój kurs Pluralsight, w którym pokrywam Apache Flink w bardziej szczegółowy sposób. Oto krótka zapowiedź tego kursu.