2010-09-19 2 views
-1

У меня есть простой картографический сократить программу, в которой моя карта и сократить примитивы посмотреть, как этотHadoop + интерфейс Writable + readFields бросает исключение в редукторе

карты (K, V) = (Текст, OutputAggregator)
reduce (Text, OutputAggregator) = (текст, текст)

Важным моментом является то, что из моей функции карты я выделяю объект типа OutputAggregator, который является моим собственным классом, который реализует Writable-интерфейс. Однако мое сокращение не выполняется с последующим исключением. В частности, функция 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) 
+1

Отправьте код для OutputAggregator.readFields(). Что на линии 46? – bajafresh4life

ответ

2

При размещении вопроса о таможенном коде: разместите соответствующий фрагмент кода. Таким образом, содержание линии 46 и несколько строк до & после действительно поможет ... :)

Однако это может помочь:

ловушки при написании собственного Writable класса является тем фактом, что Hadoop повторно фактический экземпляр класса снова и снова. Между вызовами readFields вы НЕ получите новый блестящий экземпляр.

Итак, в начале метода readFields вы ДОЛЖНЫ предполагать, что объект, в котором вы находитесь, заполнен «мусором» и должен быть очищен до продолжения.

Мое предложение для вас - реализовать метод «clear()», который полностью уничтожит текущий экземпляр и сбрасывает его в состояние, которое было бы в тот момент, когда оно было создано, и конструктор завершен. И, конечно, вы называете этот метод первым в своих readFields как для ключа, так и для значения.

НТН

0

В дополнение к Niels Basjes ответ: Просто инициализировать переменные-члены внутри пустой конструктор (который вы должны предоставить, в противном случае Hadoop не может инициализировать ваш объект), например:

public OutputAggregator() { 
    this.member = new IntWritable(); 
    ... 
} 

предполагая, что this.member имеет тип IntWritable.

Смежные вопросы