Сбой подпроцесса программы Hadoop Streaming с кодом 139

Я запускаю потоковую программу 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, которые я пропустил?


person acnutch    schedule 13.05.2014    source источник


Ответы (1)


ErrNo 139 означает, что Hadoop решил, что ваш скрипт завис, потому что он долгое время не выдавал никаких результатов.

Убедитесь, что подпрограмма map выдает вывод достаточно часто,

или вы можете настроить Hadoop и установить время ожидания для вывода карты.

person mr0re1    schedule 16.06.2014