job.setOutputKeyClass和job.setOutputReduceClass在哪里引用?

时间:2013-01-08 22:32:19

标签: java hadoop mapreduce

我认为他们引用了Reducer,但在我的程序中我有

public static class MyMapper extends Mapper< LongWritable, Text, Text, Text >

public static class MyReducer extends Reducer< Text, Text, NullWritable, Text >

所以,如果我有

job.setOutputKeyClass( NullWritable.class );

job.setOutputValueClass( Text.class );

我得到以下例外

Type mismatch in key from map: expected org.apache.hadoop.io.NullWritable, recieved org.apache.hadoop.io.Text

但如果我有

job.setOutputKeyClass( Text.class );

没有问题。

我的代码是否存在错误,或者是因为NullWritable或其他原因而发生这种情况?

我还必须使用job.setInputFormatClassjob.setOutputFormatClass吗?因为我的程序在没有它们的情况下正确运行。

1 个答案:

答案 0 :(得分:29)

调用job.setOutputKeyClass( NullWritable.class );会将期望的类型设置为map和reduce阶段的输出。

如果您的Mapper发出的类型与Reducer不同,您可以使用JobConf的{​​{1}}和setMapOutputKeyClass()方法设置映射器发出的类型。这些隐式设置了Reducer预期的输入类型。

(来源:Yahoo Developer Tutorial

关于您的第二个问题,默认setMapOutputValueClass()InputFormat。这会将每个输入文件的每一行视为单独的记录,并且不执行解析。如果需要以不同的格式处理输入,可以调用这些方法,这里有一些例子:

TextInputFormat

InputFormat | Description | Key | Value -------------------------------------------------------------------------------------------------------------------------------------------------------- TextInputFormat | Default format; reads lines of text files | The byte offset of the line | The line contents KeyValueInputFormat | Parses lines into key, val pairs | Everything up to the first tab character | The remainder of the line SequenceFileInputFormat | A Hadoop-specific high-performance binary format | user-defined | user-defined 的默认实例是OutputFormat,它在文本文件的各行上写入(键,值)对。以下是一些例子:

TextOutputFormat

(来源:Other Yahoo Developer Tutorial