Hadoop: Все датоданы 127.0.0.1:50010 плохие. Aborting
Я запускаю пример из Apache Mahout 0.9 (org.apache.mahout.classifier.df.mapreduce.BuildForest) с использованием реализации PartialBuilder на Hadoop, но я получаю сообщение об ошибке, независимо от того, что я пытаюсь.
Ошибка:
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)
В файле журнала датоде нет явных ошибок:
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 просто повторяет ошибку, найденную в журнале датодета. Единственной ошибкой, которая предшествует сбою на несколько минут, является ошибка 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 работать правильно. Есть идеи, что я делаю не так?
Примечания о моей настройке:
- Все работает локально
- Apache Mahout версия 0.9
- Hadoop версия 1.2.1
- Java версия 1.6.0_65
Настройки hdfs-site.xml:
- dfs.replication = 4
- dfs.permissions = false
- dfs.name.dir = / Пользователи / juliuss / Dev / hdfs / name /
- dfs.data.dir = / Пользователи / juliuss / Dev / hdfs / data /
- mapred.child.java.opts = -Xmx4096m
- dfs.datanode.socket.write.timeout = 0
1 ответ
После работы с миллионами настроек, ни одна из которых не сработала, я наконец решил эту проблему, значительно уменьшив размер разбиения:
-Dmapred.max.split.size=16777216
Это увеличило количество картографов с 10 до 40 для этого набора данных, что позволило им завершить правильно. Теперь, когда я выделил проблему, я собираюсь постепенно увеличивать размер разбиения, чтобы найти правильное число. (Для случайных лесов вы должны найти максимально возможное разделение, чтобы получить наилучшие результаты.)
К сожалению, я не знаю, почему размер разделения вызвал ошибку "Все датоданы плохие. Прерывание", так как это не та ошибка, которую я ожидал.