StreamTokenizer
может быть быстрее, как предлагается здесь .
Прежде всего, я бы не стал считать 70 МБ огромным государством. Есть много рабочих мест Flink с несколькими ТБ государства. Что касается вопроса, почему размеры состояний обоих запросов различаются:
Первый запрос - это простой проекционный запрос, что означает, что каждая запись может обрабатываться независимо. Следовательно, запрос не должен «запоминать» какие-либо записи, а только смещения потока для восстановления.
Второй запрос выполняет агрегацию окон и должен запоминать промежуточный результат (частичную сумму) для каждого окна до тех пор, пока время не достигнет достаточного уровня, чтобы результат был окончательным и мог быть передан.
Поскольку запросы Flink SQL транслируются в операторы DataStream, между запросами SQL и реализацией агрегации с помощью keyBy().window()
нет большой разницы. Оба запускают практически одинаковый код.
Обновление : Определена причина повышенного состояния, вызванная RocksDBStateBackend. Эти издержки являются не накладными расходами для каждого ключа, а накладными расходами для оператора с состоянием. Поскольку RocksDBStateBackend предназначен для хранения размеров состояний от нескольких ГБ до ТБ, издержки в несколько МБ незначительны.