Jaka jest / są główne różnice między Flink i Storm?

137

Flink został porównany do Sparka , co, jak widzę, jest błędnym porównaniem, ponieważ porównuje system przetwarzania zdarzeń okienkowanych z mikro-wsadami; Podobnie, nie ma dla mnie większego sensu porównywanie Flinka do Samzy. W obu przypadkach porównuje strategię przetwarzania w czasie rzeczywistym ze strategią przetwarzania zdarzeń wsadowych, nawet jeśli w przypadku Samzy na mniejszą „skalę”. Ale chciałbym wiedzieć, jak Flink wypada w porównaniu ze Stormem, który koncepcyjnie wydaje się znacznie bardziej do niego podobny.

Znalazłem to (slajd # 4), dokumentując główną różnicę jako „regulowane opóźnienie” dla Flink. Kolejną wskazówką wydaje się być artykuł autorstwa Slicon Angle, który sugeruje, że Flink lepiej integruje się ze światem Spark lub HadoopMR, ale nie wspomina się ani nie wspomina o żadnych rzeczywistych szczegółach. Na koniec sam Fabian Hueske zauważa w wywiadzie, że „W porównaniu z Apache Storm, funkcja analizy strumienia Flink oferuje wysokopoziomowy interfejs API i wykorzystuje lżejszą strategię odporności na błędy, aby zapewnić gwarancje przetwarzania dokładnie raz”.

To wszystko jest dla mnie trochę rzadkie i nie do końca rozumiem, o co chodzi. Czy ktoś może wyjaśnić, jakie problemy z przetwarzaniem strumieni w Storm są (są?) Dokładnie rozwiązywane przez Flink? Do czego Hueske odnosi się w kwestiach API i ich „lżejszej strategii odporności na błędy”?

fnl
źródło
2
Zwróć uwagę, że Apache Spark (punkt skupienia połączonego pytania) nie jest tym samym, co Apache Storm (to pytanie tutaj) - więc nie, nie jest to bynajmniej duplikat.
fnl

Odpowiedzi:

212

Zastrzeżenie : Jestem promotorem Apache Flink i członkiem PMC i znam tylko wysokopoziomowy projekt Storm, a nie jego elementy wewnętrzne.

Apache Flink to platforma do ujednoliconego przetwarzania strumieniowego i wsadowego. Środowisko uruchomieniowe Flink natywnie obsługuje obie domeny ze względu na potokowe przesyłanie danych między równoległymi zadaniami, które obejmują potokowe tasowanie. Rekordy są natychmiast wysyłane z zadań produkcyjnych do zadań odbiorczych (po zebraniu w buforze do transferu sieciowego). Zadania wsadowe mogą być opcjonalnie wykonywane przy użyciu blokowania przesyłania danych.

Apache Spark to platforma obsługująca również przetwarzanie wsadowe i strumieniowe. Batch API Flink wygląda dość podobnie i dotyczy podobnych przypadków użycia jak Spark, ale różni się wewnętrznymi. W przypadku przesyłania strumieniowego oba systemy stosują bardzo różne podejścia (mini-partie vs. przesyłanie strumieniowe), co czyni je odpowiednimi do różnych rodzajów aplikacji. Powiedziałbym, że porównanie Sparka i Flinka jest poprawne i przydatne, jednak Spark nie jest najbardziej podobnym silnikiem przetwarzania strumienia do Flinka.

Wracając do pierwotnego pytania, Apache Storm to procesor strumienia danych bez możliwości wsadowych. W rzeczywistości potokowy silnik Flinka wewnętrznie wygląda trochę podobnie do Storm, tj. Interfejsy równoległych zadań Flinka są podobne do śrub Storma. Storm i Flink mają wspólną cechę, że ich celem jest przetwarzanie strumienia o niskim opóźnieniu przez potokowe przesyłanie danych. Jednak Flink oferuje bardziej zaawansowane API w porównaniu do Storm. Zamiast implementować funkcjonalność śrub z jednym lub kilkoma czytnikami i kolekcjonerami, API DataStream firmy Flink zapewnia funkcje takie jak Map, GroupBy, Window i Join. Wiele z tych funkcji należy zaimplementować ręcznie podczas korzystania ze Storm. Kolejną różnicą jest semantyka przetwarzania. Storm gwarantuje przetwarzanie przynajmniej raz, podczas gdy Flink zapewnia dokładnie raz. Implementacje, które dają te gwarancje przetwarzania, różnią się znacznie. Podczas gdy Storm używa potwierdzeń na poziomie rekordu, Flink używa wariantu algorytmu Chandy-Lamport. Krótko mówiąc, źródła danych okresowo wprowadzają znaczniki do strumienia danych. Za każdym razem, gdy operator otrzyma taki znacznik, sprawdza swój stan wewnętrzny. Kiedy znacznik został odebrany przez wszystkie ujścia danych, znacznik (i wszystkie rekordy, które zostały wcześniej przetworzone) są zatwierdzane. W przypadku awarii wszyscy operatorzy źródeł są resetowani do stanu, w którym widzieli ostatni zatwierdzony znacznik, a przetwarzanie jest kontynuowane. To podejście do punktów kontrolnych znaczników jest lżejsze niż rekordy potwierdzeń Storm. To źródła danych okresowo wprowadzają znaczniki do strumienia danych. Za każdym razem, gdy operator otrzyma taki znacznik, sprawdza swój stan wewnętrzny. Kiedy znacznik został odebrany przez wszystkie ujścia danych, znacznik (i wszystkie rekordy, które zostały wcześniej przetworzone) są zatwierdzane. W przypadku awarii wszyscy operatorzy źródeł są resetowani do stanu, w którym widzieli ostatni zatwierdzony znacznik, a przetwarzanie jest kontynuowane. To podejście do punktów kontrolnych znaczników jest lżejsze niż rekordy potwierdzeń Storm. To źródła danych okresowo wprowadzają znaczniki do strumienia danych. Za każdym razem, gdy operator otrzyma taki znacznik, sprawdza swój stan wewnętrzny. Kiedy znacznik został odebrany przez wszystkie ujścia danych, znacznik (i wszystkie rekordy, które zostały wcześniej przetworzone) są zatwierdzane. W przypadku awarii wszyscy operatorzy źródeł są resetowani do stanu, w którym widzieli ostatni zatwierdzony znacznik, a przetwarzanie jest kontynuowane. To podejście do punktów kontrolnych znaczników jest lżejsze niż rekordy potwierdzeń Storm. To wszyscy operatorzy źródeł są resetowani do swojego stanu, gdy zobaczyli ostatni zatwierdzony znacznik, a przetwarzanie jest kontynuowane. To podejście do punktów kontrolnych znaczników jest lżejsze niż rekordy potwierdzeń Storm. To wszyscy operatorzy źródeł są resetowani do swojego stanu, gdy zobaczyli ostatni zatwierdzony znacznik, a przetwarzanie jest kontynuowane. To podejście do punktów kontrolnych znaczników jest lżejsze niż rekordy potwierdzeń Storm. Tozestaw slajdów i odpowiednia dyskusja omawiają podejście Flink do przetwarzania strumieniowego, w tym odporność na błędy, punkty kontrolne i obsługę stanu.

Storm oferuje również dokładnie jednorazowe API wysokiego poziomu o nazwie Trident. Jednak Trident jest oparty na mini-partiach i dlatego jest bardziej podobny do Sparka niż do Flinka.

Regulowane opóźnienie Flink odnosi się do sposobu, w jaki Flink wysyła rekordy z jednego zadania do drugiego. Powiedziałem wcześniej, że Flink używa potokowego przesyłania danych i przekazuje rekordy, gdy tylko zostaną wyprodukowane. W celu zwiększenia wydajności rekordy te są gromadzone w buforze, który jest przesyłany przez sieć po zapełnieniu lub po przekroczeniu określonego progu czasowego. Ten próg kontroluje opóźnienie rekordów, ponieważ określa maksymalny czas, przez jaki rekord pozostanie w buforze bez wysyłania do następnego zadania. Nie można go jednak użyć do udzielenia twardych gwarancji co do czasu potrzebnego na wejście rekordu do wyjścia z programu, ponieważ zależy to również między innymi od czasu przetwarzania zadań i liczby transferów sieciowych.

Fabian Hueske
źródło
2
Na prawdę bardzo ci dziękuję! Może jeden punkt otwarty, jeśli mogę jeszcze raz przeszkadzać: o co chodzi z tym problemem „regulowanego opóźnienia”? Wydaje się, że może to być całkiem istotne, biorąc pod uwagę, że różne domeny aplikacji będą miały różne wymagania w tym zakresie. Czy możesz wyjaśnić, co to oznacza, przynajmniej w odniesieniu do Flinka?
fnl
6
Jasne, przedłużyłem odpowiedź i omówiłem regulowane opóźnienie. Daj mi znać, jeśli masz dalsze pytania.
Fabian Hueske
Czy Flink dopuszcza „gorące” zmiany w przepływie pracy DAG, jak można zaimplementować np. Używając Erlanga? TO ZNACZY. Czy można zmienić DAG podczas działania?
Thomas Browne
1
Wymiana kodu na gorąco nie jest możliwa. Można jednak zachować stan aplikacji jako punkt zapisu. Punkt zapisu może służyć do uruchamiania zmodyfikowanej aplikacji. Można to zrobić, gdy oryginalna aplikacja nadal działa, tak że dane wyjściowe można w pewnym momencie odwrócić. Pamiętaj, że aplikacje nie mogą być dowolnie modyfikowane podczas wznawiania z istniejącego punktu zapisu.
Fabian Hueske
1
Ciekawą i ogromną zaletą Flink jest możliwość uruchamiania Apache Beam z jeszcze wyższym poziomem API. To jeden z najbardziej bogatych i kompletnych biegaczy Beama.
Piotr Gwiazda
47

Dodając do odpowiedzi Fabiana Hueske:

Flink ulepsza Storm dodatkowo również w następujący sposób:

  • Ciśnienie wsteczne: środowisko uruchomieniowe przesyłania strumieniowego Flink zachowuje się dobrze, gdy różni operatorzy działają z różnymi prędkościami, ponieważ operatorzy końcowi bardzo dobrze zmniejszają ciśnienie wsteczne operatorów wyższego szczebla, chociaż warstwa sieci zarządza pulami buforów.

  • Stan zdefiniowany przez użytkownika: Flink umożliwia programom utrzymanie niestandardowego stanu w operatorach. Ten stan może faktycznie uczestniczyć w punktach kontrolnych pod kątem odporności na błędy, zapewniając dokładnie jednorazowe gwarancje dla niestandardowego stanu zdefiniowanego przez użytkownika. Zobacz ten przykład maszyny stanu zdefiniowanej przez użytkownika wewnątrz operatora, która jest konsekwentnie kontrolowana razem ze strumieniem danych.

  • Streaming Windows: Okienkowanie strumieni i agregacje okien są kluczowym elementem do analizy strumieni danych. Flink jest wyposażony w dość potężny system okienkowy, który obsługuje wiele typów okien.

Stephan Ewen
źródło
2
Jeśli chodzi o twój pierwszy punkt, Storm zachowuje się dobrze pod przeciwciśnieniem od 1.0 (opublikowany w kwietniu 2016)
Colin Nichols
Przeciwciśnienie burzy można złagodzić za pomocą właściwości „spout_max_pending”. Ustawia próg dla maksymalnej liczby krotek, które mogą znajdować się w wylewce i oczekują na potwierdzenie. Dziobek nie zużyje więcej krotek, dopóki nie nastąpi potwierdzenie.
Aman Garg
3

Na podstawie moich doświadczeń z Storm and Flink. Czuję, że te narzędzia mogą rozwiązać ten sam problem przy różnych podejściach. Każda funkcja Flink wspomniana przez @Stephan Ewen może być teraz dopasowana przez Storm do wewnętrznego API (tj. Spolts and bolts ) i Trident API. Ktoś twierdzi, że Trident jest w stylu mini-wsadowym, podczas gdy myślę, że większość złożonych aplikacji związanych ze stanem lub agregacją może polegać tylko na przetwarzaniu wsadowym w stylu okna. Dlatego wymieniam tutaj tylko kilka głównych różnic, nie mówiąc, co jest lepsze.

  • Styl rozwoju . zorientowany na obliczenia (np. operator łańcuchowy) w Flink vs. zorientowany na strumień danych (np. addSpolt()/addBolt()) w Storm.
  • Interfejs API wysokiego poziomu . Funkcje (np. Mapa, Okno, Dołącz na poziomie przesyłania strumieniowego) w Flink vs. Native Window i Trident in Storm.
  • Gwarantowane przetwarzanie wiadomości (GMP, tj. Dokładnie raz ) . Punkt kontrolny z dwufazowym łącznikiem zatwierdzania (np. KafkaConsumer) w środowisku Flink vs. Tuple-tree z zewnętrzną maszyną stanu lub Trident w Storm.
  • Tolerancja błędów . Punkt kontrolny znacznika we Flink vs. potwierdzenie potwierdzenia na poziomie rekordu w Storm.
  • Architektura wewnętrzna . Prosta abstrakcja i względna równoległość (np. Gniazdo dla każdego wątku rozpatrywanego z rdzeniami procesora) w Flink a abstrakcje wielowarstwowe (np. Gniazdo dla każdej maszyny JVM jako pracownika nadzorcy i każdego przełożonego może mieć wielu pracowników) w Storm.
LeoZhang
źródło
3

Zastrzeżenie: Jestem pracownikiem Cloudera, głównym zwolennikiem Storm i (wkrótce) Flink.

Funkcjonalny

Przedstawiono już wiele dobrych punktów technicznych. Bardzo krótkie podsumowanie najważniejszych informacji:

  • Zarówno Flink, jak i Storm mogą przetwarzać dane zdarzenie
  • Wydaje się, że Storm nie obsługuje czasu wydarzenia po wyjęciu z pudełka
  • Storm nie wycofał obsługi SQL z etapu eksperymentalnego

Niefunkcjonalne

  • Wielu klientów uznało Storm za (zbyt) trudny w użyciu
  • Przyjęcie burzy spowolniło, a społeczność Flink wydaje się być teraz bardziej aktywna niż Storm
  • Flink wciąż ma trochę do nadrobienia (np. Udokumentowane przykłady), ale ogólnie nadrobił zaległości w prawie każdym obszarze, o którym możesz pomyśleć

Wniosek

Cloudera niedawno ogłosiła wycofanie Storm (w HDP). I jednocześnie Flink został ogłoszony jego następcą.

Tak więc, jeśli masz przypadki użycia podczas burzy, oczywiście będą nadal działać. Ale w nowych przypadkach zajrzałbym do Flinka lub innych silników do przesyłania strumieniowego.

Dennis Jaheruddin
źródło