2013-10-10 3 views
3

На фазе карты моей программы мне нужно знать общее количество создаваемых mappers. Это поможет мне в процессе создания ключа на карте (я хочу испустить столько пар ключ-значение для каждого объекта, сколько числа mappers).hadoop получает фактическое количество счетчиков

Я знаю, что установка числа картографов - это всего лишь подсказка, но каков путь к , получите фактическое количество картографов. Я попытался следующие в методе конфигурирования моего Mapper:

public void configure(JobConf conf) { 
    System.out.println("map tasks: "+conf.get("mapred.map.tasks")); 
    System.out.println("tipid: "+conf.get("mapred.tip.id")); 
    System.out.println("taskpartition: "+conf.get("mapred.task.partition")); 
} 

Но я получаю результаты: (?)

map tasks: 1 
tipid: task_local1204340194_0001_m_000000 
taskpartition: 0 
map tasks: 1 
tipid: task_local1204340194_0001_m_000001 
taskpartition: 1 

, что означает, что есть две карты задачи, а не только один, как это было напечатано (что вполне естественно, так как у меня есть два небольших входных файла). Не должно ли число после задач карты быть 2?

На данный момент я просто подсчитываю количество файлов во входной папке, но это нехорошее решение, так как файл может быть больше размера блока и приводить к более чем одному входному дроблению и, следовательно, картографам. Какие-либо предложения?

+1

http://wiki.apache.org/hadoop/HowManyMapsAndReduces Это зависит от вашего блока и количества файлов. Таким образом, вы могли бы рассчитать его вне mapreduce, если хотите, а затем добавить этот номер в распределенный кеш вашей работы. – DDW

+0

Возможный дубликат [Hadoop MapReduce: количество карточек по умолчанию] (http://stackoverflow.com/questions/10591278/hadoop-mapreduce-default-number-of-mappers) – harpun

+0

Спасибо @irW за комментарий! У меня уже есть что-то подобное, но мне было интересно, есть ли что-то вроде стандартного getter, вместо повторной реализации метода, который уже существует и уже вызван. Я продолжу это решение, если нет ничего лучше. – vefthym

ответ

2

И, наконец, кажется, что conf.get("mapred.map.tasks")) ДЕЛАЮТСЯ РАБОТАЕТСЯ, когда я создаю исполняемый файл jar и запускаю свою программу в кластере/локально. Теперь вывод «задач карты» верен.

Он не работал только при запуске программы mapreduce локально на hadoop из плагина eclipse. Возможно, это проблема с плагином затмения.

Надеюсь, это поможет кому-то другому, имеющему ту же проблему. Спасибо за ответ!

1

Я не думаю, что есть простой способ сделать это. Я реализовал свой собственный класс InputFormat, если вы это сделаете, вы можете реализовать метод подсчета количества InputSplits, который вы можете запросить, в процессе, который запускает задание. Если вы поместите это число в какой-либо параметр конфигурации, вы можете прочитать его в своем процессе сопоставления.

Кстати, количество входных файлов не всегда является числом картографов, так как большие файлы могут быть разделены.

+0

Спасибо! Кажется, это мой единственный вариант. Я попробую это и дам вам знать, если это сработает. Я знаю, что большие файлы можно разделить, но это был самый простой способ запустить мой код, прежде чем я найду постоянное решение. – vefthym

Смежные вопросы