Ошибка репликации данных в Hadoop

20

Я реализую кластер Hodeop Single Node Cluster на моей машине, следуя учебник Майкла Нолла и столкнулись с ошибкой репликации данных:

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

> [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.run(Server.java:959)     at
> org.apache.hadoop.ipc.Server$Handler.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.access00(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.run(Server.java:959)     at
> org.apache.hadoop.ipc.Server$Handler.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.run(Server.java:959)     at
> org.apache.hadoop.ipc.Server$Handler.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.access00(DFSClient.java:2102)
>     at
> org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2288)

Также при выполнении:

bin/stop-all.sh

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

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

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

    
задан Apoorv Saxena 04.05.2012 в 13:15
источник

8 ответов

25

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

Пошаговая процедура будет:

  1. Запустите namenode bin/hadoop namenode . Проверьте наличие ошибок, если они есть.
  2. Запустите datanodes bin/hadoop datanode . Проверьте наличие ошибок, если они есть.
  3. Теперь запустите трекер задач, отслеживатель заданий, используя «bin / start-mapred.sh»
ответ дан Apoorv Saxena 11.05.2012 в 20:35
источник
7

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

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

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

    
ответ дан Eddie Money 04.05.2012 в 13:33
источник
  • спасибо, я действительно нашел решение. Это связано с тем, что дататод и наменода требуют времени для запуска, а вместо выполнения bin / start-all.sh я использовал bin / hadoop namenode, bin / hadoop datanode, а затем bin / start-mapred.sh. –  Apoorv Saxena 04.05.2012 в 14:57
4

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

    
ответ дан Mike 13.03.2013 в 02:23
источник
2

У меня была такая же проблема, я взглянул на журналы данных данных, и появилось предупреждение о том, что у 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).

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

    
ответ дан cacol89 06.04.2013 в 20:26
источник
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>
    
ответ дан mahmood 24.03.2014 в 12:40
источник
1

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

    
ответ дан killjoy 17.03.2015 в 20:33
источник
0

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

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

    
ответ дан leodream 09.04.2013 в 17:04
источник
  • Вы серьезно? Добавление «127.0.0.1 hostname» в / etc / hosts, вероятно, вызовет ошибку Connection Refused. wiki.apache.org/hadoop/ConnectionRefused –  zeekvfu 27.11.2013 в 08:34
  • Я не знаю, почему я написал 127.0.0.1 в тот момент. В моем / etc / hosts нет такой записи. Я предполагаю, что собираюсь написать «<IP-адрес> имя хоста» и допустил ошибку. Извините за тех людей, которые были введены в заблуждение этим комментарием. –  leodream 10.12.2013 в 15:51
  • +1 для обновления вашего ответа. :-) –  zeekvfu 11.12.2013 в 02:39
0

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

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

sbin/start-yarn.sh     

ответ дан swapna 29.07.2015 в 23:43
источник