Flink TaskManager из памяти и конфигурации памяти - PullRequest
0 голосов
/ 12 июня 2018

Мы используем потоковую передачу Flink для запуска нескольких заданий в одном кластере.Наши рабочие места используют rockDB для удержания государства.Кластер настроен для работы с одним Jobmanager и 3 Taskmanager на 3 отдельных виртуальных машинах.Каждая ТМ настроена на работу с 14 ГБ ОЗУ.JM настроен для работы с 1 ГБ.

У нас возникают 2 проблемы, связанные с памятью: - При запуске Taskmanager с выделением кучи 8 ГБ ТМ исчерпал память кучи, и мы получили исключение кучи из памяти.Нашим решением этой проблемы было увеличение размера кучи до 14 ГБ.Похоже, эта конфигурация решила проблему, так как мы больше не зависали из-за нехватки памяти.- Тем не менее, после увеличения размера кучи до 14 ГБ (на процесс ТМ) ОС не хватает памяти и убивает процесс ТМ.Объем памяти RES увеличивается со временем и достигает ~ 20 ГБ на процесс ТМ.

1.Вопрос в том, как мы можем предсказать максимальный общий объем физической памяти и конфигурацию размера кучи?

2.В связи с нашими проблемами с памятью, разумно ли использовать не управляемые по умолчанию значения управляемой памяти Flink?Каким будет руководство в таком случае?

Дополнительные сведения: Каждый Vm настроен с 4 ЦП и 24 ГБ ОЗУ с использованием версии Flink: 1.3.2

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Использование RocksDBStateBackend может привести к значительному потреблению памяти вне кучи / напрямую, вплоть до доступной памяти на хосте.Обычно это не вызывает проблем, когда процесс диспетчера задач является единственным потребителем большого объема памяти.Однако, если есть другие процессы с динамически изменяющимся распределением памяти, это может привести к нехватке памяти.Я наткнулся на этот пост, так как я ищу способ ограничить использование памяти RocksDBStateBackend.Начиная с версии 1.5 доступны альтернативные наборы опций здесь .Похоже, однако, что они могут быть активированы только программно, а не через flink-conf.yaml.

0 голосов
/ 12 июня 2018

Общий объем необходимой физической и динамической памяти довольно сложно вычислить, так как он сильно зависит от вашего пользовательского кода, топологии вашей работы и используемого вами бэкэнда.

Как правило, если выиспытайте OOM и все еще используете FileSystemStateBackend или MemoryStateBackend, тогда вам следует переключиться на RocksDBStateBackend, потому что он может изящно выплеснуться на диск, если состояние станет слишком большим.

Если вы все еще испытываетеИсключения OOM, как вы уже описали, затем вы должны проверить свой пользовательский код, сохраняет ли он ссылки на объекты состояния или генерирует каким-либо другим образом большие объекты, которые нельзя собрать мусором.Если это так, то вам следует попытаться реорганизовать свой код, чтобы полагаться на абстракцию состояния Флинка, потому что с RocksDB он может выйти из ядра.

Самому RocksDB нужна собственная память, которая увеличивает объем памяти, который занимает Flink.Это зависит от размера кеша блоков, индексов, фильтров Блума и таблиц памяти.Вы можете узнать больше об этих вещах и о том, как их настроить здесь .

И последнее, но не менее важное: вы не должны активировать taskmanager.memory.preallocate при выполнении потоковых заданий, потому что потоковые задания в настоящее время не выполняются.не использовать управляемую память.Таким образом, активируя предварительное распределение, вы выделяете память для управляемой памяти Flink, что уменьшает доступное пространство кучи.

...