2014-05-13 1 views
1

J'utilise un programme de diffusion Hadoop (écrit en Python) sur Amazon EMR qui rencontre des problèmes. Tout se passe bien quand je fais des tests avec quelques milliers de disques et j'ai testé le programme localement une tonne de fois, tout semble aller bien. Mais quand j'augmente à un ensemble de données complète (~ 8 Go d'URL que je dois à la demande) Je reçois le texte suivant:Le sous-processus du programme Hadoop Streaming a échoué avec le code 139

java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 139 
    at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:372) 
    at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:586) 
    at org.apache.hadoop.streaming.PipeMapper.map(PipeMapper.java:125) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    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:1132) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 
java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 139 
    at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:372) 
    at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:586) 
    at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:136) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    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:1132) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 

Passant en revue les userlogs et stderr, je ne vois rien d'étrange comment fonctionne mon programme, je une bonne partie de la journalisation de débogage se passe dans mon programme Python, et tout semble bien dans le programme Python. Je dois mentionner que le programme est un programme de requête HTTP multiprocesseur Python et peut-être lié: en passant en revue les statistiques de la machine au fil du temps, l'utilisation de la mémoire semble augmenter indéfiniment.

Voici ma configuration Hadoop:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
<configuration> 
    <property><name>mapred.output.committer.class</name><value>org.apache.hadoop.mapred.DirectFileOutputCommitter</value></property> 
    <property><name>mapred.reduce.tasks.speculative.execution</name><value>true</value></property> 
    <property><name>mapred.tasktracker.map.tasks.maximum</name><value>2</value></property> 
    <property><name>mapred.task.tracker.http.address</name><value>0.0.0.0:9103</value></property> 
    <property><name>mapred.map.tasks.speculative.execution</name><value>true</value></property> 
    <property><name>mapred.userlog.retain.hours</name><value>48</value></property> 
    <property><name>mapred.job.reuse.jvm.num.tasks</name><value>20</value></property> 
    <property><name>io.sort.factor</name><value>48</value></property> 
    <property><name>mapred.reduce.parallel.copies</name><value>20</value></property> 
    <property><name>mapred.reduce.tasks</name><value>84</value></property> 
    <property><name>tasktracker.http.threads</name><value>20</value></property> 
    <property><name>hadoop.job.history.user.location</name><value>none</value></property> 
    <property><name>mapred.job.tracker.handler.count</name><value>64</value></property> 
    <property><name>mapred.map.output.compression.codec</name><value>org.apache.hadoop.io.compress.SnappyCodec</value></property> 
    <property><name>mapred.output.direct.NativeS3FileSystem</name><value>true</value></property> 
    <property><name>mapred.reduce.tasksperslot</name><value>1.75</value></property> 
    <property><name>mapred.tasktracker.reduce.tasks.maximum</name><value>1</value></property> 
    <property><name>mapred.compress.map.output</name><value>true</value></property> 
    <property><name>mapred.output.compression.codec</name><value>org.apache.hadoop.io.compress.GzipCodec</value></property> 
    <property><name>mapred.job.tracker.http.address</name><value>0.0.0.0:9100</value></property> 
    <property><name>mapred.local.dir</name><value>/mnt/var/lib/hadoop/mapred</value></property> 
    <property><name>mapred.job.tracker</name><value>172.31.7.89:9001</value></property> 
    <property><name>io.sort.mb</name><value>200</value></property> 
    <property><name>mapred.map.tasks</name><value>7000</value></property> 
    <property><name>mapred.max.map.failures.percent</name><value>10</value></property> 
</configuration> 

Je ne suis pas tout à fait sûr où commencer le débogage celui-ci, je lis que l'état de sortie 139 est fondamentalement une erreur de segmentation. Je ne fais aucune manipulation de mémoire de bas niveau, donc c'est surprenant. Des idées sur où commencer ici? Cela pourrait-il être une fuite de mémoire dans mon programme Python? D'autres journaux que je peux regarder? Toutes les valeurs de configuration Hadoop que j'ai manqué?

Répondre

4

ErrNo 139 signifie que Hadoop a décidé que votre script était bloqué car il n'a généré aucune sortie depuis longtemps.

Assurez-vous que vous associez sous-programme fournit une sortie assez souvent,

ou vous pouvez Hadoop tune et le délai fixé pour la sortie de la carte.

Questions connexes