Вывод одного файла для разделителя

Попытка получить столько редуктора, сколько нет ключей

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 - это ваша существующая работа по МР.

Надеюсь это поможет.

ура
пилить

Другие вопросы по тегам