我在amazonemr上运行一个hadoop流程序(用python编写),它有一些问题。当我用几千条记录做测试时,它运行得很好,而且我在本地测试了程序很多次,一切都很顺利。但是,当我增加到一个完整的数据集(需要请求大约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)
回顾userlogs和stderr,我看不出我的程序是如何运行的,我在python程序中进行了大量的调试日志记录,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条答案
按热度按时间goqiplq21#
ErrNo 139
这意味着hadoop决定您的脚本被卡住了,因为它很长一段时间没有输出任何内容。确保Map子例程提供足够多的输出,
或者可以调优hadoop并为map输出设置超时。