Размер выходных разделов карты?
Предположим, что у нас есть 3 картографа (m1, m2 и m3) и 2 редуктора (r1 и r2).
Каждый редуктор извлекает свои входные разделы из сгенерированных файлов каждым маппером.
Из истории заданий я могу извлечь общий ввод для каждой задачи сокращения, но я хотел бы знать вклад каждого преобразователя в этот ввод редуктора?
Например, редуктор r1 получит INPUT_r1, например:
INPUT_r1 = (раздел извлечен из m1) + (раздел извлечен из m2) + (раздел извлечен из m3)
Я хотел бы знать размер этих разделов от картостроителей?
1 ответ
Чтобы определить размер разделов из картографов, необходимо учесть несколько вещей.
Во-первых, мы должны понимать, что в Hadoop разделители выполняются перед объединителями, поэтому, если у вас есть объединитель в вашей логике, вам придется учитывать его... если это влияет на вашу попытку найти размер. Это уместно, если вы найдете размер иначе, чем тот, который я предлагаю здесь.
Во-вторых, разделитель по умолчанию HashPartitioner
назначает примерно одинаковое количество клавиш каждому редуктору. Используемый метод:
public int getPartition(K2 key, V2 value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
Обратите внимание, что разделитель рассматривает только ключ и игнорирует значение, которое может способствовать неравномерному распределению данных, передаваемых редукторам.
Что бы я сделал, чтобы выяснить размер установлен счетчик рядом с вашим HashPartitioner
или пользовательский разделитель и учет размеров пары ключ-значение, собираемых каждым. Затем распечатайте это значение для каждого разделителя. Возможно, вам придется отслеживать, куда каждый раздел отправляет свои данные, поскольку сами разделители не имеют представления, кому они отправляют свои данные.
Много исследований по этому вопросу ссылаются на MapReduce Book