Невозможно настроить количество редукторов в задании WordCount в Hadoop

Я использую кластер с одним узлом — Hadoop-2.7.0 в своей машине Linum. Мой код для WordCount Job работает нормально с 1 редуктором. Но не работает нормально, если я увеличу редукторы. Он показывает следующую ошибку:

15/05/25 21:15:10 INFO util.NativeCodeLoader: Loaded the native-hadoop library
15/05/25 21:15:10 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
15/05/25 21:15:10 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
15/05/25 21:15:10 WARN snappy.LoadSnappy: Snappy native library is available
15/05/25 21:15:10 INFO snappy.LoadSnappy: Snappy native library loaded
15/05/25 21:15:10 INFO mapred.FileInputFormat: Total input paths to process : 1
15/05/25 21:15:10 INFO mapred.JobClient: Running job: job_local_0001
15/05/25 21:15:11 INFO util.ProcessTree: setsid exited with exit code 0
15/05/25 21:15:11 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@5f1fd699
15/05/25 21:15:11 INFO mapred.MapTask: numReduceTasks: 1
15/05/25 21:15:11 INFO mapred.MapTask: io.sort.mb = 100
15/05/25 21:15:11 INFO mapred.MapTask: data buffer = 79691776/99614720
15/05/25 21:15:11 INFO mapred.MapTask: record buffer = 262144/327680

15/05/25 21:15:11 WARN mapred.LocalJobRunner: job_local_0001
java.io.IOException: Illegal partition for am (1)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1073)
    at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:592)
    at WordMapper.map(WordMapper.java:24)
    at WordMapper.map(WordMapper.java:1)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)

Мой метод getPartition выглядит так:

public int getPartition(Text key, IntWritable value, int numRedTasks) {
        String s = key.toString();
        if(s.length() == 1)
        {
            return 0;
        }
        else if(s.length() == 2)
        {
            return 1;
        }
        else if(s.length() == 3)
        {
            return 2;
        }
        else
            return 3;
    }

Выполнить метод в файле WordCount.class:

if(input.length < 2)
    {
        System.out.println("Please provide valid input");
        return -1;
    }
    else
    {
        JobConf config = new JobConf();
        FileInputFormat.setInputPaths(config, new Path(input[0]));
        FileOutputFormat.setOutputPath(config, new Path(input[1]));
        config.setMapperClass(WordMapper.class);
        config.setReducerClass(WordReducer.class);
        config.setNumReduceTasks(4);
        config.setPartitionerClass(MyPartitioner.class);
        config.setMapOutputKeyClass(Text.class);
        config.setMapOutputValueClass(IntWritable.class);
        config.setOutputKeyClass(Text.class);
        config.setOutputValueClass(IntWritable.class);
        JobClient.runJob(config);
    }
return 0;

}

Мой код Mapper и Reducer в порядке, потому что задание Wordcount с 1 преобразователем работает нормально. Кто-нибудь в состоянии понять это?


person ojas    schedule 26.05.2015    source источник


Ответы (2)


Это может быть связано с тем, что свинга не работает в операции из-за того, что в ней может быть установлено высокое значение default_parallel.

Спасибо, Шайлеш.

person sbnair    schedule 26.05.2015
comment
Итак, какое решение для этого? - person ojas; 26.05.2015

Вам нужно использовать tooRunner в вашем классе драйверов и вызывать toolrunner в вашем основном классе. Вы можете сделать это, используя объединитель как часть рабочего процесса. Ниже приведен код класса драйвера: Как вы можете видеть из приведенного ниже кода, наряду с вызовами картографа и редуктора есть также вызов комбайнера. И код выхода в основном бегуне: " int exitCode = ToolRunner.run(new Configuration(), new WordCountWithCombiner(), args);" который вызывает средство запуска во время выполнения, и вы можете указать количество редукторов или преобразователей, которые вы хотели бы использовать, используя параметр «-D» при запуске программы подсчета слов. Пример командной строки будет выглядеть так: "-D mapred.reduce.tasks =2 input output"

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
public class WordCountWithCombiner extends Configured
implements Tool{

@Override
public int run(String[] args) throws Exception {
Configuration conf = getConf(); 

Job job = new Job(conf, "MyJob");

job.setJarByClass(WordCount.class);
job.setJobName("Word Count With Combiners");

FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.setMapperClass(WordCountMapper.class);
job.setCombinerClass(WordCountReducer.class);
job.setReducerClass(WordCountReducer.class);

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

    return job.waitForCompletion(true) ? 0 : 1;

   }

  public static void main(String[] args) throws Exception {
    int exitCode = ToolRunner.run(new Configuration(), new WordCountWithCombiner(), args);
    System.exit(exitCode);
}

}
person Sandeep Anjaneya    schedule 26.05.2015
comment
Я думаю, что в моей конфигурации в Hadoop есть какая-то проблема. Потому что мой код отлично работает на машине другого человека. Кроме того, я не могу использовать параметр -D. Можете ли вы подробнее рассказать об этом о том, как изменить количество картографов и редукторов с помощью команд? Если у вас есть какие-либо идеи относительно того, какая проблема с конфигурацией вызывает это исключение. Пожалуйста, поделитесь. - person ojas; 26.05.2015