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.

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:
- 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 - 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 - 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
- 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.