[HADOOP] 지도에서 키에 유형이 일치하지 않습니다. 예상 됨.받은 텍스트 ... LongWritable
HADOOP지도에서 키에 유형이 일치하지 않습니다. 예상 됨.받은 텍스트 ... LongWritable
하나의 CSV 파일을 가져온 간단한 애플리케이션이 있는데, 그 다음 항목을 ","로 나눈 다음 첫 번째 항목을 계산합니다.
다음은 나의 코드이다.
package com.bluedolphin; import java.io.IOException; import java.util.Iterator; 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.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; public class MyJob extends Configured implements Tool { private final static LongWritable one = new LongWritable(1); public static class MapClass extends Mapper<Object, Text, Text, LongWritable> { private Text word = new Text(); public void map(Object key, Text value, OutputCollector<Text, LongWritable> output, Reporter reporter) throws IOException, InterruptedException { String[] citation = value.toString().split(","); word.set(citation[0]); output.collect(word, one); } } public static class Reduce extends Reducer<Text, LongWritable, Text, LongWritable> { public void reduce( Text key, Iterator<LongWritable> values, OutputCollector<Text, LongWritable> output, Reporter reporter) throws IOException, InterruptedException { int sum = 0; while (values.hasNext()) { sum += values.next().get(); } output.collect(key, new LongWritable(sum)); } } public static class Combiner extends Reducer<Text, IntWritable, Text, LongWritable> { public void reduce( Text key, Iterator<LongWritable> values, OutputCollector<Text, LongWritable> output, Reporter reporter) throws IOException, InterruptedException { int sum = 0; while (values.hasNext()) { sum += values.next().get(); } output.collect(key, new LongWritable(sum)); } } public int run(String[] args) throws Exception { Configuration conf = getConf(); Job job = new Job(conf, "MyJob"); job.setJarByClass(MyJob.class); Path in = new Path(args[0]); Path out = new Path(args[1]); FileInputFormat.setInputPaths(job, in); FileOutputFormat.setOutputPath(job, out); job.setMapperClass(MapClass.class); // job.setCombinerClass(Combiner.class); job.setReducerClass(Reduce.class); // job.setInputFormatClass(KeyValueInputFormat.class); job.setInputFormatClass(TextInputFormat.class); // job.setOutputFormatClass(KeyValueOutputFormat.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); System.exit(job.waitForCompletion(true) ? 0 : 1); return 0; } public static void main(String args[]) throws Exception { int res = ToolRunner.run(new Configuration(), new MyJob(), args); System.exit(res); } }
이것은 오류입니다.
11/12/16 22:16:58 INFO mapred.JobClient: Task Id : attempt_201112161948_0005_m_000000_0, Status : FAILED java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org.apache.hadoop.io.LongWritable at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1013) at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:690) at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80) at org.apache.hadoop.mapreduce.Mapper.map(Mapper.java:124) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:369) at org.apache.hadoop.mapred.Child$4.run(Child.java:259) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:416) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059) at org.apache.hadoop.mapred.Child.main(Child.java:253)
해결법
-
==============================
1.코드에서 수정해야 할 몇 가지
코드에서 수정해야 할 몇 가지
org.apache.hadoop.mapred.OutputCollector 가져 오기 import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; mappers / reducers의 입력 / 출력이 o.a.h.io.Writable 유형인지 확인하십시오. Mapper의 입력 키가 Object이면 LongWritable이됩니다. Combiner와 Reducer 기능이 같아 반복 할 필요가 없습니다. job.setCombinerClass (Reducer.class); 또한 WordCount 예제를 사용할 수 있으며 요구 사항과 WordCount 예제간에 큰 차이는 없습니다.
-
==============================
2.일반적으로 Mapper
와 Reducer 이있는 경우 (Job에서) 다음과 같이 선언하는 것이 좋습니다 일반적으로 Mapper
와 Reducer 이있는 경우 (Job에서) 다음과 같이 선언하는 것이 좋습니다 JobConf conf = new JobConf(MyJob.class); ... conf.setMapOutputKeyClass(K2.class); conf.setMapOutputValueClass(V2.class);
다른 예를 여기서 볼 수 있습니다.
-
==============================
3.이전 API (o.a.h.mapred)와 새 API (o.a.h.mapreduce)는 호환되지 않으므로 혼합해서는 안됩니다.
이전 API (o.a.h.mapred)와 새 API (o.a.h.mapreduce)는 호환되지 않으므로 혼합해서는 안됩니다.
import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer;
OutputCollector 및 Reporter를 Map에서 대체하고 함수 서명을 Context로 대체해야합니다. context.write (k, v)를 사용하여 map (K1 키, V1 val, 컨텍스트 컨텍스트) 및 output.collect (k, v)
새로운 API로 마이그레이션하는 방법에 대한 자세한 내용은이 링크를 참조하십시오. http://www.slideshare.net/sh1mmer/upgrading-to-the-new-map-reduce-api#
from https://stackoverflow.com/questions/8542324/type-mismatch-in-key-from-map-expected-text-received-longwritable by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hive에서 OpenCSVSerde를 사용할 때 모든 열이 문자열로 생성되는 이유는 무엇입니까? (0) | 2019.07.26 |
---|---|
[HADOOP] YARN UNHYALTHY 노드 (0) | 2019.07.26 |
[HADOOP] 왜 파일이 hadoop에 존재하는지 검사하면 NullPointerException이 발생합니까? (0) | 2019.07.26 |
[HADOOP] hadoop에서 작은 파일 병합 (0) | 2019.07.26 |
[HADOOP] hadoop이 여러 디렉토리와 파일에서 입력 받아 들일 수 있습니까? (0) | 2019.07.26 |