복붙노트

[HADOOP] 잘못된 키 클래스 : 텍스트가 IntWritable이 아닙니다.

HADOOP

잘못된 키 클래스 : 텍스트가 IntWritable이 아닙니다.

이것은 어리석은 질문처럼 보일지 모르지만, 내 맵 딜 코드에서 내 유형의 문제를 볼 수 없습니다.

질문에 명시된 바와 같이 문제는 그것이 IntWritable을 기대하지만, 나는 그것을 감속기의 collector.collect에 Text 객체로 전달할 것입니다.

내 작업 구성에는 다음과 같은 매퍼 출력 클래스가 있습니다.

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

그리고 다음과 같은 감속기 출력 클래스 :

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

내 매핑 클래스에는 다음과 같은 정의가 있습니다.

public static class Reduce extends MapReduceBase implements Reducer<IntWritable, IntWritable, Text, IntWritable>

필요한 기능 :

public void reduce(IntWritable key, Iterator<IntWritable> values, OutputCollector<Text,IntWritable> output, Reporter reporter) 

그리고 전화를 걸면 실패합니다.

output.collect(new Text(),new IntWritable());

필자는지도 축소에 상당히 익숙하지만 모든 유형이 일치하는 것처럼 보이지만 컴파일되지만 IntWritable을 감축 클래스의 열쇠로 기대한다고 말하는 라인에서는 실패합니다. 문제가 있다면 0.21 버전의 Hadoop을 사용하고 있습니다.

다음은 내지도 클래스입니다.

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, IntWritable, IntWritable> {
    private IntWritable node = new IntWritable();
    private IntWritable edge = new IntWritable();

    public void map(LongWritable key, Text value, OutputCollector<IntWritable, IntWritable> output, Reporter reporter) throws IOException {
        String line = value.toString();
        StringTokenizer tokenizer = new StringTokenizer(line);

        while (tokenizer.hasMoreTokens()) {
            node.set(Integer.parseInt(tokenizer.nextToken()));
            edge.set(Integer.parseInt(tokenizer.nextToken()));
            if(node.get() < edge.get())
                output.collect(node, edge);
        }
    }
}

내 수업을 줄이자.

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

    IntWritable $ = new IntWritable(Integer.MAX_VALUE);
    Text keyText = new Text();

    public void reduce(IntWritable key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
        ArrayList<IntWritable> valueList = new ArrayList<IntWritable>();

        //outputs original edge pair as key and $ for value
        while (values.hasNext()) {
            IntWritable value = values.next();
            valueList.add(value);
            keyText.set(key.get() + ", " + value.get());
            output.collect(keyText, $);
        }

        //outputs all the 2 length pairs 
        for(int i = 0; i < valueList.size(); i++)
            for(int j = i+1; i < valueList.size(); j++)
                output.collect(new Text(valueList.get(i).get() + ", " + valueList.get(j).get()), key);
    }
}

내 직업 구성 :

JobConf conf = new JobConf(Triangles.class);
conf.setJobName("mapred1");

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

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

conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);

conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);

FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path("mapred1"));

JobClient.runJob(conf);

해결법

  1. ==============================

    1.당신의 문제는 당신이 Reduce 클래스를 결합 자로 설정한다는 것이다.

    당신의 문제는 당신이 Reduce 클래스를 결합 자로 설정한다는 것이다.

    conf.setCombinerClass(Reduce.class);
    

    Combiners는 맵 단계에서 실행되며 동일한 키 / 값 유형을 내야합니다 (IntWriteable, IntWritable). 이 줄을 빼면 괜찮을거야.

  2. from https://stackoverflow.com/questions/8529082/wrong-key-class-text-is-not-intwritable by cc-by-sa and MIT license