Java Hadoop:所有数据节点127.0.0.1:50010都是坏的。流产

Java Hadoop:所有数据节点127.0.0.1:50010都是坏的。流产,java,hadoop,mapreduce,hdfs,mahout,Java,Hadoop,Mapreduce,Hdfs,Mahout,我正在使用Hadoop上的PartialBuilder实现运行ApacheMahout 0.9(org.Apache.Mahout.classifier.df.mapreduce.BuildForest)中的一个示例,但无论我如何尝试,都会遇到一个错误 错误是: 14/12/10 10:58:36 INFO mapred.JobClient: Running job: job_201412091528_0004 14/12/10 10:58:37 INFO mapred.JobClient:

我正在使用Hadoop上的PartialBuilder实现运行ApacheMahout 0.9(org.Apache.Mahout.classifier.df.mapreduce.BuildForest)中的一个示例,但无论我如何尝试,都会遇到一个错误

错误是:

14/12/10 10:58:36 INFO mapred.JobClient: Running job: job_201412091528_0004
14/12/10 10:58:37 INFO mapred.JobClient:  map 0% reduce 0%
14/12/10 10:58:50 INFO mapred.JobClient:  map 10% reduce 0%
14/12/10 10:59:44 INFO mapred.JobClient:  map 20% reduce 0%
14/12/10 11:32:23 INFO mapred.JobClient: Task Id : attempt_201412091528_0004_m_000000_0, Status : FAILED
java.io.IOException: All datanodes 127.0.0.1:50010 are bad. Aborting...
  at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:3290)
  at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2200(DFSClient.java:2783)
  at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2987)
datanode日志文件中没有明显错误:

2014-12-10 11:32:19,157 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: /127.0.0.1:50010, dest: /127.0.0.1:62662, bytes: 549024, op: HDFS_READ, cliID: DFSClient_attempt_201412091528_0004_m_000000_0_1249767243_1, offset: 0, srvID: DS-957555695-10.0.1.9-50010-1418164764736, blockid: blk_-7548306051547444322_12804, duration: 2012297405000
2014-12-10 11:32:25,511 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: /127.0.0.1:50010, dest: /127.0.0.1:64109, bytes: 1329, op: HDFS_READ, cliID: DFSClient_attempt_201412091528_0004_m_000000_1_-1362169490_1, offset: 0, srvID: DS-957555695-10.0.1.9-50010-1418164764736, blockid: blk_4126779969492093101_12817, duration: 285000
2014-12-10 11:32:29,496 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: /127.0.0.1:50010, dest: /127.0.0.1:64110, bytes: 67633152, op: HDFS_READ, cliID: DFSClient_attempt_201412091528_0004_m_000000_1_-1362169490_1, offset: 0, srvID: DS-9575556
。。。或者在namenode文件中。jobtracker只是重复在datanode日志中发现的错误。故障前几分钟出现的一个错误是EOF错误,这可能是PartialBuilder的问题,也可能不是:

2014-12-10 12:12:22,060 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(127.0.0.1:50010, storageID=DS-957555695-10.0.1.9-50010-1418164764736, infoPort=50075, ipcPort=50020):DataXceiver
java.io.EOFException: while trying to read 65557 bytes
  at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.readToBuf(BlockReceiver.java:296)
  at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.readNextPacket(BlockReceiver.java:340)
  at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receivePacket(BlockReceiver.java:404)
  at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receiveBlock(BlockReceiver.java:582)
  at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:404)
  at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:112)
  at java.lang.Thread.run(Thread.java:695)
我能够直接向DFS读写文件。我甚至可以在一小部分数据上运行此作业,但我无法使此Map/Reduce作业正常工作。知道我做错了什么吗

关于我的设置的注意事项:

  • 一切都在本地运行
  • ApacheMahout版本0.9
  • Hadoop版本1.2.1
  • Java版本1.6.0_65
hdfs-site.xml设置:

  • dfs.replication=4
  • dfs.permissions=false
  • dfs.name.dir=/Users/juliuss/Dev/hdfs/name/
  • dfs.data.dir=/Users/juliuss/Dev/hdfs/data/
  • mapred.child.java.opts=-Xmx4096m
  • dfs.datanode.socket.write.timeout=0

在处理了一百万个设置后(这些设置都不起作用),我最终通过大幅减小拆分大小解决了这个问题:

-Dmapred.max.split.size=16777216
这将此数据集的映射器数量从10个增加到40个,从而使它们能够正确完成。现在我已经隔离了这个问题,我将稳步增加分割大小以找到正确的数字。(对于随机林,您应该找到可能获得最佳结果的最大分割。)


不幸的是,我不知道为什么拆分大小会导致“All datanodes is bad.Aborting”错误,因为这不是我预期的错误。

通常会遇到“All datanodes…is bad.Aborting…”错误,通常人们建议查看打开的文件限制。可能与您的问题有关。我已经尝试过了,但是谢谢您的提示,因为它可能会帮助其他人。我有完全相同的问题(使用相同的hadoop版本)。除了更改拆分大小之外,您是否发现了这一问题的实际原因?不幸的是,我没有发现!我很想理解为什么会发生这种情况(即使我分配了足够的内存)。如果您发现了,请添加一个更好的答案,我会接受。我看到一些轶事证据表明,这可能是由于I/O速度慢或过快造成的。我在junit中使用hadoop,并且得到了相同的错误,我应该在哪里设置此值?