Я запускаю потоковую программу Hadoop (написанную на Python) через Amazon EMR, у которой возникают некоторые проблемы. Все работает нормально, когда я провожу тесты с несколькими тысячами записей и много раз тестировал программу локально, все, кажется, идет хорошо. Но когда я увеличиваю до полного набора данных (~ 8 ГБ 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)
Просматривая журналы пользователей и stderr, я не вижу ничего странного в том, как работает моя программа, в моей программе на Python ведется значительная часть журнала отладки, и в программе на Python все выглядит хорошо. Я должен упомянуть, что программа представляет собой многопроцессорную программу HTTP-запросов Python и, возможно, связана с ней: при просмотре статистики для машины с течением времени использование памяти, похоже, увеличивается на неопределенный срок.
Вот моя конфигурация 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, которые я пропустил?