web-dev-qa-db-fra.com

Erreur HDFS: n'a pu être répliqué que sur 0 nœud au lieu de 1

J'ai créé un cluster hadoop ubuntu à nœud unique dans EC2.

Tester un simple téléchargement de fichier sur hdfs fonctionne à partir de la machine EC2, mais ne fonctionne pas à partir d'une machine en dehors de EC2.

Je peux parcourir le système de fichiers via l'interface Web à partir de la machine distante. Il affiche un code de données signalé comme étant en service. Ont ouvert tous les ports TCP dans la sécurité de 0 à 60000 (!), Donc je ne pense pas que ce soit ça.

Je reçois l'erreur

Java.io.IOException: File /user/ubuntu/pies could only be replicated to 0 nodes, instead of 1
at org.Apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.Java:1448)
at org.Apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.Java:690)
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.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.Java:342)
at org.Apache.hadoop.ipc.Server$Handler$1.run(Server.Java:1350)
at org.Apache.hadoop.ipc.Server$Handler$1.run(Server.Java:1346)
at Java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.Java:396)
at org.Apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.Java:742)
at org.Apache.hadoop.ipc.Server$Handler.run(Server.Java:1344)

at org.Apache.hadoop.ipc.Client.call(Client.Java:905)
at org.Apache.hadoop.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.Java:198)
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.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.Java:928)
at org.Apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.Java:811)
at org.Apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.Java:427)

log namenode donne juste la même erreur. D'autres ne semblent avoir rien d'intéressant

Des idées?

À votre santé

67
Steve

ATTENTION: Ce qui suit détruira TOUTES les données sur HDFS. N'exécutez pas les étapes de cette réponse à moins que vous ne vous préoccupiez pas de détruire les données existantes !!

Vous devriez faire ceci:

  1. arrêter tous les services hadoop
  2. supprimer les répertoires dfs/name et dfs/data
  3. hdfs namenode -format Réponse avec un Y majuscule
  4. commencer les services hadoop

Vérifiez également l’espace disque de votre système et assurez-vous que les journaux ne vous en avertissent pas.

74
buzypi

C'est votre problème - le client ne peut pas communiquer avec le code de données. Parce que l'adresse IP que le client a reçue pour le code de données est une adresse IP interne et non une adresse IP publique. Regarde ça

http://www.hadoopinrealworld.com/could-only-be-replicated-to-0-nodes/

Regardez le code source de DFSClient $ DFSOutputStrem (Hadoop 1.2.1)

//
// Connect to first DataNode in the list.
//
success = createBlockOutputStream(nodes, clientName, false);

if (!success) {
  LOG.info("Abandoning " + block);
  namenode.abandonBlock(block, src, clientName);

  if (errorIndex < nodes.length) {
    LOG.info("Excluding datanode " + nodes[errorIndex]);
    excludedNodes.add(nodes[errorIndex]);
  }

  // Connection failed. Let's wait a little bit and retry
  retry = true;
}

La clé à comprendre ici est que Namenode ne fournit que la liste des Datanodes pour stocker les blocs. Namenode n'écrit pas les données dans les Datanodes. Le client a pour tâche d'écrire les données dans les Datanodes à l'aide de DFSOutputStream. Avant que toute écriture puisse commencer le code ci-dessus, assurez-vous que le client peut communiquer avec le ou les codes de données. Si la communication échoue avec le code de données, le code de données est ajouté aux noeuds exclus.

12
Jerry Ragland

Regardez ce qui suit:

En voyant cette exception (qui ne peut être répliquée que sur 0 nœud au lieu de 1), datanode n'est pas disponible pour Name Node.

Ce sont les cas suivants Data Node peut ne pas être disponible pour Name Node

  1. Data Node le disque est plein

  2. Data Node est occupé avec le rapport de blocage et l'analyse en bloc

  3. Si Taille du bloc est une valeur négative (dfs.block.size dans hdfs-site.xml)

  4. en cours d'écriture, le code de données principal est désactivé (toute fluctuation de n/w b/w nom Node et données Node machines))

  5. when ever nous ajoutons un morceau partiel et la synchronisation des appels pour les ajouts de morceaux partiels suivants, le client doit stocker les données précédentes dans la mémoire tampon.

Par exemple, après avoir ajouté "a", j’ai appelé sync et lorsque j’essaie, le tampon devrait avoir "ab"

Et côté serveur, lorsque le bloc n’est pas multiple de 512, il essaiera de faire une comparaison Crc pour les données présentes dans le fichier bloc ainsi que crc dans le métafichier. Mais lors de la construction de crc pour les données présentes dans le bloc, il est toujours en train de comparer jusqu’à l’offset initial.

Référence: http://www.mail-archive.com/[email protected]/msg01374.html

9
Ajay Lulia

J'ai eu un problème similaire lors de la configuration d'un cluster à un seul nœud. J'ai réalisé que je n'avais configuré aucun code de données. J'ai ajouté mon nom d'hôte à conf/slaves, puis ça a fonctionné. J'espère que ça aide.

8
michaelliu

Je vais essayer de décrire ma configuration et ma solution: Ma configuration: RHEL 7, hadoop-2.7.3

J'ai essayé de configurer Opération autonome d'abord, puis Opération pseudo-distribuée où ce dernier a échoué avec le même problème.

Bien que, quand je commence hadoop avec:

sbin/start-dfs.sh

J'ai eu ce qui suit:

Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-datanode-localhost.localdomain.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-secondarynamenode-localhost.localdomain.out

ce qui semble prometteur (datanode de départ .. sans échec) - mais le datanode n’existait pas vraiment.

Une autre indication était de voir qu'il n'y avait pas de code de données en opération (l'instantané ci-dessous indique un état de fonctionnement fixe):

enter image description here

J'ai résolu ce problème en faisant:

rm -rf /tmp/hadoop-<user>/dfs/name
rm -rf /tmp/hadoop-<user>/dfs/data

et recommencez ensuite:

sbin/start-dfs.sh
...
4
ItayB

J'ai eu la même erreur sur MacOS X 10.7 (hadoop-0.20.2-cdh3u0) en raison du nœud de données ne démarre pas.
start-all.sh produit la sortie suivante:

starting namenode, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
localhost: ssh: connect to Host localhost port 22: Connection refused
localhost: ssh: connect to Host localhost port 22: Connection refused
starting jobtracker, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
localhost: ssh: connect to Host localhost port 22: Connection refused

Après avoir activé la connexion SSH via System Preferences -> Sharing -> Remote Login ça a commencé à marcher.
start-all.sh sortie modifiée comme suit (notez le début du code de données):

starting namenode, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting datanode, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting secondarynamenode, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
starting jobtracker, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting tasktracker, logging to /Java/hadoop-0.20.2-cdh3u0/logs/...
3
Aleksey Korolev

Cela me prend une semaine pour comprendre le problème dans ma situation.

Lorsque le client (votre programme) demande à l'opération nameNode pour l'opération de données, le nameNode sélectionne un dataNode et le dirige vers le client en lui donnant l'adresse IP du dataNode.

Mais, lorsque l'hôte dataNode est configuré pour avoir plusieurs adresses IP et que nameNode vous donne celui auquel votre client ne peut pas accéder, le client ajoutera le dataNode à exclure de la liste et demandera un nouveau nom à nameNode, et enfin tous les dataNode. sont exclus, vous obtenez cette erreur.

Vérifiez donc les paramètres IP du nœud avant de tout essayer !!!

2
igonejack

Et je pense que vous devriez vous assurer que tous les codes de données sont activés lorsque vous copiez sur dfs. Dans certains cas, cela prend un certain temps. Je pense que c’est la raison pour laquelle la solution "vérification de l’état de santé" fonctionne, car vous accédez à la page Web relative à l’état de santé et attendez tout, mes cinq sous.

2
flinter

Si tous les nœuds de données sont en cours d'exécution, il vous reste une dernière chose à vérifier pour que HDFS dispose de suffisamment d'espace pour vos données. Je peux télécharger un petit fichier mais je n'ai pas réussi à télécharger un gros fichier (30 Go) sur HDFS. 'bin/hdfs dfsadmin -report' indique que chaque nœud de données ne dispose que de quelques Go.

1
user3282611

J'ai aussi eu le même problème/erreur. Le problème est survenu en premier lieu lorsque j'ai formaté en utilisant hadoop namenode -format

Ainsi, après avoir redémarré hadoop avec start-all.sh, le nœud de données n’a pas démarré ni initialisé. Vous pouvez vérifier cela en utilisant jps, il devrait y avoir cinq entrées. Si datanode est manquant, alors vous pouvez faire ceci:

Le processus Datanode n'est pas exécuté dans Hadoop

J'espère que cela t'aides.

0
Swaroop Pydisetty

Ne formatez pas le noeud de nom immédiatement. Essayez stop-all.sh et démarrez-le avec start-all.sh. Si le problème persiste, optez pour le formatage du nœud de nom.

0
Aravind Kalyan

Je me rends compte que je suis un peu en retard pour la fête, mais je voulais poster ceci pour les futurs visiteurs de cette page. J'avais un problème très similaire lorsque je copiais des fichiers de fichiers locaux vers des fichiers hdfs et que le reformatage du nom de code ne résolvait pas le problème pour moi. Il s'est avéré que mes journaux de namenode avaient le message d'erreur suivant:

2012-07-11 03:55:43,479 ERROR org.Apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(127.0.0.1:50010, storageID=DS-920118459-192.168.3.229-50010-1341506209533, infoPort=50075, ipcPort=50020):DataXceiver Java.io.IOException: Too many open files
        at Java.io.UnixFileSystem.createFileExclusively(Native Method)
        at Java.io.File.createNewFile(File.Java:883)
        at org.Apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.Java:491)
        at org.Apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.Java:462)
        at org.Apache.hadoop.hdfs.server.datanode.FSDataset.createTmpFile(FSDataset.Java:1628)
        at org.Apache.hadoop.hdfs.server.datanode.FSDataset.writeToBlock(FSDataset.Java:1514)
        at org.Apache.hadoop.hdfs.server.datanode.BlockReceiver.<init>(BlockReceiver.Java:113)
        at org.Apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.Java:381)
        at org.Apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.Java:171)

Apparemment, il s’agit d’un problème relativement courant sur les clusters hadoop et Cloudera le suggère en augmentant les limites nofile et epoll (si elles sont sur le noyau 2.6.27) pour le contourner. La difficulté réside dans le fait que la définition des limites nofile et epoll dépend fortement du système. Mon Le serveur Ubuntu 10.04 nécessitait une configuration légèrement différente pour que cela fonctionne correctement, vous devrez peut-être modifier votre approche en conséquence.

0
dino

Le reformatage du nœud n'est pas la solution. Vous devrez éditer le fichier start-all.sh. Démarrez le fichier DFS, attendez qu'il démarre complètement, puis lancez mapred. Vous pouvez le faire en dormant. Attendre 1 seconde a fonctionné pour moi. Voir la solution complète ici http://sonalgoyal.blogspot.com/2009/06/hadoop-on-ubuntu.html .

0
TheHat

Avez-vous essayé la recommandation depuis le wiki http://wiki.Apache.org/hadoop/HowToSetupYourDevelopmentEnvironment ?

Je recevais cette erreur en mettant des données dans le DFS. La solution est étrange et probablement incohérente: j'ai effacé toutes les données temporaires avec le nom de code, reformaté le nom de code, tout démarré et visité la page de santé de mon "cluster" (http: // your_Host: 50070/dfshealth.jsp). La dernière étape, visiter la page de santé, est le seul moyen de contourner l’erreur. Une fois que j'ai visité la page, mettre et récupérer des fichiers dans le DFS fonctionne très bien!

0
Joe Stein

Suivez les étapes ci-dessous:
1. Arrêtez dfs et yarn.
2. Supprimez les répertoires datanode et namenode comme spécifié dans le core-site.xml.
3. Démarrez dfs et yarn comme suit:

start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
0
KayV