Exception fermée Hadoop FileSystem lors de l'exécution de BufferedReader.close ()
De l'intérieur de la Réduire méthode de configuration,je suis en train de fermer un BufferedReader
objet et obtenir un FileSystem
fermé exception. Il n'arrive pas tout le temps. C'est le morceau de code que j'ai utilisé pour créer le BufferedReader
.
String fileName = <some HDFS file path>
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path hdfsPath = new Path(filename);
FSDataInputStream in = fs.open(hdfsPath);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
J'ai lu le contenu de la bufferedReader et une fois que tous la lecture se fait, je le ferme.
C'est le morceau de code qui lit
String line;
while ((line = reader.readLine()) != null) {
//Do something
}
Ce le morceau de code qui ferme le lecteur.
if (bufferedReader != null) {
bufferedReader.close();
}
C'est la trace de la pile pour l'exception qui arrive quand je fais un bufferedReader.close()
.
I, [2013-11-18T04:56:51.601135 #25683] INFO -- :
attempt_201310111840_142285_r_000009_0:
org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:565)I, [2013-11-18T04:56:51.601168 #25683] INFO -- :
attempt_201310111840_142285_r_000009_0:
org.apache.hadoop.hdfs.DFSInputStream.fermer(DFSInputStream.java:522)I, [2013-11-18T04:56:51.601199 #25683] INFO -- :
attempt_201310111840_142285_r_000009_0:
java.io.FilterInputStream.fermer(FilterInputStream.java:155)I, [2013-11-18T04:56:51.601230 #25683] INFO -- :
attempt_201310111840_142285_r_000009_0:
soleil.nio.cs.StreamDecoder.implClose(StreamDecoder.java:358)I, [2013-11-18T04:56:51.601263 #25683] INFO -- :
attempt_201310111840_142285_r_000009_0:
soleil.nio.cs.StreamDecoder.fermer(StreamDecoder.java:173)I, [2013-11-18T04:56:51.601356 #25683] INFO -- :
attempt_201310111840_142285_r_000009_0:
java.io.InputStreamReader.fermer(InputStreamReader.java:182)I, [2013-11-18T04:56:51.601395 #25683] INFO -- :
attempt_201310111840_142285_r_000009_0:
java.io.BufferedReader.fermer(BufferedReader.java:497)
Je ne suis pas sûr pourquoi cette exception qui se passe. Ce n'est pas multithread et donc, je ne m'attends pas à une race condition d'aucune sorte. Pouvez-vous svp m'aider à comprendre.
Merci,
Venk
source d'informationauteur Venk K
Vous devez vous connecter pour publier un commentaire.
Il est un peu connu gotcha avec le système de fichiers hadoop API:
FileSystem.get
renvoie le même objet et pour chaque invocation avec le même système de fichiers. Donc, si on est fermé partout, elles sont toutes fermées. Tu pourrais en discuter le bien-fondé de cette décision, mais c'est la façon dont il est.Donc, si vous essayez de fermer votre BufferedReader, et il essaie de débusquer certaines données qu'il a mis en mémoire tampon, mais le flux sous-jacent est connecté à un système de fichiers qui est déjà fermé, vous obtiendrez cette erreur. Vérifiez votre code pour tous les autres lieux vous êtes à la clôture d'un système de fichiers de l'objet, et de regarder pour les conditions de course. Aussi, je crois Hadoop lui-même à un certain point de fermer le système de fichier, donc pour être sûr, vous ne devriez probablement être y accéder à partir de l'intérieur du Réducteur de l'installation, de réduire, ou des méthodes de nettoyage (ou de les configurer, de les réduire, et à proximité, en fonction de l'API que vous utilisez).
Vous devez utiliser
FileSystem.newInstance
pour éviter d'utiliser une connexion partagée (comme décrit par Joe K). Il vous donnera un unique, non-instance partagée.