2012-05-04 2 views
18

Я реализующий Hadoop одного узла кластера на моей машине, следуя Michael Noll's tutorial и наткнулись ошибки репликации данных:репликации данных в Hadoop

Вот полное сообщение об ошибке:

> [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 

В нем говорится, что дататод не был запущен и, следовательно, его нельзя остановить. Хотя, выход jps говорит, что присутствует дататод.

Я попытался форматированием NameNode, изменение разрешения владельца, но это не похоже на работу. Надеюсь, я не пропустил никакой другой важной информации.

Заранее спасибо.

ответ

25

Решение, которое сработало для меня, состояло в том, чтобы запускать namenode и datanode по одному, а не вместе, используя bin/start-all.sh. Что происходит при использовании этого подхода, так это то, что ошибка очевидна, если у вас возникла проблема с настройкой данных в сети, а также многие сообщения в stackoverflow предполагают, что для наменования требуется некоторое время для начала, поэтому ему нужно дать некоторое время начинать до запуска данных. Кроме того, в этом случае у меня возникла проблема с разными идентификаторами namenode и datanodes, для которых мне пришлось изменить идентификаторы datanode с тем же идентификатором, что и наменода.

Шаг за шагом процедуры будет:

  1. Начало NameNode bin/hadoop namenode. Проверьте наличие ошибок, если они есть.
  2. Запустить datanodes bin/hadoop datanode. Проверьте наличие ошибок, если они есть.
  3. Теперь запустите трекер проблемно-трекер, работу с помощью «бен/start-mapred.sh»
7

Посмотрите на свой namenode (возможно, http://localhost:50070) и посмотрите, сколько данных у вас есть.

Если это 0, то либо ваш datanode не работает, либо он не настроен для подключения к namenode.

Если это 1, проверьте, сколько свободного места указано в DFS. Возможно, узел данных не имеет возможности записывать данные (каталог данных не существует или не имеет разрешений на запись).

+0

спасибо, я действительно нашел решение. Это связано с тем, что datanode и namenode требуют времени для запуска, а вместо выполнения «bin/start-all.sh» я использовал «bin/hadoop namenode», «bin/hadoop datanode», а затем «bin/start-mapred.sh» '. –

4

Хотя решена, я добавляю это для будущих читателей. Рекомендации Коди по проверке начала наменода и датанода были полезны, и дальнейшее исследование привело меня к удалению каталога hadoop-store/dfs. Для этого я решил эту ошибку.

2

У меня была такая же проблема, я взглянул на журналы данных данных, и было предупреждение о том, что у dfs.data.dir были неправильные разрешения ... поэтому я просто изменил их, и все сработало, что странно.

В частности, мой «dfs.data.реж «был установлен в положение„/ дом/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. 
... 
... 

Так что я просто казнены следующие команды:

  • Я останавливали всех демонов» бен/stop-all.sh»
  • Изменить права доступа к каталогу с "CHMOD -R 755/дома/Hadoop/hd_tmp"
  • Я дал формат снова к NameNode с "бен/Hadoop NameNode -format".
  • Я снова запустил демонов «bin/start -all.sh»
  • И воила, датафон был запущен и работает! (Я проверил его с помощью команды «jsp», где был показан процесс с именем DataNode).

И тогда все сработало нормально.

0

Я столкнулся с той же проблемой. Когда я посмотрел на localhost: 50070, под сводкой кластера все свойства были показаны как 0, кроме «DFS Used% 100». Обычно эта ситуация возникает из-за ошибок в трех файлах * -site.xml файла HADOOP_INSTALL/conf и hosts.

В моем случае причина не может разрешить имя хоста. Я решил проблему просто, добавив «имя хоста IP_Address» в /etc/hosts.

+0

Вы серьезно? Добавление «127.0.0.1 hostname» в **/etc/hosts **, вероятно, вызовет ошибку ** Connection Refused **. http://wiki.apache.org/hadoop/ConnectionRefused – zeekvfu

+0

Я не знаю, почему я написал 127.0.0.1 в этот момент. В моем/etc/hosts нет такой записи. Полагаю, я собирался написать « имя хоста» и сделал ошибку. Извините за тех людей, которые были введены в заблуждение этим комментарием. – leodream

+0

+1 для обновления вашего ответа. :-) – zeekvfu

1

В моем случае я ошибочно установил одно назначение для 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> 
1

я удалил дополнительные свойства в HDFS-site.xml, а затем этот вопрос исчез. Hadoop должен улучшить свои сообщения об ошибках. Я пробовал каждое из вышеуказанных решений, и никто не работал.

0

В моем случае мне пришлось удалить:

/tmp/hadoop-<user-name> папку и формат и начать использовать sbin/start-dfs.sh

sbin/start-yarn.sh

Смежные вопросы