6

我有一个 EMR 流作业 (Python),它通常工作正常(例如 10 台机器处理 200 个输入)。但是,当我针对大型数据集(12 台机器处理总共 6000 个输入,每个输入大约 20 秒)运行它时,经过 2.5 小时的运算后,我收到以下错误:

java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 143
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:135)
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:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1132)
at org.apache.hadoop.mapred.Child.main(Child.java:249)

如果我没看错,则子进程失败并显示代码 143,因为有人向流式作业发送了 SIGTERM 信号。

我的理解正确吗?如果是这样:EMR 基础设施何时会发送 SIGTERM?

4

2 回答 2

10

我弄清楚发生了什么,所以如果其他人遇到类似问题,这里有一些信息。

我的关键是查看“jobtracker”日志。这些位于 S3 上任务的日志/文件夹中,位于:

<logs folder>/daemons/<id of node running jobtracker>/hadoop-hadoop-jobtracker-XXX.log.

有以下类型的多行:

2012-08-21 08:07:13,830 INFO org.apache.hadoop.mapred.TaskInProgress 
  (IPC Server handler 29 on 9001): Error from attempt_201208210612_0001_m_000015_0: 
  Task attempt_201208210612_0001_m_000015_0 failed to report status 
  for 601 seconds. Killing!

所以我的代码超时了,它被杀死了(它超过了 10 分钟的任务超时)。10 分钟我没有进行任何 I/O,这当然是意料之外的(我通常会每 20 秒进行一次 I/O)。

然后我发现了这篇文章:

http://devblog.factual.com/practical-hadoop-streaming-dealing-with-brittle-code

“在我们的一个科学项目中,我们有一些 Hadoop Streaming 作业在 ruby​​ 上运行并依赖 libxml 来解析文档。这造成了一场完美的糟糕风暴——网络上充满了非常糟糕的 html,而 libxml 偶尔会陷入无限循环或彻底的段错误。在某些文件上,它总是段错误。

它钉了它。我一定遇到了这些“libxml 进入无限循环”的情况之一(我大量使用 libxml —— 仅使用 Python,而不是 Ruby)。

对我来说最后一步是触发跳过模式(此处的说明:使用 boto 设置 hadoop 参数?)。

于 2012-08-22T11:21:26.687 回答
1

我遇到了来自 Amazon EMR 的输出(“子进程失败,代码 143”)。我的流式作业是使用 PHP curl 将数据发送到没有 MapReduce 作业服务器属于其安全组的服务器。因此减速器超时并被杀死。理想情况下,我想将我的工作添加到同一个安全组,但我选择在我的 API 前面简单地添加一个 URL 安全令牌参数。

于 2013-05-06T20:48:58.967 回答