Общий объем необходимой физической и динамической памяти довольно сложно вычислить, так как он сильно зависит от вашего пользовательского кода, топологии вашей работы и используемого вами бэкэнда.
Как правило, если выиспытайте OOM и все еще используете FileSystemStateBackend
или MemoryStateBackend
, тогда вам следует переключиться на RocksDBStateBackend
, потому что он может изящно выплеснуться на диск, если состояние станет слишком большим.
Если вы все еще испытываетеИсключения OOM, как вы уже описали, затем вы должны проверить свой пользовательский код, сохраняет ли он ссылки на объекты состояния или генерирует каким-либо другим образом большие объекты, которые нельзя собрать мусором.Если это так, то вам следует попытаться реорганизовать свой код, чтобы полагаться на абстракцию состояния Флинка, потому что с RocksDB он может выйти из ядра.
Самому RocksDB нужна собственная память, которая увеличивает объем памяти, который занимает Flink.Это зависит от размера кеша блоков, индексов, фильтров Блума и таблиц памяти.Вы можете узнать больше об этих вещах и о том, как их настроить здесь .
И последнее, но не менее важное: вы не должны активировать taskmanager.memory.preallocate
при выполнении потоковых заданий, потому что потоковые задания в настоящее время не выполняются.не использовать управляемую память.Таким образом, активируя предварительное распределение, вы выделяете память для управляемой памяти Flink, что уменьшает доступное пространство кучи.