2016-07-03 4 views
0

Я пытаюсь написать программу mapreduce, которая вычисляет среднее значение некоторых статистических данных.Запуск кода после запуска всех редукторов

Измерители считывают данные в соответствующем сегменте и выполняют некоторые фильтры.

Я использую несколько редукторов.

Поэтому редукторы будут способны вычислять только локальное среднее значение в этой секции. Мне, однако, нужно усреднить все данные, поступающие ко всем редукторам. Как мне снять это?

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

Также обратите внимание, что мне нужно использовать несколько редукторов. Таким образом, возможность иметь только один редуктор и выполнять средние вычисления в методе очистки вне окна.

+2

сделать это в коде драйвера после 'waitForCompletion()' –

ответ

0

Вариант 1 .- Внедрите сумматор и используйте только один редуктор. Объединитель уменьшит количество данных, подлежащих передаче на редуктор (ы). Если причиной использования нескольких редукторов является количество данных, которые вы обрабатываете, это может быть вариант.

Вариант 2 .- Внутри каждого Mapper вычислить частичную сумму/количество в памяти и просто записать на выходе агрегированные значения в методе очистки. Позволяет вам использовать только один редуктор для вычисления окончательного среднего значения.

Вариант 3 .- Внедрите свой процесс, используя два задания сокращения карты. Один для вычисления частичной суммы/счета в каждом редукторе, а затем для других карт-редуцировать с помощью идентичных карт и только с одним редуктором для вычисления среднего значения.

Вариант 4 .- Используйте счетчики и, как @Thomas, предложите логику после waitForCompletion.

Вариант 5 .- Используйте выходные данные редукторов для вычисления среднего значения чтения файлов HDFS (использование счетчиков может быть более простым).

На мой взгляд, Вариант 2 является самым простым и чистым для реализации. И вариант 1 - самый общий вариант, полезный, если вам нужно вычислить более одного среднего в одно и то же время и вычислить сумму/количество в памяти, невозможно (счетчики более ограничительные, всего несколько тысяч).

0

Если вы настаиваете на использовании нескольких редукторов для этого задания, то, я думаю, вы должны выполнять несколько (в вашем случае 2) цепочки заданий. Первая работа будет делать то, что у вас есть прямо сейчас. Второе задание будет настроено для расчета среднего значения. Таким образом, выход первой работы идет как вход для второго задания.

Вы можете увидеть мой ответ here, чтобы узнать, как создать цепочку заданий в одном классе драйвера.

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