Відмова : Я є виконавцем Apache Flink та членом PMC і лише знайомий з дизайном високого рівня Storm, а не з його внутрішнім середовищем.
Apache Flink - це основа для уніфікованої обробки потоку та пакетної обробки. Flink під час виконання обох доменів підтримує обидва домени завдяки конвеєрній передачі даних між паралельними завданнями, що включає переміщення в конвеєрному режимі. Записи негайно відправляються від створення завдань до прийому завдань (після того, як вони будуть зібрані в буфер для передачі мережі). Пакетні завдання можна необов'язково виконувати за допомогою блокування передачі даних.
Apache Spark - це структура, яка також підтримує пакетну та потокову обробку. Пакетний API Flink виглядає досить схожим і розглядає подібні випадки використання, як Spark, але відрізняється внутрішніми. Для потокової передачі обидві системи дотримуються дуже різних підходів (міні-партії проти потокової передачі), що робить їх придатними для різних програм. Я б сказав, що порівняння Spark і Flink є дійсним і корисним, однак Spark - не самий подібний движок обробки потоків для Flink.
Приходячи до початкового питання, Apache Storm - це процесор потоку даних без пакетних можливостей. Насправді конвеєрний двигун Flink всередині зовні трохи схожий на Storm, тобто інтерфейси паралельних завдань Flink схожі на болти Storm. Шторм і Flink мають спільне те, що вони спрямовані на обробку потоків з низькою затримкою за допомогою конвеєрних передач даних. Однак Flink пропонує більш високий рівень API порівняно з Storm. Замість того, щоб реалізувати функціональність болтів з одним або декількома читачами та колекторами, API DataStream Flink надає такі функції, як Map, GroupBy, Window та Join. Багато цього функціоналу потрібно вручну реалізувати при використанні Storm. Ще одна відмінність - це обробка семантики. Шторм гарантує хоча б один раз обробку, тоді як Flink забезпечує рівно один раз. Реалізації, які дають ці гарантії обробки, відрізняються зовсім небагато. У той час як Storm використовує підтвердження рівня запису, Flink використовує варіант алгоритму Chandy-Lamport. У двох словах, джерела даних періодично вводять маркери в потік даних. Щоразу, коли оператор отримує такий маркер, він перевіряє його внутрішній стан. Коли маркер отримав усі потоки даних, маркер (і всі записи, які раніше були оброблені), здійснюються. У разі відмови всі оператори джерела повертаються до свого стану, коли бачать останній здійснений маркер і обробка продовжується. Такий підхід до контрольно-пропускного пункту є легшим, ніж підтвердження рекордів Storm. Це джерела даних періодично вводять маркери в потік даних. Щоразу, коли оператор отримує такий маркер, він перевіряє його внутрішній стан. Коли маркер отримав усі потоки даних, маркер (і всі записи, які раніше були оброблені), здійснюються. У разі відмови всі оператори джерела повертаються до свого стану, коли бачать останній здійснений маркер і обробка продовжується. Такий підхід до контрольно-пропускного пункту є легшим, ніж підтвердження рекордів Storm. Це джерела даних періодично вводять маркери в потік даних. Щоразу, коли оператор отримує такий маркер, він перевіряє його внутрішній стан. Коли маркер отримав усі потоки даних, маркер (і всі записи, які раніше були оброблені), здійснюються. У разі відмови всі оператори джерела повертаються до свого стану, коли бачать останній здійснений маркер і обробка продовжується. Такий підхід до контрольно-пропускного пункту є легшим, ніж підтвердження рекордів Storm. Це всі оператори джерела повертаються до свого стану, коли бачили останній здійснений маркер і обробка продовжується. Такий підхід до контрольно-пропускного пункту є легшим, ніж підтвердження рекордів Storm. Це всі оператори джерела повертаються до свого стану, коли бачили останній здійснений маркер і обробка продовжується. Такий підхід до контрольно-пропускного пункту є легшим, ніж підтвердження рекордів Storm. ЦеНабір слайдів та відповідна розмова обговорюють підхід обробки потоку Flink, включаючи відмову, перевірку та обробку стану.
Storm також пропонує API одночасно високого рівня, який називається Trident. Однак Trident заснований на міні-партіях і, отже, більше схожий на Spark ніж Flink.
Регульована затримка Flink відноситься до того, як Flink надсилає записи з одного завдання в інше. Я говорив раніше, що Flink використовує конвеєрні передачі даних і передає записи, як тільки вони виробляються. Для ефективності ці записи збираються у буфер, який надсилається по мережі, коли він заповнений або визначений поріг часу. Цей поріг контролює затримку записів, оскільки він визначає максимальну кількість часу, який записуватиметься в буфері, не надсилаючись до наступного завдання. Однак він не може бути використаний для надання жорстких гарантій щодо часу, необхідного для запису від вступу до виходу з програми, оскільки це також залежить від часу обробки в межах завдань та кількості мережевих передач серед іншого.