Hadoop не создает достаточно контейнеров, когда используется больше узлов
Поэтому я пытаюсь запустить несколько заданий hadoop на машинах AWS R3.4xLarge. У них есть 16 vcores и 122 гигабайта оперативной памяти.
Каждому из моих мапперов требуется около 8 гигабайт оперативной памяти и одна нить, поэтому эти машины почти идеально подходят для работы.
У меня mapreduce.memory.mb, установленный на 8192, и mapreduce.map.java.opts, установленный на -Xmx6144. Это должно привести к тому, что на каждом компьютере будет работать приблизительно 14 картографов (на практике ближе к 12).
Фактически это относится к установке с двумя подчиненными устройствами, где планировщик показывает 90-процентное использование кластера.
Однако при масштабировании, скажем, до 4 подчиненных, hadoop просто не создает больше картографов. На самом деле это создает МЕНЬШЕ.
На моих двух ведомых установках у меня одновременно работало менее 30 картографов, на четырех подчиненных - около 20. Машины работали с загрузкой чуть менее 50 процентов.
Вокруг есть физическая память. Какого черта не хватает? Почему hadoop не создает больше контейнеров?
1 ответ
Так что получается, что это одна из тех вещей, которые никогда не имели смысла, независимо от того, как сильно вы пытаетесь понять это.
в yarn-default есть настройка, которая называется yarn.nodemanager.heartbeat.interval-ms. Это установлено в 1000. Очевидно, это контролирует минимальный период между назначением контейнеров в миллисекундах.
Это означает, что он создает только одну новую задачу карты в секунду. Это означает, что количество контейнеров ограничено тем, сколько контейнеров у меня работает * время, которое требуется для завершения контейнера.
Установив это значение равным 50 или, что еще лучше, 1, я смог получить тот тип масштабирования, который ожидается от кластера hadoop. Честно говоря лучше документировать.