hadoop流程序子进程失败,代码为139

u5i3ibmn  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(701)

我在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配置值吗?

goqiplq2

goqiplq21#

ErrNo 139 这意味着hadoop决定您的脚本被卡住了,因为它很长一段时间没有输出任何内容。
确保Map子例程提供足够多的输出,
或者可以调优hadoop并为map输出设置超时。

相关问题