Flink

Nível médio

Por que meu job do Flink está descartando silenciosamente eventos que chegam atrasados?

Uma watermark é a própria afirmação do Flink de que não vão chegar mais eventos anteriores a um certo momento - não uma medição. Uma agressiva demais fecha uma janela antes dos dados reais chegarem, sem nenhum erro.

Ler em:
Sem lateness allowedLateness + side output
Aproximadamente quanta visibilidade cada passo acrescenta sobre eventos que chegam depois da watermark - não é um benchmark medido.

Um evento que chega depois que sua janela já disparou não dá erro, não loga e não tenta de novo - simplesmente some, e o resultado da janela fica silenciosamente abaixo da contagem real.

O que uma watermark realmente afirma

Uma watermark é a própria afirmação do Flink - "não vão chegar mais eventos com timestamp anterior a T" - que é o que permite a um operador de janela decidir que uma janela está completa e disparar seu resultado. É uma afirmação que o job faz sobre os dados com base numa estratégia configurada, não uma medição direta, então uma estratégia agressiva demais pode afirmar completude antes que os dados reais, ainda a caminho, realmente apareçam.

Para onde realmente vão os eventos atrasados

Por padrão, um evento que chega depois que sua janela já disparou é simplesmente descartado - sem erro, sem linha de log. O allowedLateness mantém o estado de uma janela aberto por um período extra configurado especificamente para incorporar eventos atrasados como esse de volta, atualizando o resultado em vez de descartá-lo.

# mantém a janela aberta mais 5 minutos para dados atrasados .window(...).allowedLateness(Time.minutes(5))

O side-output que você provavelmente não tem

Mesmo com allowedLateness configurado, um evento que chega depois que essa janela estendida finalmente fecha ainda é descartado. Direcioná-lo para um stream .sideOutputLateData() em vez disso - mesmo que só para contar e alertar sobre o volume - geralmente é a única forma de descobrir de fato o quanto disso está acontecendo, já que nada na saída do pipeline principal vai te contar.

Veja como isso fica no seu próprio pipeline.

Envie um event log real do Spark, um run_results.json do dbt ou uma exportação de métricas do Flink e receba recomendações concretas, para aprovar antes de aplicar - não mais uma regra geral.