2015-12-23 1 views
0

У меня есть программа hadoop, в которой я хотел бы сообщить значение обратно драйверу в конце картографа. Итак, в драйвере я несколько значений, каждый из ячеек ans, а затем хочу получить максимум между значением. Я кодирование его с помощью счетчика и вот код у меня есть:Как сообщить значение от Mapper к программе Driver в Hadoop?

protected void cleanup(Context context){   
    .... 
    context.getCounter("TimeStamps", "Max").setValue(value); 
} 

и в драйвере я имею

CounterGroup counters = job.getCounters().getGroup("TimeStamps"); 
    Iterator<Counter> iter = counters.iterator(); 

    while(iter.hasNext()){ 
     Counter c = iter.next();    
    } 

Однако только значение передается обратно (вместо нескольких значений). Что я должен делать, чтобы каждый картограф сообщал о отдельном значении, и я могу получить их все в драйвере?

+0

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

+0

Я дал ответ на этот вопрос. Проверьте, подходит ли оно вашим требованиям. –

+0

@DurgaViswanathGadiraju: Не могли бы вы объяснить это по некоторому коду? –

ответ

1

Существует способ достижения этого (хотя, я считаю, что это не чистый путь).

Когда вы излучаете счетчик в картографе, вы можете получить идентификатор попытки задачи и префикс имени счетчика с этим.

См., Например, в map() методы программы WordCount, за каждое слово встречается, я излучаемый:

context.getCounter("ME", context.getTaskAttemptID() + ":MY_TOTAL").increment(1); 

Выше ME противопоказана группа. Имя счетчика - это комбинация Task Attempt ID и MY_TOTAL.

См., Например, идентификаторы попыток задания карты обычно имеют форму: task_1450681906391_0024_m_000000_0 (m_000000_0 предназначен для первого картографа в задании).

Итак, ваше имя счетчика для этого картографа будет: task_1450681906391_0024_m_000000_0:MY_TOTAL.

Точно так же счетчик название различных картографов будет:

Mapper 2 => task_1450681906391_0024_m_000001_0:MY_TOTAL 
Mapper 3 => task_1450681906391_0024_m_000002_0:MY_TOTAL 
Mapper 4 => task_1450681906391_0024_m_000003_0:MY_TOTAL 

Теперь, в драйвере, я добавил следующий код, после установки Job::waitForCompletion(true):

job.waitForCompletion(true); 

CounterGroup counters = job.getCounters().getGroup("ME"); 
Iterator<Counter> iter = counters.iterator(); 

while(iter.hasNext()) { 
    Counter c = iter.next(); 
    System.out.println(c.getName() + " " + c.getValue()); 
} 

Я запустил программу подсчета слов для 1 ГБ данных, которые породили 7 карт. После успешного выполнения программы, я получил следующий вывод:

attempt_1450681906391_0024_m_000000_0:MY_TOTAL 9318964 
attempt_1450681906391_0024_m_000001_0:MY_TOTAL 9068018 
attempt_1450681906391_0024_m_000002_0:MY_TOTAL 9241336 
attempt_1450681906391_0024_m_000003_0:MY_TOTAL 9182102 
attempt_1450681906391_0024_m_000004_0:MY_TOTAL 8948100 
attempt_1450681906391_0024_m_000005_0:MY_TOTAL 8992634 
attempt_1450681906391_0024_m_000006_0:MY_TOTAL 8564646 

Вы можете увидеть, что счетчики для разных картографов выбрасываются отдельно. Вы можете легко разобрать картостроитель и получить счетчик для каждого преобразователя, как показано ниже:

Mapper 1 => MY_TOTAL 9318964 
Mapper 2 => MY_TOTAL 9068018 
Mapper 3 => MY_TOTAL 9241336 
Mapper 4 => MY_TOTAL 9182102 
Mapper 5 => MY_TOTAL 8948100 
Mapper 6 => MY_TOTAL 8992634 
Mapper 7 => MY_TOTAL 8564646