Чтобы найти размер разделов с помощью карт, необходимо учитывать пару вещей.
Во-первых, мы должны понимать, что, в Hadoop, редактирования разделов выполняются перед комбайнеров, так что если у вас есть объединитель в вашей логике вам нужно будет объяснить это ... если это влияет на вашу попытку найти размер. Это актуально, если вы найдете размер другим способом, чем тот, который я предлагаю здесь.
Во-вторых, разделитель по умолчанию HashPartitioner
присваивает примерно одинаковое количество ключей каждому редуктору. Используемый метод:
public int getPartition(K2 key, V2 value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
Обратите внимание, что учитывает только разметка ключа и игнорирует значение, которое может способствовать неравномерному распределению данных, распространяемых с редукторами.
Что бы я сделал, чтобы узнать размер, установите счетчик рядом с вашим HashPartitioner
или пользовательским разделителем и учтите, что размеры пары ключ-значение собираются каждым. Затем распечатайте это значение для каждого разделителя. Возможно, вам нужно будет отслеживать, где каждый раздел отправляет свои данные, поскольку сами разделители не имеют представления о том, кому они отправляют свои данные.
Об исследованиях по этому вопросу ссылаются от MapReduce Book