Ошибка репликации данных в Hadoop
Я реализую кластер Hadoop Single Node на моей машине, следуя учебному пособию Майкла Нолла и столкнулся с ошибкой репликации данных:
Здесь отображается полное сообщение об ошибке:
> [email protected]:~/hadoop$ bin/hadoop dfs -copyFromLocal
> tmp/testfiles testfiles
>
> 12/05/04 16:18:41 WARN hdfs.DFSClient: DataStreamer Exception:
> org.apache.hadoop.ipc.RemoteException: java.io.IOException: File
> /user/hadoop/testfiles/testfiles/file1.txt could only be replicated to
> 0 nodes, instead of 1 at
> org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1271)
> at
> org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:422)
> at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597) at
> org.apache.hadoop.ipc.RPC$Server.call(RPC.java:508) at
> org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:959) at
> org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:955) at
> java.security.AccessController.doPrivileged(Native Method) at
> javax.security.auth.Subject.doAs(Subject.java:396) at
> org.apache.hadoop.ipc.Server$Handler.run(Server.java:953)
>
> at org.apache.hadoop.ipc.Client.call(Client.java:740) at
> org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:220) at
> $Proxy0.addBlock(Unknown Source) at
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597) at
> org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)
> at
> org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)
> at $Proxy0.addBlock(Unknown Source) at
> org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.locateFollowingBlock(DFSClient.java:2937)
> at
> org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.java:2819)
> at
> org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2000(DFSClient.java:2102)
> at
> org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2288)
>
> 12/05/04 16:18:41 WARN hdfs.DFSClient: Error Recovery for block null
> bad datanode[0] nodes == null 12/05/04 16:18:41 WARN hdfs.DFSClient:
> Could not get block locations. Source file
> "/user/hadoop/testfiles/testfiles/file1.txt" - Aborting...
> copyFromLocal: java.io.IOException: File
> /user/hadoop/testfiles/testfiles/file1.txt could only be replicated to
> 0 nodes, instead of 1 12/05/04 16:18:41 ERROR hdfs.DFSClient:
> Exception closing file /user/hadoop/testfiles/testfiles/file1.txt :
> org.apache.hadoop.ipc.RemoteException: java.io.IOException: File
> /user/hadoop/testfiles/testfiles/file1.txt could only be replicated to
> 0 nodes, instead of 1 at
> org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1271)
> at
> org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:422)
> at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597) at
> org.apache.hadoop.ipc.RPC$Server.call(RPC.java:508) at
> org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:959) at
> org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:955) at
> java.security.AccessController.doPrivileged(Native Method) at
> javax.security.auth.Subject.doAs(Subject.java:396) at
> org.apache.hadoop.ipc.Server$Handler.run(Server.java:953)
>
> org.apache.hadoop.ipc.RemoteException: java.io.IOException: File
> /user/hadoop/testfiles/testfiles/file1.txt could only be replicated to
> 0 nodes, instead of 1 at
> org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1271)
> at
> org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:422)
> at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597) at
> org.apache.hadoop.ipc.RPC$Server.call(RPC.java:508) at
> org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:959) at
> org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:955) at
> java.security.AccessController.doPrivileged(Native Method) at
> javax.security.auth.Subject.doAs(Subject.java:396) at
> org.apache.hadoop.ipc.Server$Handler.run(Server.java:953)
>
> at org.apache.hadoop.ipc.Client.call(Client.java:740) at
> org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:220) at
> $Proxy0.addBlock(Unknown Source) at
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597) at
> org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)
> at
> org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)
> at $Proxy0.addBlock(Unknown Source) at
> org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.locateFollowingBlock(DFSClient.java:2937)
> at
> org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.java:2819)
> at
> org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2000(DFSClient.java:2102)
> at
> org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2288)
Также при выполнении:
bin/stop-all.sh
В нем говорится, что datanode не запущен и, следовательно, не может быть остановлен. Хотя, вывод jps говорит о наличии datanode.
Я попробовал форматировать namenode, изменение прав владельца, но он, похоже, не работает. Надеюсь, я не пропустил никакой другой соответствующей информации.
Спасибо заранее.
Ответы
Ответ 1
Решение, которое сработало для меня, состояло в том, чтобы запускать namenode и datanode по одному, а не вместе, используя bin/start-all.sh
. Что происходит при использовании этого подхода, так это то, что ошибка очевидна, если у вас возникла проблема с настройкой данных в сети, а также многие сообщения в stackoverflow предполагают, что для наменования требуется некоторое время для начала, поэтому ему нужно дать некоторое время начинать до запуска данных. Кроме того, в этом случае у меня возникла проблема с разными идентификаторами namenode и datanodes, для которых мне пришлось изменить идентификаторы datanode с тем же идентификатором, что и наменода.
Пошаговая процедура будет:
- Запустите namenode
bin/hadoop namenode
. Проверьте наличие ошибок, если они есть.
- Запустите datanodes
bin/hadoop datanode
. Проверьте наличие ошибок, если они есть.
- Теперь запустите трекер задач, отслеживатель заданий, используя "bin/start-mapred.sh"
Ответ 2
Посмотрите на свой namenode (возможно, http://localhost:50070) и посмотрите, сколько данных у вас есть.
Если это 0, то либо ваш datanode не запущен, либо он не настроен для подключения к namenode.
Если это 1, проверьте, сколько свободного места указано в DFS. Возможно, данные node не имеют возможности записывать данные (данные dir не существуют или не имеют разрешений на запись).
Ответ 3
Хотя я решил, что я добавляю это для будущих читателей. Кодийский совет по проверке начала наменода и датанода был полезен, и дальнейшее исследование привело меня к удалению каталога hadoop-store/dfs. Для этого я решил эту ошибку.
Ответ 4
У меня была такая же проблема, я взглянул на журналы данных данных, и появилось предупреждение о том, что у dfs.data.dir были неправильные разрешения... поэтому я просто изменил их, и все сработало, что довольно странно.
В частности, мой "dfs.data.dir" был установлен в "/home/hadoop/hd_tmp", и я получил ошибку:
...
...
WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Invalid directory in dfs.data.dir: Incorrect permission for /home/hadoop/hd_tmp/dfs/data, expected: rwxr-xr-x, while actual: rwxrwxr-x
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: All directories in dfs.data.dir are invalid.
...
...
Итак, я просто выполнил следующие команды:
- Я остановил всех демонов с помощью "bin/stop-all.sh"
- Измените разрешения каталога с помощью "chmod -R 755/home/hadoop/hd_tmp"
- Я снова дал формат namenode с "bin/hadoop namenode -format".
- Я снова запустил демонов "bin/start -all.sh"
- И воела, дейтанод был запущен и работает! (Я проверил его с помощью команды "jsp", где был показан процесс с именем DataNode).
И тогда все сработало нормально.
Ответ 5
В моем случае я ошибочно устанавливаю одно назначение для dfs.name.dir
и dfs.data.dir
. Правильный формат
<property>
<name>dfs.name.dir</name>
<value>/path/to/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/path/to/data</value>
</property>
Ответ 6
Я удалил дополнительные свойства в файле hdfs-site.xml, и эта проблема исчезла. Hadoop должен улучшить свои сообщения об ошибках. Я пробовал каждое из вышеуказанных решений, и никто не работал.
Ответ 7
Я столкнулся с той же проблемой. Когда я посмотрел на localhost: 50070, в рамках сводки кластера все свойства были показаны как 0, кроме "DFS Used% 100". Обычно эта ситуация возникает из-за ошибок в трех файлах * - site.xml в файле HADOOP_INSTALL/conf и hosts.
В моем случае причина не может разрешить имя хоста. Я решил проблему просто, добавив "имя хоста IP_Address" в /etc/hosts.
Ответ 8
В моем случае мне пришлось удалить:
/tmp/hadoop-<user-name>
и формат и начните использовать sbin/start-dfs.sh
sbin/start-yarn.sh