#jvm #containers #hadoop-yarn
#jvm #контейнеры #hadoop-yarn
Вопрос:
Я изо всех сил пытаюсь понять, как контейнеры yarn ограничены выделенными ресурсами, особенно процессором.
Я запускаю задания Spark или Flink в кластере YARN. Каждый исполнитель или диспетчер задач запрашивает контейнер yarn с 1 процессором. По сути, количество контейнеров равно количеству процессоров, доступных на хосте.
Я понимаю, что YARN отслеживает использование памяти, и если контейнер превышает лимит, он отправляет сигнал уничтожения. Мне интересно, как на самом деле работает планирование процессора.
Мое задание JVM в контейнере YARN (1CPU) может попытаться создать несколько рабочих потоков, связанных с процессором. Будет ли JVM ограничена 1 ядром процессора для выполнения этих потоков или будет красть ресурсы из других контейнеров? Может ли технически контейнер YARN влиять на производительность процессора других контейнеров?
Допустим, у меня 10 процессоров на хосте, и я создал один контейнер. Будет ли производительность процессора этого контейнера составлять 10% от производительности процессора хоста?
Ответ №1:
По умолчанию yarn выделяет ресурсы только по оперативной памяти. поэтому по умолчанию он надеется, что все будут играть хорошо, и вы можете пострадать от проблем с процессором. Вы можете изменить это:
yarn.scheduler.capacity.resource-calculator Реализация ResourceCalculator, которая будет использоваться для сравнения ресурсов в планировщике. Значение по умолчанию, т.е. org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator использует только память, в то время как DominantResourceCalculator использует Dominant-resource для сравнения многомерных ресурсов, таких как память, процессор и т.д. Ожидается имя класса Java ResourceCalculator.
В общем, этого достаточно, чтобы оценить по памяти. Большинство людей на самом деле очень плохо оценивают свои требования к памяти и потокам. Обычно лучше игнорировать [потоки], если у вас не возникнут проблемы. Если это по-прежнему остается проблемой, то, возможно, стоит рассмотреть возможность использования DominantResourceCalculator. Если / когда вы включите resourceDominantCalculator, будьте готовы к тому, что многие люди почувствуют влияние. Возможно, у вас слишком много выделенных потоков, и когда мы начнем считать потоки, им внезапно придется учитывать то, что они запросили. (Или, по крайней мере, это был мой опыт.) Это может привести к значительному сокращению емкости вашего кластера, поскольку пространство зарезервировано там, где его раньше не было.
TLDF: не трогайте это, если у вас нет веской причины. (Подождите, пока это не станет проблемой, не оптимизируйте, пока не возникнет узкое место). Пользователи могут совершать невинные ошибки при оценке ресурсов, и может быть болезненно развивать их способность правильно оценивать то, что им нужно.
Комментарии:
1. Я уже использую DominantResourceCalculator. У меня нет проблем с распределением ресурсов. Мне интересно, как процессор изолирован между контейнерами. Может ли контейнер использовать разные процессоры контейнеров? Обрабатывает ли YARN автоматически cgroups, такие как Docker? В Focker мой контейнер не может использовать больше, чем выделено.
2. Yarn использует cgroups для принудительного применения политик.
3. Делает ли это автоматически во время запуска контейнера или это что-то, что должно быть включено?
4. Вероятно, вы можете просмотреть это самостоятельно, просмотрев журналы контейнера и изучив журнал. Я знаю, что видел, как он уничтожал контейнеры из-за нехватки памяти, и чтобы выяснить, почему я обычно просматриваю журналы контейнеров. Вот как я знаю, что он использует cgroups, поскольку журнал приложений будет сообщать только о том, что контейнер был уничтожен.