[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.당신의 문제는 당신이 Reduce 클래스를 결합 자로 설정한다는 것이다.
당신의 문제는 당신이 Reduce 클래스를 결합 자로 설정한다는 것이다.
conf.setCombinerClass(Reduce.class);
Combiners는 맵 단계에서 실행되며 동일한 키 / 값 유형을 내야합니다 (IntWriteable, IntWritable). 이 줄을 빼면 괜찮을거야.
from https://stackoverflow.com/questions/8529082/wrong-key-class-text-is-not-intwritable by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop에서 String 객체를 IntWritable 객체로 변환하는 방법 (0) | 2019.07.10 |
---|---|
[HADOOP] Hadoop에서 다양한 언어를 사용하여 직업을 운영하는 것에 대한 장단점은 무엇입니까? (0) | 2019.07.10 |
[HADOOP] 출력을 hdfs에 저장하지 않고 mapper-reducer의 출력을 다른 mapper-reducer로 직접 보내는 방법 (0) | 2019.07.10 |
[HADOOP] Sqoop을 사용하여 MySQL에서 하이브로 데이터 가져 오기 (0) | 2019.07.10 |
[HADOOP] elasticsearch를 중앙 데이터 저장소로 사용 (0) | 2019.07.10 |