python - Hadoop Streaming 程序子进程失败,代码为 139

标签 python hadoop memory-leaks multiprocessing emr

我在 Amazon EMR 上运行 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 基本上是一个段错误。我没有做任何低级内存操作,所以这很令人惊讶。关于从哪里开始的任何想法?这可能是我的 Python 程序中的内存泄漏吗?我可以查看任何其他日志吗?我错过了任何 Hadoop 配置值吗?

最佳答案

ErrNo 139 表示 Hadoop 认为您的脚本卡住了,因为它长时间没有输出任何内容。

请确保您的 map 子例程足够频繁地提供输出,

或者您可以调整 Hadoop 并为 map 输出设置超时。

关于python - Hadoop Streaming 程序子进程失败,代码为 139,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23621889/

相关文章:

java - 静态数组列表会丢失其中包含的内容吗?

c# - 用于发送电子邮件的 C# Windows 服务中的内存泄漏

python - 如何将非结构化数据插入/附加到 bigquery 表

python - 添加数字,然后添加元组以作为元组列出,但它会删除外部元组

java - 无法从 Hadoop 中的空字符串创建路径

hadoop - 将EBCDIC转换为ASCII文件格式-SerDe用于配置单元。如何克服EBCDIC文件中的分隔符问题

iphone - 如何解决这个内存泄漏?

python - 运行 Django 测试时如何查看标准输出?

python - 如果requests不能获取网页的动态内容,bs4能获取到吗?

hadoop - Hbase CopyTable错误