Hadoop Streaming程序子进程失败,代码为139
我在亚马逊的EMR上运行一个用Python写的Hadoop流处理程序,但遇到了一些问题。程序在测试几千条记录时运行得很好,我在本地测试了很多次,一切都很顺利。但是,当我把数据量增加到完整的数据集(大约8GB的URL需要请求)时,就出现了以下情况:
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)
查看用户日志和错误输出,我没有发现程序运行有什么异常。我在Python程序中有很多调试日志,所有看起来都很好。我需要提到的是,这个程序是一个使用Python多进程进行HTTP请求的程序,可能和这个有关:查看机器的统计信息时,内存使用量似乎不断增加。
这是我的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>
我不太确定从哪里开始调试这个问题,我看到退出状态139基本上是一个段错误(segfault)。我并没有进行任何低级的内存操作,所以这让我感到意外。你们有什么建议可以让我开始吗?这可能是我Python程序中的内存泄漏吗?还有其他日志我可以查看吗?有没有我遗漏的Hadoop配置值?
1 个回答
4
ErrNo 139
的意思是,Hadoop认为你的脚本卡住了,因为它很长时间没有产生任何输出。
确保你的映射子程序能够经常产生输出,
或者你可以调整Hadoop的设置,给映射输出设定一个超时时间。