Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2023-05-19 GMT+08:00

Janela

Recurso de código aberto aprimorado: janela

Esta seção descreve a janela deslizante do Flink e fornece o método de otimização da janela deslizante. Para obter detalhes sobre janelas, visite o site oficial em https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/stream/operators/windows.html.

Introdução à janela

Os dados em uma janela são salvos como resultados intermediários ou dados originais. Se você executar uma operação de soma (window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds(5))).sum) sobre os dados na janela, apenas o resultado intermediário será retido. Se uma janela personalizada (window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds(5))).apply(new UDF)) for usada, todos os dados originais na janela serão salvos.

Se as janelas personalizadas SlidingEventTimeWindow e SlidingProcessingTimeWindow forem usadas, os dados serão salvos como vários backups. Suponha que a janela é definida da seguinte forma:

window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds(5))).apply(new UDFWindowFunction)

Se um bloco de dados chega, ele é atribuído a quatro janelas diferentes (20/5 = 4). Ou seja, os dados são salvos como quatro cópias na memória. Quando o tamanho da janela ou o período de deslizamento é definido como um valor grande, os dados serão salvos como cópias excessivas, causando redundância.

Figura 1 Estrutura original de uma janela

Se um bloco de dados chega ao 102º segundo, ele é atribuído às janelas [85, 105), [90, 110), [95, 115) e [100, 120).

Otimização de janela

Como mencionado no anterior, há cópias de dados excessivas quando os dados originais são salvos em SlidingEventTimeWindow e SlidingProcessingTimeWindow. Para resolver esse problema, a janela que armazena os dados originais é reestruturada, o que otimiza o armazenamento e reduz muito o espaço de armazenamento. O esquema de otimização de janela é o seguinte:

  1. Use o período deslizante como uma unidade para dividir uma janela em painéis diferentes.

    Uma janela consiste em um ou vários painéis. Um painel é essencialmente um período deslizante. Por exemplo, o período de deslizamento (ou seja, o painel) de window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds.of(5))) dura 5 segundos. Se essa janela variar de [100, 120), ela pode ser dividida em painéis [100, 105), [105, 110), [110, 115) e [115, 120).

    Figura 2 Otimização de janela
  2. Quando um bloco de dados chega, ele não é atribuído a uma janela específica. Em vez disso, o Flink determina o painel ao qual o bloco de dados pertence com base no carimbo de data/hora do bloco de dados e salva o bloco de dados no painel.

    Um bloco de dados é salvo apenas em um painel. Neste caso, apenas uma cópia de dados existe na memória.

    Figura 3 Salvar dados em uma janela
  3. Para acionar uma janela, calcule todos os painéis contidos na janela e combine todos esses painéis em uma janela completa.
    Figura 4 Acionar uma janela
  4. Se um painel não for necessário, você poderá excluí-lo da memória.
    Figura 5 Excluir uma janela

Após a otimização, a quantidade de cópias de dados na memória e no snapshot é bastante reduzida.