Подтвердить что ты не робот

Ошибка репликации данных в 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, изменение прав владельца, но он, похоже, не работает. Надеюсь, я не пропустил никакой другой соответствующей информации.

Спасибо заранее.

4b9b3361

Ответ 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