2010-12-09 27 views
1

Tout d'abord, je suis un débutant de Hadoop.EOFException lancée par un programme de tuyaux Hadoop

J'ai un petit programme Hadoop pipes qui lance java.io.EOFException. Le programme prend en entrée un petit fichier texte et utilise hadoop.pipes.java.recordreader et hadoop.pipes.java.recordwriter. L'entrée est très simple comme:

1 262144 42.8084 15.9157 4.1324 0.06 0.1 

Cependant, Hadoop lèveront une EOFException, que je ne vois pas la raison. Ci-dessous la trace de la pile :

10/12/08 23:04:04 INFO mapred.JobClient: Running job: job_201012081252_0016 
10/12/08 23:04:05 INFO mapred.JobClient: map 0% reduce 0% 
10/12/08 23:04:16 INFO mapred.JobClient: Task Id : attempt_201012081252_0016_m_000000_0, Status : FAILED 
java.io.IOException: pipe child exception 
    at org.apache.hadoop.mapred.pipes.Application.abort(Application.java:151) 
    at org.apache.hadoop.mapred.pipes.PipesMapRunner.run(PipesMapRunner.java:101) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307) 
    at org.apache.hadoop.mapred.Child.main(Child.java:170) 
Caused by: java.io.EOFException 
    at java.io.DataInputStream.readByte(DataInputStream.java:267) 
    at org.apache.hadoop.io.WritableUtils.readVLong(WritableUtils.java:298) 
    at org.apache.hadoop.io.WritableUtils.readVInt(WritableUtils.java:319) 
    at org.apache.hadoop.mapred.pipes.BinaryProtocol$UplinkReaderThread.run(BinaryProtocol.java:114) 

BTW, j'ai couru ceci sur un mode entièrement distribué (un cluster avec 3 nœuds de travail).

Toute aide est appréciée! Merci

Répondre

0

Cette pile indique généralement l'épuisement des descripteurs de fichiers disponibles dans vos machines de travail. Ceci est extrêmement commun, documenté de façon éparse, et précisément pourquoi j'ai deux relatedquestions sur le sujet.

Si vous avez un accès root sur toutes les machines, vous devriez envisager d'augmenter la limite de descripteur de fichier pour votre utilisateur Hadoop en éditant /etc/sysctl.conf:

(Add) fs.file-max = 4096 

Ou émission:

ulimit -Sn 4096 
ulimit -Hn 4096 

Ad Infinitum . Informations générales pour augmenter cette limite est available here.

Cependant, du point de vue de la planification à long terme, cette stratégie est quelque peu fausse. Si vous trouvez plus d'informations sur le problème, peut-être vous pouvez help me help you help us all? [Merci, GLaDOS. -ed]

(Edit: Voir le commentaire qui suit.)

+0

Merci! Malheureusement, augmenter la limite n'a pas fonctionné pour moi. D'autres idées? En attendant, je pense que je vais essayer de poster cette question sur la liste de diffusion hadoop – peng

+0

Je serais intéressé par la réponse. Une partie de la raison pour laquelle cette stratégie est fausse est que le framework Hadoop n'invoque pas ses hypothèses WRT d'utilisation des descripteurs de fichiers. Spécifier un nombre arbitrairement élevé ne fonctionnera évidemment pas dans les cas où le système dépasse la limite. Vous pouvez également envisager de vérifier la limite du descripteur de fichier logiciel sur votre système, comme Hadoop semble le respecter. – MrGomez

+0

Le problème a été résolu. C'était totalement mon mal. Il y avait une erreur de segmentation dans mon programme de tuyaux, qui a déclenché l'exception. Cependant, je pense que l'Exception semble mystérieuse pour les débutants comme moi. Peut-être que les gens de Hadoop peuvent polir le rapport d'erreur un peu? – peng

1

Les leçons apprises: par tous les moyens, essayez de vous assurer qu'il n'y a pas bug dans votre propre programme.