Apache Flink: как часто происходит де / сериализация состояния?

Как часто выполняется состояние оператора де / сериализации Flink? За получение / обновление или на основе контрольных точек? Имеет ли значение государственный бэкэнд?

Я подозреваю, что в случае ключевого потока с разнообразным ключом (миллионы) и тысячами событий в секунду для каждого ключа де / сериализация может стать большой проблемой. Я прав?


person Reza Same'ei    schedule 25.07.2018    source источник


Ответы (1)


Ваше предположение верно. Это зависит от состояния серверной части.

Бэкэнды, которые хранят состояние в куче JVM (MemoryStateBackend и FSStateBackend), не сериализуют состояние для обычных операций чтения / записи, а сохраняют его как объекты в куче. Хотя это приводит к очень быстрому доступу, очевидно, что вы привязаны к размеру кучи JVM, а также можете столкнуться с проблемами сборки мусора. При взятии контрольной точки объекты сериализуются и сохраняются, чтобы обеспечить восстановление в случае сбоя.

Напротив, RocksDBStateBackend хранит все состояния в виде байтовых массивов во встроенных экземплярах RocksDB. Следовательно, он де / сериализует состояние ключа для каждого доступа для чтения / записи. Вы можете контролировать, "насколько" состояние сериализуется, выбирая соответствующий примитив состояния, то есть ValueState, ListState, MapState и т. Д.

Например, ValueState всегда де / сериализуется как целое, тогда как MapState.get(key) только сериализует ключ (для поиска) и десериализует возвращаемое значение для ключа. Следовательно, вы должны использовать MapState<String, String> вместо ValueState<HashMap<String, String>>. Аналогичные соображения применимы и к другим примитивам состояния.

RocksDBStateBackend контрольные точки проверяют свое состояние, копируя свои файлы в постоянную файловую систему. Следовательно, при взятии контрольной точки не требуется дополнительной сериализации.

person Fabian Hueske    schedule 25.07.2018
comment
Я думаю, что есть небольшая загвоздка с MemoryStateBackend и использованием де / сериализации для создания копий. youtube.com/watch?v=dWQ24wERItM объясняет это, но я забыл подробности. .. - person Caesar; 22.01.2019
comment
Есть ли способ настроить Flink (с помощью RocksDBStateBackend), чтобы он сохранял в памяти самые последние состояния, к которым осуществлялся доступ, и экономил много времени на сер / десериализацию? Сериализация могла быть выполнена только для контрольных точек или при вытеснении LRU. Ser / deser убил производительность в моем приложении, отняв 90% времени, затраченного на процесс. - person user368507; 05.05.2019
comment
Извините, функция кэширования для серверной части состояния RocksDB в настоящее время не поддерживается. - person Fabian Hueske; 07.05.2019