Размер состояния окна зависит от типа функции, которую вы применяете.Если вы применяете ReduceFunction
или AggregateFunction
, поступающие данные немедленно агрегируются, и окно содержит только агрегированное значение.Если вы применяете ProcessWindowFunction
или WindowFunction
, Flink собирает все входные записи и применяет функцию, когда время (время события или обработки в зависимости от типа окна) превышает время окончания окна.
Вы также можете комбинировать оба типа функций, т. Е. Иметь AggregateFunction
, а затем ProcessWindowFunction
.В этом случае поступающие записи немедленно агрегируются, а когда окно закрывается, результат агрегации передается в виде ProcessWindowFunction
как одно значение.Это полезно, потому что у вас есть инкрементная агрегация (из-за ReduceFunction
/ AggregateFunction
), но также есть доступ к метаданным окна, таким как метка времени начала и конца (из-за ProcessWindowFunction
).
Как управляется состояниезависит от выбранного состояния бэкэнда.Если вы сконфигурируете FsStateBackend
, все локальное состояние будет сохранено в куче TaskManager, а процесс JVM будет остановлен с помощью OutOfMemoryError
, если состояние станет слишком большим.Если вы сконфигурируете состояние RocksDBStateBackend
, оно будет отправлено на диск.Это связано с расходами на де / сериализацию для каждого доступа к состоянию, но дает гораздо больше памяти для состояния.