java.io.IOException:错误的密钥类:X不是类<;减速机输出等级>;

java.io.IOException:错误的密钥类:X不是类<;减速机输出等级>;,java,hadoop,Java,Hadoop,我有一份针对映射器和还原器的不同输出类型的工作。 在映射过程中,我得到一个错误,这意味着收集器期望的输出是reducer输出类型,而不是mapper输出类型 我在mapper启动期间记录这些类型,并获得预期的结果 作业设置 // reducer conf.setOutputKeyClass(MapRepresentation.class); conf.setOutputValueClass(DoubleRepresentation.class); //

我有一份针对映射器和还原器的不同输出类型的工作。
在映射过程中,我得到一个错误,这意味着收集器期望的输出是reducer输出类型,而不是mapper输出类型

我在mapper启动期间记录这些类型,并获得预期的结果

作业设置

        // reducer
    conf.setOutputKeyClass(MapRepresentation.class);
    conf.setOutputValueClass(DoubleRepresentation.class);

    // mapper
    conf.setMapOutputKeyClass(Text.class);
    conf.setMapOutputValueClass(PairWritable.class);
日志输出

2013-09-22 09:41:16,388 INFO SplitByModelNodeMR: *** getMapOutputKeyClass(): class org.apache.hadoop.io.Text

2013-09-22 09:41:16,389 INFO SplitByModelNodeMR: *** getMapOutputValueClass(): class SplitByModelNodeMR$PairWritable

2013-09-22 09:41:16,389 INFO SplitByModelNodeMR: *** getOutputKeyClass(): class MapRepresentation

2013-09-22 09:41:16,389 INFO SplitByModelNodeMR: *** getOutputValueClass(): class DoubleRepresentation
错误

java.io.IOException: wrong key class: 6fcd88ae126f2f76-6 is not class MapRepresentation
at org.apache.hadoop.io.SequenceFile$BlockCompressWriter.append(SequenceFile.java:1466)
at org.apache.hadoop.mapred.SequenceFileOutputFormat$1.write(SequenceFileOutputFormat.java:71)
at org.apache.hadoop.mapred.MapTask$DirectMapOutputCollector.collect(MapTask.java:716)
at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:526)
at SplitByModelNodeMR$mapper.map(SplitByModelNodeMR.java:299)
at SplitByModelNodeMR$mapper.map(SplitByModelNodeMR.java:245)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:417)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:332)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
at org.apache.hadoop.mapred.Child.main(Child.java:262)
编辑

这是完整的代码(精简)

公共类DummyMR实现工具
{
私有静态最终记录器log=LoggerFactory.getLogger(dummymmr.class);
公共静态void main(字符串[]args)
{
尝试
{
运行(新的dummymmr(),args);
}
捕获(例外e)
{
log.error(“在main中捕获异常:”,e);
}
}
公共静态void运行作业(配置、路径输入、,
路径输出)引发IOException
{
JobConf conf=新的JobConf(配置);
//减速器
conf.setOutputKeyClass(LongWritable.class);
conf.setOutputValueClass(LongWritable.class);
//制图员
conf.setMapOutputKeyClass(Text.class);
conf.setMapOutputValueClass(LongWritable.class);
conf.setMapperClass(mapper.class);
conf.setJobName(“dummymmr:+input.toString());
conf.setInputFormat(KeyValueTextInputFormat.class);
conf.setOutputFormat(SequenceFileOutputFormat.class);
addInputPath(conf,input);
setOutputPath(conf,output);
RunningJob job=JobClient.runJob(conf);
返回;
}
公共静态类映射器扩展了MapReduceBase实现
制图员
{
@凌驾
公共无效配置(JobConf作业)
{
超级配置(作业);
log.info(“***getMapOutputKeyClass():”
+job.getMapOutputKeyClass().toString());
log.info(“***getMapOutputValueClass():”
+job.getMapOutputValueClass().toString());
log.info(“***getOutputKeyClass():”
+job.getOutputKeyClass().toString());
log.info(“***getOutputValueClass():”
+job.getOutputValueClass().toString());
}
@凌驾
public void close()引发IOException
{
super.close();
}
@凌驾
公共无效映射(文本k、文本v、OutputCollector、OutputCollector、,
记者报道)这是一个例外
{
尝试
{
LongWritable val=新的LongWritable(5);
文本键=新文本(“键”);
outputCollector.collect(键,val);
}
捕获(例外e)
{
log.warn(“map()”,e);
}
}
}
公共静态类缩减器扩展了MapReduceBase实现
减速器
{
@凌驾
公共无效配置(JobConf作业)
{
超级配置(作业);
}
@凌驾
public void close()引发IOException
{
super.close();
}
@凌驾
public void reduce(文本键、迭代器值、,
OutputCollector sharedOutputCollector,
(记者)
抛出IOException
{
while(values.hasNext())
{
LongWritable value=values.next();
collect(new LongWritable(),new LongWritable());
}
}
}
@凌驾
公共int运行(字符串[]args)引发异常
{
GenericOptionsParser parserGO=新的GenericOptionsParser(getConf(),
args);
args=parserGO.getRemainingArgs();
log.info(“开始”);
尝试
{
选项=新选项();
options.addOption(“i”,true,“输入路径”);
addOption(“o”,true,“输出路径”);
CommandLineParser parser=新的PosixParser();
如果(args.length==0)
{
HelpFormatter formatter=新的HelpFormatter();
printHelp(NewJoiner.class.getName(),选项);
返回-1;
}
字符串inputPath=“输入”;
字符串outputPath=“输出”;
命令行;
尝试
{
line=parser.parse(选项、参数);
如果(第1行选择(“i”))
{
inputPath=line.getOptionValue(“i”);
}
if(第行选项(“o”))
{
outputPath=line.getOptionValue(“o”);
}
}
捕获(解析异常)
{
log.error(“命令行解析失败”,e);
返回-1;
}
runJob(getConf(),新路径(inputPath),新路径(outputPath));
}
捕获(例外e)
{
log.error(“在main中捕获异常:”,e);
}
log.info(“完成”);
返回0;
}
@凌驾
公共配置getConf()
{
返回这个.conf;
}
@凌驾
公共无效设置配置(配置配置配置)
{
this.conf=conf;
}
保护配置配置;
}

您还需要设置以下参数:

conf.setReducerClass(reducer.class);
conf.setJarByClass(DummyMR.class);

你能展示一些代码片段吗?@LorandBendig我添加了显示问题的示例代码你为什么要使用旧的mrapi?
conf.setReducerClass(reducer.class);
conf.setJarByClass(DummyMR.class);