5

私は現在、Hadoop 0.21.0、985326、および 6 つのワーカー ノードと 1 つのヘッド ノードのクラスターを使用するプロジェクトに取り組んでいます。通常の mapreduce ジョブを送信すると失敗しますが、その理由がわかりません。誰もこの例外を見たことがありますか?

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) = true
  • 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"

上記の例外が発生する理由を誰か説明できますか? そして、それを回避する方法は?それとも、hadoop スピル操作が意味することを簡単に説明しますか?

4

2 に答える 2

3

わかりました、すべての問題が解決されました。

Map-Reduce シリアライゼーション操作には、org.apache.hadoop.io.ArrayWritableのデフォルト コンストラクターをインターンする必要があります。
Hadoops 実装では、ArrayWritable のデフォルト コンストラクターが提供されませんでした。
そのため、 java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.() がスローされ、奇妙なスピル例外が発生しました。

シンプルなラッパーが ArrayWritable を実際に書き込み可能にし、修正しました! Hadoop がこれを提供しなかったのは奇妙です。

于 2010-11-21T16:06:21.887 に答える
1

この問題は、マップ ジョブの 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", "")

アプリのために何か他のことをしなければならないかもしれません。

于 2012-11-26T23:24:24.477 に答える