2012-05-04 16 views
18

Me estoy poniendo en práctica el nodo de clúster Hadoop individual en mi máquina siguiendo Michael Noll's tutorial y han llegado a través de error de replicación de datos:replicación de datos en Hadoop

Aquí es el mensaje de error completo:

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

También cuando ejecutar:

bin/stop-all.sh 

Dice que el nodo de datos no se ha iniciado y, por lo tanto, no se puede detener. Sin embargo, la salida de jps indica que el nodo de datos está presente.

me trataron formatear la NameNode, cambiantes permisos de propietario, pero no parece funcionar. Espero no haber perdido ninguna otra información relevante.

Gracias de antemano.

Respuesta

25

La solución que funcionó para mí fue ejecutar namenode y datanode uno por uno y no juntos usando bin/start-all.sh. Lo que sucede con este enfoque es que el error es claramente visible si tiene algún problema para configurar los nodos de datos en la red y también muchas publicaciones en stackoverflow sugieren que namenode requiere algo de tiempo para comenzar, por lo tanto, se le debe dar algún tiempo para comience antes de comenzar los nodos de datos. Además, en este caso estaba teniendo problemas con diferentes ids de namenode y datanodes para los cuales tuve que cambiar los ids del datanode con el mismo ID que el namenode.

El procedimiento paso a paso será:

  1. Iniciar el NameNode bin/hadoop namenode. Verificar si hay errores.
  2. Inicia los nodos de datos bin/hadoop datanode. Verificar si hay errores.
  3. Ahora inicie el gestor de tareas de seguimiento, trabajo utilizando bin/start-mapred.sh '
7

Mire su namenode (probablemente http://localhost:50070) y vea cuántos nodos de datos dice que tiene.

Si es 0, entonces su nodo de datos no se está ejecutando o no está configurado para conectarse al namenode.

Si es 1, compruebe cuánto espacio libre dice que hay en el DFS. Puede ser que el nodo de datos no tenga ningún lugar donde pueda escribir datos (el directorio de datos no existe o no tiene permisos de escritura).

+0

gracias, en realidad encontrado la solución. Fue porque el nodo de datos y el namenode tardan en iniciarse y en lugar de ejecutar 'bin/start-all.sh', hice' bin/hadoop namenode', 'bin/hadoop datanode' y luego' bin/start-mapred.sh '. –

4

Aunque resuelto, estoy añadiendo esto para futuros lectores. El consejo de Cody de inspeccionar el inicio de namenode y datanode fue útil, y la investigación adicional me llevó a eliminar el directorio hadoop-store/dfs. Hacer esto solucionó este error para mí.

2

Tuve el mismo problema, eché un vistazo a los registros de datanode y había una advertencia que decía que dfs.data.dir tenía permisos incorrectos ... así que simplemente los cambié y todo funcionó, lo cual es una especie de extraño.

Específicamente, mi "dfs.data.dir "se establece en "/ home/hadoop/hd_tmp", y el error que obtuve fue:

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

Así que simplemente ejecuta estos comandos:

  • dejé de todos los demonios con" bin/stop-all.sh"
  • Cambiar los permisos del directorio con "chmod -R 755/home/hadoop/hd_tmp"
  • le di formato de nuevo a la NameNode con "bin/hadoop NameNode -format".
  • Reinicié los demonios "bin/start-all.sh"
  • Y voilà, ¡el nodo de datos estaba funcionando! (Lo comprobé con el comando "jsp", donde se mostró un proceso llamado DataNode).

Y luego todo funcionó bien.

0

Me encontré con el mismo problema. Cuando miré localhost: 50070, bajo el resumen del clúster, todas las propiedades se muestran como 0 excepto "DFS Usado% 100". Por lo general, esta situación ocurre porque hay algunos errores en los tres archivos * -site.xml en HADOOP_INSTALL/conf y en el archivo hosts.

En mi caso, la causa no puede resolver el nombre de host. Resolví el problema simplemente agregando "IP_Address hostname" a /etc/hosts.

+0

¿Hablas en serio? Agregar "127.0.0.1 nombre de host" a **/etc/hosts ** probablemente cause un error de ** Conexión rechazada **. http://wiki.apache.org/hadoop/ConnectionRefused – zeekvfu

+0

No sé por qué escribí el 127.0.0.1 en ese momento. No hay tal entrada en mi/etc/hosts ahora. Supongo que iba a escribir " hostname" y cometí un error. Lo siento por las personas que fueron engañadas por este comentario. – leodream

+0

+1 para actualizar su respuesta. :-) – zeekvfu

1

En mi caso, configuré erróneamente un destino para dfs.name.dir y dfs.data.dir. El formato correcto es

<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

Eliminé las propiedades adicionales en el hdfs-site.xml y luego este problema desapareció. Hadoop necesita mejorar sus mensajes de error. Intenté cada una de las soluciones anteriores y ninguna funcionó.

0

En mi caso he tenido que eliminar:

/tmp/hadoop-<user-name> carpeta y formato y comenzar a usar sbin/start-dfs.sh

sbin/start-yarn.sh

Cuestiones relacionadas