Как предложить более сбалансированное распределение контейнеров в кластере Hadoop? - PullRequest
0 голосов
/ 06 января 2019

Как я могу изменить / предложить другое распределение контейнеров для задач в Hadoop? Относительно собственного кластера Hadoop (2.9.1) в AWS.

Я использую собственный кластер Hadoop (2.9.1) в AWS (с EC2, а не EMR), и я хочу, чтобы планирование / распределение контейнеров (Mappers / Reducers) было бы более сбалансированным, чем в настоящее время. Похоже, что RM распределяет Mappers способом Bin Packing (где хранятся данные), а для редукторов это выглядит более сбалансированным. Моя установка включает в себя три машины с тремя показателями репликации (все данные находятся на каждой машине), и я запускаю свои задания с mapreduce.job.reduce.slowstart.completedmaps = 0, чтобы начать перемешивание как можно быстрее (это важно для меня что все контейнеры одновременно, это обязательное условие). Кроме того, в соответствии с выбранными мной экземплярами EC2 и моими настройками кластера YARN я могу запустить не более 93 контейнеров (по 31 в каждом).

Например, если я хочу иметь 9 редукторов, тогда (93-9-1 = 83) 83 контейнера можно оставить для картографов, а один - для AM. Я играл с размером разделенного ввода (mapreduce.input.fileinputformat.split.minsize, mapreduce.input.fileinputformat.split.maxsize), чтобы найти правильный баланс, где все машины имеют одинаковую «работу» для фаза карты. Но похоже, что первые 31 преобразователи будут распределены в одной машине, следующие 31 - во второй и последние 31 в последней машине. Таким образом, я могу попытаться использовать 87 картографов, где 31 из них в машине № 1, еще 31 в машине № 2 и еще 25 в машине № 3, а остальное оставлено для редукторов, а машина № 1 и машина № 2 полностью заполнены. Занятые, тогда редукторы должны быть помещены в машину № 3. Таким образом, я получаю почти сбалансированное распределение картографов за счет распределения несбалансированных редукторов. И это не то, что я хочу ...

# of mappers = size_input / split size [Bytes],

split size= max(mapreduce.input.fileinputformat.split.minsize, min(mapreduce.input.fileinputformat.split.maxsize, dfs.blocksize))

1 Ответ

0 голосов
/ 10 января 2019

Я использовал планировщик по умолчанию (Capacity), и по умолчанию yarn.scheduler.capacity.per-node-heartbeat.maximum-container-assignments был установлен в -1 (бесконечность), что объясняло, почему каждый узел, который первым отвечает на RM (с Heartbeat), "упаковывал" контейнеры столько, сколько оно может. В заключение, вставка в hadoop / etc / hadoop /acity-scheduler.xml вышеуказанного параметра (использование трети числа отображений приведет к сбалансированному планированию отображений) и после yarn rmadmin -refreshQueues после перезапуска RM предоставит вам возможность сбалансировать распределение контейнеров в YARN.

Для более подробной информации, пожалуйста, поищите в моем обсуждении здесь .

...