Flink ValueState будет удален из хранилища по истечении срока его действия при использовании Rocksdb?
Да, но не сразу. (А в некоторых более ранних версиях Flink ответ был «это зависит».)
В вашей конфигурации ttl состояния вы не указали, как вы хотите, чтобы очистка состояния выполнялась. В этом случае просроченные значения явно удаляются при чтении (например, ValueState#value
), а в противном случае они периодически собираются мусором в фоновом режиме. В случае RocksDB эта очистка фона выполняется во время сжатия. Другими словами, очистка происходит не сразу. docs предоставляют более подробную информацию о том, как вы можете это настроить - вы можете настроить очистку так, чтобы она выполнялась быстрее, за счет некоторого снижения производительности.
KeyBy сам по себе не использует любое состояние. Функция селектора ключей используется для разделения потока, но ключи не сохраняются в связи с keyBy. Только операции windows и плоские карты сохраняют состояние, которое является состоянием для каждого ключа, и все это состояние с ключом будет в RocksDB (если вы не настроили свои таймеры в куче, что является опцией, но Flink 1.10 таймеров по умолчанию хранятся вне кучи, в Rockdb).
Вы можете изменить flatmap
на KeyedProcessFunction
и использовать таймеры для явной очистки состояния для ключей состояния, что даст вам прямой доступ контроль за тем, когда именно состояние очищается, вместо того, чтобы полагаться на механизм TTL состояния, чтобы в конечном итоге очистить состояние.
Но более вероятно, что windows создают значительное состояние. Если вы можете переключиться на предварительную агрегацию (через reduce
или aggregate
), это может очень помочь.