Pipelines de streaming

PCollections ilimitadas ou coleções ilimitadas, representam dados em pipelines de streaming. Uma coleção ilimitada contém dados de uma origem de dados atualizada continuamente, como do Pub/Sub.

Não é possível usar apenas uma chave para agrupar elementos em uma coleção ilimitada. Pode haver infinitos elementos para uma determinada chave nos dados de streaming, visto que a origem de dados adiciona novos elementos constantemente. É possível usar janelas, marcas d'água e gatilhos para agregar elementos em coleções ilimitadas.

O conceito de janelas também se aplica a PCollections limitadas que representam dados em pipelines em lote. Para informações sobre janelas em pipelines em lote, consulte a documentação do Apache Beam para Gestão de janelas com PCollections limitadas.

Se um pipeline do Dataflow tiver uma fonte de dados limitada, ou seja, que não contém dados com atualização contínua, e o pipeline for alternado para o modo de streaming usando a sinalização --streaming, quando a origem limitada é totalmente consumida, o pipeline para de ser executado.

Usar o modo de streaming

Para executar um pipeline no modo de streaming, defina a sinalização --streaming na linha de comando ao executá-lo. Também é possível definir o modo de streaming de maneira programática durante a construção do pipeline.

Fontes de lote não são suportadas no modo de streaming.

Quando você atualiza o pipeline com um pool maior de workers, o job de streaming pode não aumentar a escala conforme o esperado. Para jobs de streaming que não usam o Streaming Engine, não é possível escalonar além do número inicial de workers e recursos do Persistent Disk alocados no início do job original. Ao atualizar um job do Dataflow e especificar um número maior de workers no novo job, só será possível definir um número igual ao número máximo de workers que você especificou para seu job original.

Especifique o número máximo de workers usando as seguintes sinalizações:

Java

--maxNumWorkers

Python

--max_num_workers

Go

--max_num_workers

Janelas e funções de gestão de janelas

As funções de gestão de janelas dividem as coleções ilimitadas em componentes lógicos ou janelas. Elas agrupam as coleções ilimitadas pelos carimbos de data/hora dos elementos individuais. Cada janela contém um número finito de elementos.

As janelas a seguir são definidas com o SDK do Apache Beam (em inglês) ou as extensões de streaming do Dataflow SQL:

Janelas em cascata

Uma janela em cascata representa um intervalo consistente e separado no fluxo de dados.

Por exemplo, se você definir uma janela em cascata de 30 segundos, os elementos com valores de carimbo de data/hora [00:00:00-00:00:30:30" estarão na primeira janela. Elementos com valores de carimbo de data/hora [0:00:30-0:01:00] estarão na segunda janela.

A imagem a seguir ilustra como os elementos são divididos em janelas em cascata de 30 segundos.

Uma imagem que mostra janelas em cascata com 30 segundos de duração

Janelas de salto

As janelas de salto representam um intervalo consistente no fluxo de dados. As janelas de salto podem se sobrepor, enquanto as janelas em cascata são separadas.

Por exemplo, uma janela de salto pode iniciar a cada 30 segundos e capturar um minuto de dados. A frequência com que janelas de salto começam é conhecida como período. Este exemplo tem uma janela de um minuto e um período de 30 segundos.

A imagem a seguir ilustra como os elementos são divididos em janelas deslizantes de um minuto com um período de 30 segundos.

Uma imagem que mostra janelas de salto com 1 minuto de duração de janela e 30 segundos de período de janela

Para calcular a média de dados em execução, use as janelas de salto. Use janelas de salto de um minuto com um período de 30 segundos para calcular uma média de execução de um minuto a cada 30 segundos.

Janelas de sessão

Uma janela de sessão contém elementos dentro de uma duração de intervalo de outro elemento. A duração de intervalo é um intervalo entre os novos dados em um fluxo. Se os dados chegarem após a duração de intervalo, eles serão atribuídos a uma nova janela.

Por exemplo, as janelas de sessão podem dividir um fluxo de dados que representa a atividade do mouse do usuário. Esse fluxo pode ter longos períodos de tempo de inatividade intercalados com muitos cliques. Uma janela de sessão pode conter os dados gerados pelos cliques.

A janela de sessão atribui janelas diferentes a cada chave de dados. As janelas em cascata e de salto contêm todos os elementos no intervalo especificado, independentemente das chaves de dados.

Na imagem a seguir, mostramos como os elementos são divididos em janelas de sessão.

Uma imagem que mostra janelas de sessão com uma duração de intervalo mínima

Marcas-d'água

Uma marca d'água é um limite que indica quando o Dataflow espera que todos os dados em uma janela tenham chegado. Se a marca d'água tiver avançado após o fim da janela e novos dados chegarem com um carimbo de data/hora dentro da janela, os dados serão considerados dados atrasados. Para mais informações, consulte Marcas-d'água e dados atrasados na documentação do Apache Beam.

O Dataflow rastreia marcas d'água por conta do seguinte:

  • Não há garantias de que os dados cheguem em ordem de horário ou em intervalos previsíveis.
  • Não é garantido que os eventos de dados apareçam em pipelines na mesma ordem em que foram gerados.

A origem de dados determina a marca d'água. É permitido usar dados atrasados com o SDK do Apache Beam. O Dataflow SQL não processa dados atrasados.

Gatilhos

Os gatilhos determinam quando emitir resultados agregados conforme os dados chegam. Por padrão, os resultados são emitidos quando a marca d'água passa o final da janela.

É possível usar o SDK do Apache Beam para criar ou modificar gatilhos para cada coleção em um pipeline de streaming. Não é possível definir gatilhos com Dataflow SQL.

O SDK do Apache Beam pode definir gatilhos (em inglês) que operam em qualquer combinação das seguintes condições:

  • Hora do evento, conforme indicado pelo carimbo de data/hora em cada elemento de dados.
  • Tempo de processamento, que é o tempo em que o elemento de dados é processado em um determinado estágio no pipeline.
  • O número de elementos de dados em uma coleção.

A seguir

Para mais detalhes sobre o design do SQL de streaming, consulte Um SQL para controlar tudo.