2010-11-20 15 views
3

現在、Hadoop 0.21.0,985326と6つのワーカーノードとヘッドノードのクラスタを使用しているプロジェクトに取り組んでいます。 通常のmapreduceジョブの送信は失敗しますが、なぜかわかりません。誰もこの例外を以前見たことがありますか?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(又はマップリデュース.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", "") 

あなたのアプリには別の処理が必要な場合があります。