2011-12-16 1 views
6

이 바보 같은 질문처럼 보일 수도 IntWritable 아니라, 질문에 명시된 바와 같이 나는 하둡잘못된 키 클래스 : 문제가 있다는 것이다 텍스트

내 맵리 듀스 코드 내 유형의 문제를보고 실패 IntWritable을 기대하지만 감속기의 collector.collect에 Text 객체를 전달하고 있습니다.

내 직업 구성은 다음 매퍼 출력 클래스가 있습니다

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

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

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

:

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

내 매핑 클래스는 다음과 같이 정의되어있다을 필요한 기능 :

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

그리고 그것이 내가 호출 할 때 실패

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

내가 감소 매핑 비교적 새로운 해요하지만 모든 종류의, 그것은 컴파일하지만 말을 그 줄에 실패 일치하는 것은 IntWritable 기대 감축 수업의 열쇠입니다. 그것이 내가 여기

하둡

의 0.21 버전을 사용하고 중요한 경우 내지도 클래스입니다 :

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); 
+0

이 좋아 보인다 확인을해야 (귀하의 경우 IntWriteable, IntWritable) 동일한 키/값 유형을 방출해야합니다. 메일을 게시하고 수업을지도 화하고 줄일 수 있습니까? –

+0

그냥 hadoop을 처음 사용하고 메일 클래스가 무엇인지 모르는데도지도로 질문을 업데이트하고 수업을 줄입니까? 나는이 클래스를 포함하지 않는다고 생각하는 WordCount 예제를 수정하여 이것을 만들었습니다. – user1084563

답변

19

문제는 결합 클래스로 축소 클래스를 설정한다는 것입니다.

conf.setCombinerClass(Reduce.class); 

결합 장치는지도 상에 실행하고 그들은 이 줄을 제거하면

+0

흠, 잠시 후에 시도해보고 작동하는지 확인해 보겠습니다. 그 행은 WordCount 예제에 들어 있기 때문에 사용했던 다른지도 축소 작업이 있으므로 문제가 없습니다. – user1084563

+0

아직 실행이 끝나지 않았지만 문제가 발생했습니다. 답변을 수락했습니다. 단 한가지, 왜 그것이 hadoop 웹 사이트의 WordCount 예제에서 사용됩니까? – user1084563

+1

Mappers 및 Combiners의 o/p는 Reducers에 공급됩니다. 코드에서 결합 자의 o/p는 Text/IntWritable이고 감속기의 입력은 일치하지 않는 IntWritable/IntWritable이므로 오류가 발생합니다. 이 [article] (http://philippeadjiman.com/blog/2010/01/14/hadoop-tutorial-series-issue-4-to-use-or-not-to-use-a-combiner/)을 참조하십시오. 왜 결합 자. 요약하면지도 작업이 로컬에서 사용할 수있는 데이터에 대해 더 많은 작업을 수행함으로써 더 적은 데이터를 축소기로 전송함으로써 작업 주자를 빠르게 만드는 데 사용됩니다. –