HDFS LeaseExpiredException
J'ai une application qui est censé copier sur un grand nombre de fichiers à partir d'une source comme le S3 dans HDFS. L'application utilise apache distcp l'intérieur et des copies de chaque fichier à partir de la source via le streaming dans HDFS.
Chaque fichier est d'environ ~1 GO, a 1K colonnes de chaînes de caractères.
Lorsque je copie sur toutes les colonnes, l'écriture échoue avec l'erreur suivante :-
2014-05-20 23:57:35,939 WARN org.apache.hadoop.hdfs.DFSClient: Error Recovery for block null bad datanode[0] nodes == null
2014-05-20 23:57:35,939 WARN org.apache.hadoop.hdfs.DFSClient: Could not get block locations. Source file "/xyz/2014/01/02/control-Jan-2014-14.gz" - Aborting...
2014-05-20 23:57:54,369 ERROR abc.mapred.distcp.DistcpRunnable: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: No lease on /xyz/2014/01/02/control-Jan-2014-14.gz File does not exist. [Lease. Holder: DFSClient_attempt_201403272055_15994_m_000004_0_-1476619343_1, pendingcreates: 4]
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:1720)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:1711)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1619)
at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:736)
at sun.reflect.GeneratedMethodAccessor41.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:578)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1393)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1389)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1387)
Je crois que c'est dû à ça prend trop de temps pour écrire un fichier de grande taille à partir de la source dans HDFS. Quand j'ai modifier l'application pour copier uniquement s'établissait à 50 100 ou 200 colonnes, l'application s'exécute à la fin. L'Application échoue lorsque le nombre de colonnes copiées pour chaque ligne > 200.
Je n'ai pas de contrôle sur les fichiers source.
Je n'arrive pas a trouver quoi que ce soit autour de l'augmentation de l'expiration du bail.
Les Pointeurs ?
Après une minute lorsque le distcp a ouvert le flux avec le fichier source.
Situé à seulement une minute? Ne semble pas être à cause du temps nécessaire à la copie. J'ai eu quelquefois lorsque le fichier a été supprimé lors de la copie. Êtes-vous sûr que certains autres processus n'est pas de les supprimer?
Oui je suis assez sûr qu'aucun autre processus n'est la suppression des fichiers.
Veuillez noter qu'il n'y a aucune erreur lorsque je choisis d'écrire seulement jusqu'à 200 colonnes pour chaque ligne dans le fichier src lors de l'itération à travers l'inputStream par bufferedReader. Mais aussi et quand je vais au-delà de ce 200 nombre, il commence à cracher cette erreur.
OriginalL'auteur user1084874 | 2014-05-21
Vous devez vous connecter pour publier un commentaire.
Donc Enfin j'ai pu déterminer ce qui se passe. Donc, à partir de la source, S3, notre application a été télécharger des fichiers comme
/xyz/2014/01/week1/abc
/xyz/2014/01/week1/def
/xyz/2014/01/week2/abc
/xyz/2014/01/week2/def
/xyz/2014/01/week3/abc
/xyz/2014/01/week3/def
Avis le même nom de fichier à travers les différentes semaines. Et puis, chacun de ces fichiers ont été écrits dans HDFS à l'aide de la DFSClient. Donc, essentiellement, plusieurs cartographes étaient en train d'essayer d'écrire le "même fichier" (en raison du même nom de fichier, comme abc, def), même si les fichiers ont été fait différent. Le client doit obtenir un contrat de location avant d'écrire le fichier et que le client l'écriture de la première de "abc" le fichier a été de ne pas communiquer le contrat de location, alors que durant le processus d'écriture, l'autre client d'essayer d'écrire les autres "abc" le fichier a été de lancer la LeaseExpriedException avec la Location d'Incompatibilité de Message.
Mais cela n'explique pas pourquoi le client qui a d'abord repris le bail de location de l'écriture n'a pas réussi. Je veux dire que j'en droit d'attendre dans un tel cas, que les premiers écrivains de tous ces fichiers pour réussir. Une explication ?
Merci pour cette. Ce qui m'est arrivé lorsque l'ansible playbook a été inadvertedly la copie du même ensemble de fichiers sur plusieurs nœuds pour la même destination dans hdfs. Modification de l'opération à exécuter une fois résolu le problème.
OriginalL'auteur user1084874