11

我在 Amazon Elastic MapReduce 上运行大量(超过 100 个节点)的 mapreduce 作业。

在 reduce 阶段,已经完成的 map 任务不断失败

Map output lost, rescheduling: getMapOutput(attempt_201204182047_0053_m_001053_0,299) failed :
java.io.IOException: Error Reading IndexFile
    at org.apache.hadoop.mapred.IndexCache.readIndexFileToCache(IndexCache.java:113)
    at org.apache.hadoop.mapred.IndexCache.getIndexInformation(IndexCache.java:66)
    at org.apache.hadoop.mapred.TaskTracker$MapOutputServlet.doGet(TaskTracker.java:3810)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1221)
    at org.apache.hadoop.http.HttpServer$QuotingInputFilter.doFilter(HttpServer.java:835)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readFully(DataInputStream.java:180)
    at java.io.DataInputStream.readLong(DataInputStream.java:399)
    at org.apache.hadoop.mapred.SpillRecord.<init>(SpillRecord.java:74)
    at org.apache.hadoop.mapred.SpillRecord.<init>(SpillRecord.java:54)
    at org.apache.hadoop.mapred.IndexCache.readIndexFileToCache(IndexCache.java:109)
    ... 23 more

发生这种情况的映射器的比例足够少,我不介意,除非它发生时,reducers 都会暂停并等待 1 个映射任务重新运行,因此整个作业每次都会暂停 1-5 分钟.

我认为这与此错误有关-> https://issues.apache.org/jira/browse/MAPREDUCE-2980 有谁知道如何在不发生这种情况的情况下运行 EMR 作业?

编辑:如果有帮助,这里有更多信息。输入格式为SequenceFileInputFormat。输出格式是SequenceFileOutputFormat. 键值对是用户定义的(值很大并且实现Configurable)。没有Combiner,只有MapperReducer。我正在对输入和输出使用块压缩(并且中间 kv 对也正在进行记录压缩。这是 EMR 的默认设置)。SnappyCodec我相信编解码器是默认的。最后,它实际上是一系列按顺序运行的作业,每个作业都使用前一个作业的输出作为下一个作业的输入。前几个工作很小并且运行良好。只有当工作开始变得非常大时,才会发生这种情况。

4

1 回答 1

0

自从提出这个问题以来,已经有了一些发展。这个问题在 jira MAPREDUCE-2389中有更详细的讨论。

此 jira 以及此处或此处链接的任何其他 jira 的一个关键部分是该问题与 jetty 版本相关联。当时不可能去更新的码头版本。

到目前为止,所引用的版本早已被弃用,因此每个人都应该完全解决这种情况。

于 2020-08-01T20:53:22.577 回答