Как я могу изменить / предложить другое распределение контейнеров для задач в 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))