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”?
Odpowiedzi:
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.
źródło
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.
źródło
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.
addSpolt()/addBolt()
) w Storm.źródło
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:
Niefunkcjonalne
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.
źródło