Isenção de responsabilidade : sou um colaborador do Apache Flink e membro do PMC e estou familiarizado apenas com o design de alto nível do Storm, não com os internos.
O Apache Flink é uma estrutura para fluxo unificado e processamento em lote. O tempo de execução do Flink suporta nativamente os dois domínios devido a transferências de dados em pipeline entre tarefas paralelas, que incluem shuffles em pipeline. Os registros são enviados imediatamente, desde a produção de tarefas até as tarefas de recebimento (depois de coletados em um buffer para transferência de rede). Os trabalhos em lote podem ser executados opcionalmente usando o bloqueio de transferências de dados.
O Apache Spark é uma estrutura que também suporta processamento em lote e fluxo. A API de lote do Flink é bastante semelhante e aborda casos de uso semelhantes ao Spark, mas difere nos internos. Para streaming, os dois sistemas seguem abordagens muito diferentes (mini-lotes vs. streaming), o que os torna adequados para diferentes tipos de aplicativos. Eu diria que comparar o Spark e o Flink é válido e útil, no entanto, o Spark não é o mecanismo de processamento de fluxo mais semelhante ao Flink.
Chegando à pergunta original, o Apache Storm é um processador de fluxo de dados sem recursos em lote. De fato, o mecanismo em pipeline do Flink internamente se parece um pouco com o Storm, ou seja, as interfaces das tarefas paralelas do Flink são semelhantes aos parafusos do Storm. Storm e Flink têm em comum que eles visam o processamento de fluxo de baixa latência por transferências de dados em pipeline. No entanto, o Flink oferece uma API de mais alto nível em comparação com o Storm. Em vez de implementar a funcionalidade de um parafuso com um ou mais leitores e coletores, a API DataStream do Flink fornece funções como Map, GroupBy, Window e Join. Muitas dessas funcionalidades devem ser implementadas manualmente ao usar o Storm. Outra diferença é a semântica de processamento. O Storm garante processamento pelo menos uma vez, enquanto o Flink fornece exatamente uma vez. As implementações que dão essas garantias de processamento diferem bastante. Enquanto o Storm usa reconhecimentos em nível de registro, o Flink usa uma variante do algoritmo Chandy-Lamport. Em poucas palavras, as fontes de dados injetam periodicamente marcadores no fluxo de dados. Sempre que um operador recebe esse marcador, ele verifica seu estado interno. Quando um marcador foi recebido por todos os coletores de dados, o marcador (e todos os registros que foram processados antes) são confirmados. Em caso de falha, todos os operadores de origem são redefinidos para seu estado quando viram o último marcador confirmado e o processamento é continuado. Essa abordagem de ponto de verificação de marcador é mais leve que as confirmações em nível de registro do Storm. este as fontes de dados injetam periodicamente marcadores no fluxo de dados. Sempre que um operador recebe esse marcador, ele verifica seu estado interno. Quando um marcador foi recebido por todos os coletores de dados, o marcador (e todos os registros que foram processados antes) são confirmados. Em caso de falha, todos os operadores de origem são redefinidos para seu estado quando viram o último marcador confirmado e o processamento é continuado. Essa abordagem de ponto de verificação de marcador é mais leve que as confirmações em nível de registro do Storm. este as fontes de dados injetam periodicamente marcadores no fluxo de dados. Sempre que um operador recebe esse marcador, ele verifica seu estado interno. Quando um marcador foi recebido por todos os coletores de dados, o marcador (e todos os registros que foram processados antes) são confirmados. Em caso de falha, todos os operadores de origem são redefinidos para seu estado quando viram o último marcador confirmado e o processamento é continuado. Essa abordagem de ponto de verificação de marcador é mais leve que as confirmações em nível de registro do Storm. este todos os operadores de origem são redefinidos para seu estado quando viram o último marcador confirmado e o processamento continua. Essa abordagem de ponto de verificação de marcador é mais leve que as confirmações em nível de registro do Storm. este todos os operadores de origem são redefinidos para seu estado quando viram o último marcador confirmado e o processamento continua. Essa abordagem de ponto de verificação de marcador é mais leve que as confirmações em nível de registro do Storm. esteO conjunto de slides e a palestra correspondente discutem a abordagem de processamento de streaming da Flink, incluindo tolerância a falhas, ponto de verificação e manipulação de estado.
O Storm também oferece uma API de alto nível, exatamente uma vez, chamada Trident. No entanto, o Trident é baseado em mini-lotes e, portanto, mais semelhante ao Spark do que ao Flink.
A latência ajustável do Flink se refere à maneira como o Flink envia registros de uma tarefa para outra. Eu disse antes, que o Flink usa transferências de dados em pipeline e encaminha registros assim que são produzidos. Por questões de eficiência, esses registros são coletados em um buffer que é enviado pela rede quando estiver cheio ou quando um determinado limite de tempo for atingido. Esse limite controla a latência dos registros porque especifica a quantidade máxima de tempo que um registro permanecerá em um buffer sem ser enviado para a próxima tarefa. No entanto, não pode ser usado para fornecer garantias concretas sobre o tempo que leva para que um registro entre e saia de um programa, porque isso também depende do tempo de processamento nas tarefas e do número de transferências de rede, entre outras coisas.