java.io.IOException: Type mismatch in key from map:解决方法

执行MR程序的时候发生异常:java.lang.Exception: java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, received org.apache.hadoop.io.LongWritable

日志如下:

[html]  view plain  copy
  1. 2016-05-09 21:33:28,871 INFO [org.apache.hadoop.conf.Configuration.deprecation] - session.id is deprecated. Instead, use dfs.metrics.session-id  
  2.   2016-05-09 21:33:28,873 INFO [org.apache.hadoop.metrics.jvm.JvmMetrics] - Initializing JVM Metrics with processName=JobTrackersessionId=  
  3.   2016-05-09 21:33:29,309 WARN [org.apache.hadoop.mapreduce.JobResourceUploader] - No job jar file set.  User classes may not be found. See Job or Job#setJar(String).  
  4.   2016-05-09 21:33:29,494 INFO [org.apache.hadoop.mapreduce.lib.input.FileInputFormat] - Total input paths to process : 1  
  5.   2016-05-09 21:33:29,584 INFO [org.apache.hadoop.mapreduce.JobSubmitter] - number of splits:1  
  6.   2016-05-09 21:33:29,679 INFO [org.apache.hadoop.mapreduce.JobSubmitter] - Submitting tokens for job: job_local1411634813_0001  
  7.   2016-05-09 21:33:29,890 INFO [org.apache.hadoop.mapreduce.Job] - The url to track the job: http://localhost:8080/  
  8.   2016-05-09 21:33:29,891 INFO [org.apache.hadoop.mapreduce.Job] - Running job: job_local1411634813_0001  
  9.   2016-05-09 21:33:29,892 INFO [org.apache.hadoop.mapred.LocalJobRunner] - OutputCommitter set in config null  
  10.   2016-05-09 21:33:29,901 INFO [org.apache.hadoop.mapred.LocalJobRunner] - OutputCommitter is org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter  
  11.   2016-05-09 21:33:30,000 INFO [org.apache.hadoop.mapred.LocalJobRunner] - Waiting for map tasks  
  12.   2016-05-09 21:33:30,000 INFO [org.apache.hadoop.mapred.LocalJobRunner] - Starting task: attempt_local1411634813_0001_m_000000_0  
  13.   2016-05-09 21:33:30,035 INFO [org.apache.hadoop.yarn.util.ProcfsBasedProcessTree] - ProcfsBasedProcessTree currently is supported only on Linux.  
  14.   2016-05-09 21:33:30,081 INFO [org.apache.hadoop.mapred.Task] -  Using ResourceCalculatorProcessTree : org.apache.hadoop.yarn.util.WindowsBasedProcessTree@546dbb34  
  15.   2016-05-09 21:33:30,088 INFO [org.apache.hadoop.mapred.MapTask] - Processing split: hdfs://192.168.5.97:8020/tmp/htb/mr/join_in/child-parent.txt:0+161  
  16.   2016-05-09 21:33:30,144 INFO [org.apache.hadoop.mapred.MapTask] - (EQUATOR) 0 kvi 26214396(104857584)  
  17.   2016-05-09 21:33:30,144 INFO [org.apache.hadoop.mapred.MapTask] - mapreduce.task.io.sort.mb: 100  
  18.   2016-05-09 21:33:30,144 INFO [org.apache.hadoop.mapred.MapTask] - soft limit at 83886080  
  19.   2016-05-09 21:33:30,144 INFO [org.apache.hadoop.mapred.MapTask] - bufstart = 0bufvoid = 104857600  
  20.   2016-05-09 21:33:30,145 INFO [org.apache.hadoop.mapred.MapTask] - kvstart = 26214396length = 6553600  
  21.   2016-05-09 21:33:30,148 INFO [org.apache.hadoop.mapred.MapTask] - Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer  
  22.   2016-05-09 21:33:30,462 INFO [org.apache.hadoop.mapred.MapTask] - Starting flush of map output  
  23.   2016-05-09 21:33:30,479 INFO [org.apache.hadoop.mapred.LocalJobRunner] - map task executor complete.  
  24.   2016-05-09 21:33:30,503 WARN [org.apache.hadoop.mapred.LocalJobRunner] - job_local1411634813_0001  
  25.  java.lang.Exception: java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, received org.apache.hadoop.io.LongWritable</span>  
  26.     at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)  
  27.     at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)  
  28. Caused by: java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, received org.apache.hadoop.io.LongWritable</span>  
  29.     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1069)  
  30.     at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:712)  
  31.     at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:89)  
  32.     at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.write(WrappedMapper.java:112)  
  33.     at org.apache.hadoop.mapreduce.Mapper.map(Mapper.java:124)  
  34.     at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)  
  35.     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:784)  
  36.     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)  
  37.     at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243)  
  38.     at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)  
  39.     at java.util.concurrent.FutureTask.run(Unknown Source)  
  40.     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)  
  41.     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)  
  42.     at java.lang.Thread.run(Unknown Source)  
  43. 2016-05-09 21:33:30,895 INFO [org.apache.hadoop.mapreduce.Job] - Job job_local1411634813_0001 running in uber mode : false  
  44.   2016-05-09 21:33:30,896 INFO [org.apache.hadoop.mapreduce.Job] -  map 0% reduce 0%  
  45.   2016-05-09 21:33:30,898 INFO [org.apache.hadoop.mapreduce.Job] - Job job_local1411634813_0001 failed with state FAILED due to: NA  
  46.   2016-05-09 21:33:30,903 INFO [org.apache.hadoop.mapreduce.Job] - Counters: 0  

Map函数代码如下

[html]  view plain  copy
  1. public static class Map extends Mapper {  
  2.         // 实现map函数  
  3.         public void map(Object key, Text value, Context context)  
  4.                 throws IOException, InterruptedException {  
  5.             String childname = new String();  
  6.             String parentname = new String();  
  7.             String relationtype = new String();  
  8.             // 输入的一行预处理文本  
  9.             StringTokenizer itr = new StringTokenizer(value.toString());  
  10.             String[] values = new String[2];  
  11.             int i = 0;  
  12.             while (itr.hasMoreTokens()) {  
  13.                 values[i] = itr.nextToken();  
  14.                 i++;  
  15.             }  
  16.             if (values[0].compareTo("child") != 0) {  
  17.                 childname = values[0];  
  18.                 parentname = values[1];  
  19.                 // 输出左表  
  20.                 relationtype = "1";  
  21.                 context.write(new Text(values[1]), new Text(relationtype +  
  22.                         "+" + childname + "+" + parentname));  
  23. //              // 输出右表  
  24.                 relationtype = "2";  
  25.                 context.write(new Text(values[0]), new Text(relationtype +  
  26.                         "+" + childname + "+" + parentname));  
  27.             }  
  28.         }  
  29.     }  

[java]  view plain  copy
  1. public static void main(String[] args) throws Exception {  
  2.         Configuration conf = new Configuration();  
  3.         String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();  
  4.         if (otherArgs.length != 2) {  
  5.             System.err.println("Usage: Single Table Join <in> [<in>...] <out> ");  
  6.             System.exit(2);  
  7.         }  
  8.         Job job = Job.getInstance(conf, "Single Table Join");  
  9.         job.setJarByClass(STjoin.class);  
  10.         // 设置Map和Reduce处理类  
  11.         job.setMapperClass(Map.class);  
  12.          job.setReducerClass(Reduce.class);  
  13.         // 设置输出类型  
  14.         job.setOutputKeyClass(Text.class);  
  15.         job.setOutputValueClass(Text.class);  
  16.         // 设置输入和输出目录  
  17.         FileInputFormat.addInputPath(job, new Path(otherArgs[0]));  
  18.   
  19.         <span style="white-space:pre">    </span>FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));  
  20.         System.exit(job.waitForCompletion(true) ? 0 : 1);  
  21.   
  22.     }  


解决方法:

这个错误信息已经显示,要求的输出的KEY是TEXT类型,但返回LongWritable类型

查看一下设置map的输出类型,然后再看看Map函数输出的参数是否和它保持一致。

这里设置的是输出key和value都是Text类型

[java]  view plain  copy
  1. job.setOutputKeyClass(Text.class);  
  2. job.setOutputValueClass(Text.class);  


但是继承Mapper函数的时候,没有指定输出参数类型,因为默认的输入格式TextInputFormat产生的键类型是LongWritable,说到这里应该知道怎么改了吧。还不知道怎么改的,参考如下

[html]  view plain  copy
  1. public static class Map extends Mapper<Object, Text, Text, Text>   
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值