Вывод одного файла для разделителя
Попытка получить столько редуктора, сколько нет ключей
public class CustomPartitioner extends Partitioner<Text, Text>
{
public int getPartition(Text key, Text value,int numReduceTasks)
{
System.out.println("In CustomP");
return (key.toString().hashCode()) % numReduceTasks;
}
}
Класс водителя
job6.setMapOutputKeyClass(Text.class);
job6.setMapOutputValueClass(Text.class);
job6.setOutputKeyClass(NullWritable.class);
job6.setOutputValueClass(Text.class);
job6.setMapperClass(LastMapper.class);
job6.setReducerClass(LastReducer.class);
job6.setPartitionerClass(CustomPartitioner.class);
job6.setInputFormatClass(TextInputFormat.class);
job6.setOutputFormatClass(TextOutputFormat.class);
Но я получаю ootput в одном файле.
Я делаю что-то не так
4 ответа
Вы не можете контролировать номер редуктора, не указав его:-). Но, тем не менее, нет уверенности в том, что вы получите все ключи на разных редукторах, потому что вы не уверены, сколько разных ключей вы получите во входных данных, и ваша функция разбиения хеша может вернуть одно и то же число для двух разных ключей. Если вы хотите достичь своего решения, вам нужно заранее знать количество различных ключей, а затем соответствующим образом изменить функцию раздела.
Вам нужно указать количество задач сокращения, равное количеству ключей, а также вам необходимо вернуть разделы на основе ваших ключей в классе разделителей. например, если ваш ввод имеет 4 клавиши (здесь это дерево, масонство, железобетон и т. д.), тогда ваш метод getPartition выглядит следующим образом..
public int getPartition(Text key, PairWritable value, int numReduceTasks) {
// TODO Auto-generated method stub
String s = value.getone();
if (numReduceTasks ==0){
return 0;
}
if(s.equalsIgnoreCase("wood")){
return 0;
}
if(s.equalsIgnoreCase("Masonry")){
return 1%numReduceTasks;
}
if(s.equalsIgnoreCase("Reinforced Concrete")){
return 2%numReduceTasks;
}
if(s.equalsIgnoreCase("Reinforced Masonry")){
return 3%numReduceTasks;
}
else
return 4%numReduceTasks;
}
}
соответствующий вывод будет собран в соответствующих редукторах.Попробуйте запустить в CLI вместо eclipse
Вы не настроили количество работающих редукторов.
Вы можете настроить его, используя ниже API
job.setNumReduceTasks (10); // изменить номер в соответствии с вашим кластером
Кроме того, вы можете установить при выполнении из командной строки
-D mapred.reduce.tasks=10
Надеюсь это поможет.
Вени, вам нужно, чтобы цепочки задач, как показано ниже
Mapper1 --> Reducer --> Mapper2 (Post Processing Mapper which creates
file for Each key)
Mapper 2 - это InputFormat должен быть NlineInputFormat, поэтому выход редуктора для каждого ключа будет соответствовать mapper, а выход Mapper будет отдельным файлом для каждого ключа.
Mapper 1 и Reducer - это ваша существующая работа по МР.
Надеюсь это поможет.
ура
пилить