Descargo de responsabilidad : soy un confirmador de Apache Flink y miembro de PMC y solo estoy familiarizado con el diseño de alto nivel de Storm, no con sus componentes internos.
Apache Flink es un marco para el flujo unificado y el procesamiento por lotes. El tiempo de ejecución de Flink admite de forma nativa ambos dominios debido a las transferencias de datos canalizados entre tareas paralelas que incluyen barajamientos canalizados. Los registros se envían inmediatamente de las tareas de producción a las tareas de recepción (después de ser recopilados en un búfer para la transferencia de red). Los trabajos por lotes se pueden ejecutar opcionalmente mediante el bloqueo de transferencias de datos.
Apache Spark es un marco que también admite el procesamiento por lotes y por secuencias. La API por lotes de Flink se ve bastante similar y aborda casos de uso similares a los de Spark, pero difiere en lo interno. Para la transmisión, ambos sistemas siguen enfoques muy diferentes (mini lotes frente a la transmisión), lo que los hace adecuados para diferentes tipos de aplicaciones. Yo diría que comparar Spark y Flink es válido y útil, sin embargo, Spark no es el motor de procesamiento de flujo más similar a Flink.
Volviendo a la pregunta original, Apache Storm es un procesador de flujo de datos sin capacidades por lotes. De hecho, el motor canalizado de Flink se parece internamente a Storm, es decir, las interfaces de las tareas paralelas de Flink son similares a los tornillos de Storm. Storm y Flink tienen en común que su objetivo es el procesamiento de flujo de baja latencia mediante transferencias de datos canalizadas. Sin embargo, Flink ofrece una API de más alto nivel en comparación con Storm. En lugar de implementar la funcionalidad de los tornillos con uno o más lectores y recolectores, la API DataStream de Flink proporciona funciones como Map, GroupBy, Window y Join. Mucha de esta funcionalidad debe implementarse manualmente cuando se usa Storm. Otra diferencia es la semántica de procesamiento. Storm garantiza el procesamiento al menos una vez, mientras que Flink proporciona exactamente una vez. Las implementaciones que dan estas garantías de procesamiento difieren bastante. Mientras que Storm usa reconocimientos a nivel de registro, Flink usa una variante del algoritmo Chandy-Lamport. En pocas palabras, las fuentes de datos inyectan marcadores periódicamente en el flujo de datos. Cada vez que un operador recibe dicho marcador, controla su estado interno. Cuando todos los receptores de datos reciben un marcador, el marcador (y todos los registros que se han procesado antes) se confirman. En caso de falla, todos los operadores de fuentes se restablecen a su estado cuando vieron el último marcador comprometido y el procesamiento continúa. Este enfoque de marcador-punto de control es más liviano que los reconocimientos a nivel de registro de Storm. Esta Las fuentes de datos inyectan marcadores periódicamente en el flujo de datos. Cada vez que un operador recibe dicho marcador, controla su estado interno. Cuando todos los receptores de datos reciben un marcador, el marcador (y todos los registros que se han procesado antes) se confirman. En caso de falla, todos los operadores de fuentes se restablecen a su estado cuando vieron el último marcador comprometido y el procesamiento continúa. Este enfoque de marcador-punto de control es más liviano que los reconocimientos a nivel de registro de Storm. Esta Las fuentes de datos inyectan marcadores periódicamente en el flujo de datos. Cada vez que un operador recibe dicho marcador, controla su estado interno. Cuando todos los receptores de datos reciben un marcador, el marcador (y todos los registros que se han procesado antes) se confirman. En caso de falla, todos los operadores de fuentes se restablecen a su estado cuando vieron el último marcador comprometido y el procesamiento continúa. Este enfoque de marcador-punto de control es más liviano que los reconocimientos a nivel de registro de Storm. Esta Todos los operadores de fuentes se restablecen a su estado cuando vieron el último marcador confirmado y el procesamiento continúa. Este enfoque de marcador-punto de control es más liviano que los reconocimientos a nivel de registro de Storm. Esta Todos los operadores de fuentes se restablecen a su estado cuando vieron el último marcador confirmado y el procesamiento continúa. Este enfoque de marcador-punto de control es más liviano que los reconocimientos a nivel de registro de Storm. Estael conjunto de diapositivas y la charla correspondiente discuten el enfoque de procesamiento de transmisión de Flink, incluida la tolerancia a fallas, la verificación de puntos y el manejo del estado.
Storm también ofrece una API de alto nivel exactamente una vez llamada Trident. Sin embargo, Trident se basa en mini lotes y, por lo tanto, es más similar a Spark que a Flink.
La latencia ajustable de Flink se refiere a la forma en que Flink envía registros de una tarea a otra. Dije antes, que Flink usa transferencias de datos canalizadas y envía registros tan pronto como se producen. Para mayor eficiencia, estos registros se recopilan en un búfer que se envía a través de la red una vez que está lleno o se alcanza un cierto límite de tiempo. Este umbral controla la latencia de los registros porque especifica la cantidad máxima de tiempo que un registro permanecerá en un búfer sin ser enviado a la siguiente tarea. Sin embargo, no se puede usar para dar garantías sólidas sobre el tiempo que le toma a un registro entrar y salir de un programa porque esto también depende del tiempo de procesamiento dentro de las tareas y del número de transferencias de red, entre otras cosas.