2017-02-14 2 views
-1

Я должен взять вывод моего Mapper и передать его 4 раза моему редуктору.MapReduce Multiple Reduce Task

Редуктор - это слияние данных. Поэтому после Mapper, Reducer объединяет некоторые данные на первой итерации, меняет ключи и remerge и вторую итерацию и так далее ...

Я пытаюсь использовать job.setNumReduceTasks(4), но ничего не происходит. У меня есть только 1 выход и простой System.out.println(), расположенный на моем дисплее Редуктора только 1 сообщение.

Job job = new Job(getConf()); 


job.setJarByClass(Driver.class); 
job.setJobName(this.getClass().getName()); 

FileInputFormat.setInputPaths(job, new Path(input)); 
FileOutputFormat.setOutputPath(job, new Path(output+System.nanoTime())); 

job.setMapperClass(KMMapper.class); 

job.setReducerClass(KMReducer.class); 
job.setNumReduceTasks(4); 

job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(Text.class); 

job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(Text.class); 

job.waitForCompletion(true); 

---------- ---------- EDIT

Кроме того, пожалуйста, обновите ваш вопрос возможно я/р ADN о/р

Я должен реализовать новый способ кластеризации данных.

Mapper - это алгоритм кластеризации, а выход - ключ/список точек в кластере.

Каждый редуктор сравнивает кластер с тем же ключом, и если они «похожи», редуктор сливает его. Редуктор выбирает новые клавиши, а выход - новый ключ/список точек. При случайном выборе новых ключей и большой итерации все исходные кластеры будут сравниваться.

+1

job.setNumReduceTasks определяет, сколько редукторов у вас будет, а не сколько времени вы применяете, уменьшая – seneque

+0

и как я могу применить один и тот же редуктор 4 или 5 раз? –

+0

Непонятно, что вам нужно в точности, но попробовали ли вы один и тот же алгоритм 4 раза (например, используя цикл for)? Вы не можете запускать фазу уменьшения более одного раза, потому что редуктор всегда работает после сопоставления (в MapReduce нет работы по сокращению, даже если может быть задание только для карты). – vefthym

ответ

1

Я должен принять вывод моего картографа и передать его 4 раза моему Редуктор.

Из приведенного выше утверждения я мог понять, что ваши данные должны фильтроваться/обрабатываться 4 раза подряд. Для выполнения os MapReduce предоставляет ChainMapper или ChainReducer.

Использование job.setNumReduceTasks(4); поможет только запустить задачу с четырьмя редукторами параллельно, совместное использование выходных данных (называемых промежуточными данными) на основе механизма ключевого раздела по умолчанию.

Из другой части вашего вопроса могут быть внесены пользовательские разделы. Таким образом, они упорядочивают пару ключ-значение в виде списка ключей. Затем, основываясь на требуемом фильтровальном механизме, слияние приводит к редуктору.

+0

Я могу прочитать, что «класс ChainReducer позволяет связать несколько классов Mapper после Reducer в задаче Reducer.«но я хочу обратное, несколько редукторов для 1 Mapper. –

+0

. Несколько редукторов в MapReduce - это просто запуск параллельных заданий из промежуточных данных. Его ясный и громкий, что нет такого механизма редуктора после редуктора (последовательный). – srikanth

+0

An if I действительно ли это есть трюк? –

0

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

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

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