이 바보 같은 질문처럼 보일 수도 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);
이 좋아 보인다 확인을해야 (귀하의 경우 IntWriteable, IntWritable) 동일한 키/값 유형을 방출해야합니다. 메일을 게시하고 수업을지도 화하고 줄일 수 있습니까? –
그냥 hadoop을 처음 사용하고 메일 클래스가 무엇인지 모르는데도지도로 질문을 업데이트하고 수업을 줄입니까? 나는이 클래스를 포함하지 않는다고 생각하는 WordCount 예제를 수정하여 이것을 만들었습니다. – user1084563