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

WordCount.java

package hdp;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner;

public class WordCount extends Configured implements Tool{
    public static void main(String[] args) throws Exception {
        System.out.println("application starting ....");
        int exitCode = ToolRunner.run(new WordCount(), args);
        System.out.println(exitCode);
    }

    @Override
    public int run(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Plz enter input and output directory properly... ");
            return -1;
        }
        JobConf conf = new JobConf(WordCount.class);
        FileInputFormat.setInputPaths(conf, new Path(args[0]));
        FileOutputFormat.setOutputPath(conf, new Path(args[1]));

        conf.setMapperClass(WordMapper.class);
        conf.setReducerClass(WordReducer.class);

        conf.setMapOutputKeyClass(Text.class);
        conf.setMapOutputKeyClass(IntWritable.class);

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

        JobClient.runJob(conf);
        return 0;
    }

    @Override
    public Configuration getConf() {
        return null;
    }

    @Override
    public void setConf(Configuration arg0) {

    }   
}

WordMapper.java пакет hdp;

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;

public class WordMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable>{

    @Override
    public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> collect, Reporter reporter) throws IOException {
        String str = value.toString();
        for (String s : str.split(" ")) {
            if (s.length() > 0) {
                collect.collect(new Text(s), new IntWritable(1));
            }
        }
    }
}

WordReducer

package hdp;
import java.io.IOException;
import java.util.Iterator; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase; 
import org.apache.hadoop.mapred.OutputCollector; 
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;

public class WordReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable>  {

    @Override
    public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
        int count = 0;
        while (values.hasNext()) {
            IntWritable intWritable = values.next();
            count += intWritable.get();
        }
        output.collect(key, new IntWritable(count));
    }
}

Когда я запускаю свою программу, я получаю следующее сообщение об ошибке.

16/12/23 00:22:41 INFO mapreduce.Job: Идентификатор задачи: try_1482432671993_0001_m_000001_1, статус: FAILED Ошибка: java.io.IOException: несоответствие типа ключа с карты: ожидается org.apache.hadoop.io.IntWritable, получено org.apache.hadoop.io.Text в org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.collect (MapTask.java:1072) в org.apache.hadoop.mapred.MapTask $ OldOutputCollector.collect (MapTask.java:610 ) на hdp.WordMapper.map (WordMapper.java:19) на hdp.WordMapper.map (WordMapper.java:1) на org.apache.hadoop.mapred.MapRunner.run (MapRunner.java:54) в org.apache .hadoop.mapred.MapTask.runOldMapper (MapTask.java:453) на org.apache.hadoop.mapred.MapTask.run (MapTask.java:343) на org.apache.hadoop.mapred.YarnChild $ 2.run (YarnChild. java: 164) в java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject.java:422) в org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java: 1 698) на org.apache.hadoop.mapred.YarnChild.main (YarnChild.java:158) 16/12/23 00:22:47 INFO mapreduce.Job: идентификатор задачи: try_1482432671993_0001_m_000000_2, статус: FAILED Ошибка: java.io. IOException: несоответствие типа ключа из карты: ожидалось org.apache.hadoop.io.IntWritable, получено org.apache.hadoop.io.Text в org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.collect (MapTask.java:1072 ) в org.apache.hadoop.mapred.MapTask $ OldOutputCollector.collect (MapTask.java:610) в hdp.WordMapper.map (WordMapper.java:19) в hdp.WordMapper.map (WordMapper.java:1) в org .apache.hadoop.mapred.MapRunner.run (MapRunner.java:54) в org.apache.hadoop.mapred.MapTask.runOldMapper (MapTask.java:453) в org.apache.hadoop.mapred.MapTask.run (MapTask .java: 343) в org.apache.hadoop.mapred.YarnChild $ 2.run (YarnChild.java:164) в java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject. java: 422) в орг. apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1698) в org.apache.hadoop.mapred.YarnChild.main (YarnChild.java:158)

Скажите, пожалуйста, в чем я ошибался и какие изменения мне требуются. Либо в WordCount.java , либо в WordReducer , либо в WordMapper.java

0
sawai singh 22 Дек 2016 в 22:10

1 ответ

Лучший ответ

Вы случайно дважды установили выходной ключевой класс:

conf.setMapOutputKeyClass(IntWritable.class);

Должен стать

conf.setMapOutputValueClass(IntWritable.class);
0
rmlan 22 Дек 2016 в 22:17
Спасибо, дорогой. После вашего предложения, наконец, я могу запустить свою первую программу hadoop, большое спасибо.
 – 
sawai singh
22 Дек 2016 в 22:34