2010-11-20 4 views
3

В настоящее время я работаю над проектом с использованием Hadoop 0.21.0, 985326 и кластера из 6 рабочих узлов и головного узла. Отправка регулярного задания на создание карты не удается, но я понятия не имею, почему. Кто-нибудь видел это исключение раньше?Ошибка Hadoop Spill

org.apache.hadoop.mapred.Child: Exception running child : java.io.IOException: Spill failed 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.checkSpillException(MapTask.java:1379) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$200(MapTask.java:711) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$Buffer.write(MapTask.java:1193) 
    at java.io.DataOutputStream.write(DataOutputStream.java:90) 
    at org.apache.hadoop.io.Text.write(Text.java:290) 
    at org.apache.hadoop.io.serializer.WritableSerialization$WritableSerializer.serialize(WritableSerialization.java:100) 
    at org.apache.hadoop.io.serializer.WritableSerialization$WritableSerializer.serialize(WritableSerialization.java:84) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:967) 
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:583) 
    at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:92) 
    at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.write(WrappedMapper.java:111) 
    at be.ac.ua.comp.ronny.riki.invertedindex.FilteredInvertedIndexBuilder$Map.map(FilteredInvertedIndexBuilder.java:113) 
    at be.ac.ua.comp.ronny.riki.invertedindex.FilteredInvertedIndexBuilder$Map.map(FilteredInvertedIndexBuilder.java:1) 
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:652) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:328) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:217) 
    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:742) 
    at org.apache.hadoop.mapred.Child.main(Child.java:211) 
Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>() 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:123) 
    at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:68) 
    at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:44) 
    at org.apache.hadoop.mapreduce.task.ReduceContextImpl.nextKeyValue(ReduceContextImpl.java:145) 
    at org.apache.hadoop.mapreduce.task.ReduceContextImpl.nextKey(ReduceContextImpl.java:121) 
    at org.apache.hadoop.mapreduce.lib.reduce.WrappedReducer$Context.nextKey(WrappedReducer.java:291) 
    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:168) 
    at org.apache.hadoop.mapred.Task$NewCombinerRunner.combine(Task.java:1432) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1457) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$600(MapTask.java:711) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$SpillThread.run(MapTask.java:1349) 
Caused by: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>() 
    at java.lang.Class.getConstructor0(Class.java:2706) 
    at java.lang.Class.getDeclaredConstructor(Class.java:1985) 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117) 
    ... 10 more 

В настоящее время я экспериментировал с некоторыми параметрами конфигурации в надежде, что эта ошибка исчезает, но до сих пор это не удалось. Параметры конфигурации Я тонкой настройки являются:

  • mapred.map.tasks = 60
  • mapred.reduce.tasks = 12
  • Job.MAP_OUTPUT_COMPRESS (или mapreduce.map.output.compress) = истинная
  • Job.IO_SORT_FACTOR (или mapreduce.task.io.sort.factor) = 10
  • Job.IO_SORT_MB (или mapreduce.task.io.sort.mb) = 256
  • Job.MAP_JAVA_OPTS (или MapReduce .map.java.opts) = "-Xmx256" или "-Xmx512"
  • Job.REDUCE_JAVA_OPTS (или mapreduce.reduce.java.opts) = "-Xmx256" или "-Xmx512"

Может кто-нибудь объяснить, почему исключение выше происходит? И как этого избежать? Или просто краткое объяснение, что подразумевает операция утечки хаоса?

ответ

2

Хорошо, все проблемы решены.

Операция сериализации Map-Reduce требует использования стандартного конструктора по умолчанию для org.apache.hadoop.io.ArrayWritable.
Реализация Hadoops не предоставила конструктор по умолчанию для ArrayWritable.
Вот почему java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.() Был выброшен и вызван странным исключением.

Простая обертка сделанная ArrayWritable действительно доступная для записи и исправленная! Странно, что Hadoop этого не предоставил.

+0

См. Мой ответ здесь, почему это так: http://stackoverflow.com/questions/4386781/implementation-of-an-arraywritable-for-a-custom-hadoop-type/4390928#4390928 – MrGomez

1

Эта проблема возникла для меня, когда вывод одного из моих заданий по карте произвел символ табуляции («\ t») или символ новой строки («\ r» или «\ n»). Hadoop не справляется с этим хорошо и терпит неудачу. Я был в состоянии решить это, используя этот кусок кода Python:

if "\t" in output: 
    output = output.replace("\t", "") 
if "\r" in output: 
    output = output.replace("\r", "") 
if "\n" in output: 
    output = output.replace("\n", "") 

Вы, возможно, придется сделать что-то другое для вашего приложения.