hadoop+;可写接口+;readFields在reducer中引发异常

hadoop+;可写接口+;readFields在reducer中引发异常,hadoop,writable,Hadoop,Writable,我有一个简单的map reduce程序,其中的map和reduce原语如下所示 映射(K,V)=(文本,输出聚合器) 减少(文本,输出聚合器)=(文本,文本) 重要的一点是,我从map函数发出一个OutputAggregator类型的对象,它是我自己实现可写接口的类。但是,我的reduce失败了,出现以下异常。更具体地说,readFieds()函数正在引发异常。有什么线索吗?我使用hadoop 0.18.3 10/09/19 04:04:59 INFO jvm.JvmMetrics: Initi

我有一个简单的map reduce程序,其中的map和reduce原语如下所示

映射(K,V)=(文本,输出聚合器)
减少(文本,输出聚合器)=(文本,文本)

重要的一点是,我从map函数发出一个OutputAggregator类型的对象,它是我自己实现可写接口的类。但是,我的reduce失败了,出现以下异常。更具体地说,readFieds()函数正在引发异常。有什么线索吗?我使用hadoop 0.18.3

10/09/19 04:04:59 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
10/09/19 04:04:59 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
10/09/19 04:04:59 INFO mapred.FileInputFormat: Total input paths to process : 1
10/09/19 04:04:59 INFO mapred.FileInputFormat: Total input paths to process : 1
10/09/19 04:04:59 INFO mapred.FileInputFormat: Total input paths to process : 1
10/09/19 04:04:59 INFO mapred.FileInputFormat: Total input paths to process : 1
10/09/19 04:04:59 INFO mapred.JobClient: Running job: job_local_0001
10/09/19 04:04:59 INFO mapred.MapTask: numReduceTasks: 1
10/09/19 04:04:59 INFO mapred.MapTask: io.sort.mb = 100
10/09/19 04:04:59 INFO mapred.MapTask: data buffer = 79691776/99614720
10/09/19 04:04:59 INFO mapred.MapTask: record buffer = 262144/327680
Length = 10
10
10/09/19 04:04:59 INFO mapred.MapTask: Starting flush of map output
10/09/19 04:04:59 INFO mapred.MapTask: bufstart = 0; bufend = 231; bufvoid = 99614720
10/09/19 04:04:59 INFO mapred.MapTask: kvstart = 0; kvend = 10; length = 327680
gl_books
10/09/19 04:04:59 WARN mapred.LocalJobRunner: job_local_0001
java.lang.NullPointerException
 at org.myorg.OutputAggregator.readFields(OutputAggregator.java:46)
 at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:67)
 at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:40)
 at org.apache.hadoop.mapred.Task$ValuesIterator.readNextValue(Task.java:751)
 at org.apache.hadoop.mapred.Task$ValuesIterator.next(Task.java:691)
 at org.apache.hadoop.mapred.Task$CombineValuesIterator.next(Task.java:770)
 at org.myorg.xxxParallelizer$Reduce.reduce(xxxParallelizer.java:117)
 at org.myorg.xxxParallelizer$Reduce.reduce(xxxParallelizer.java:1)
 at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.combineAndSpill(MapTask.java:904)
 at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:785)
 at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:698)
 at org.apache.hadoop.mapred.MapTask.run(MapTask.java:228)
 at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:157)
java.io.IOException: Job failed!
 at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1113)
 at org.myorg.xxxParallelizer.main(xxxParallelizer.java:145)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.hadoop.util.RunJar.main(RunJar.java:155)
 at org.apache.hadoop.mapred.JobShell.run(JobShell.java:54)
 at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
 at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
 at org.apache.hadoop.mapred.JobShell.main(JobShell.java:68)

发布有关自定义代码的问题时:发布相关代码。因此,第46行的内容以及前后几行内容将非常有帮助……:)

然而,这可能有助于:

编写自己的可写类时的陷阱是Hadoop一次又一次地重用类的实际实例。在对readFields的调用之间,您不会得到一个闪亮的新实例

因此,在readFields方法开始时,您必须假设您所在的对象已被“垃圾”填充,并且必须在继续之前清除

我给您的建议是实现一个“clear()”方法,该方法完全擦除当前实例,并将其重置为创建和构造函数完成后的状态。当然,您在readFields中调用该方法作为键和值的第一件事


HTH

发布有关自定义代码的问题时:发布相关代码。因此,第46行的内容以及前后几行内容将非常有帮助……:)

然而,这可能有助于:

编写自己的可写类时的陷阱是Hadoop一次又一次地重用类的实际实例。在对readFields的调用之间,您不会得到一个闪亮的新实例

因此,在readFields方法开始时,您必须假设您所在的对象已被“垃圾”填充,并且必须在继续之前清除

我给您的建议是实现一个“clear()”方法,该方法完全擦除当前实例,并将其重置为创建和构造函数完成后的状态。当然,您在readFields中调用该方法作为键和值的第一件事


HTH

除了Niels Basjes回答:只需在空构造函数中初始化成员变量(必须提供,否则Hadoop无法初始化对象),例如:


假设
this.member
是类型
intwriteable

除了Niels Basjes回答:只需在空构造函数中初始化您的成员变量(您必须提供,否则Hadoop无法初始化您的对象),例如:


假设
this.member
的类型为
intwriteable

为OutputAggregator.readFields()发布代码。第46行是什么?发布OutputAggregator.readFields()的代码。46号线有什么?
public OutputAggregator() {
    this.member = new IntWritable();
    ...
}