为什么我在 Amazon EMR 中的 Spark 任务失败?
上次更新日期:2022 年 12 月 23 日
我在 Amazon EMR 中的 Apache Spark 任务失败。
解决方法
应用程序故障
ERROR ShuffleBlockFetcherIterator: Failed to get block(s) from ip-192-168-14-250.us-east-2.compute.internal:7337(错误 ShuffleBlockFetcherIterator:未能从 ip-192-168-14-250.us-east-2.compute.internal:7337 中获取块)
org.apache.spark.network .client.ChunkFetchFailureException: Failure while fetching StreamChunkId[streamId=842490577174,chunkIndex=0]: java.lang.RuntimeException: Executor is not registered (appId=application_1622819239076_0367, execId=661)(org.apache.spark.network .client.ChunkFetchFailureException:提取 StreamChunkId[streamId=842490577174 时出现故障,chunkIndex=0]: java.lang.RuntimeException:执行器未注册 (appId=application_1622819239076_0367, execId=661))
当 Amazon EMR 中的执行器 Worker 节点处于运行不良状态时,可能会出现此问题。当 Worker 节点的磁盘利用率超过使用阈值的 90% 时,YARN NodeManager 运行情况服务会将此节点报告为 UNHEALTHY(运行不良)。运行不良的节点包含在 Amazon EMR 拒绝列表中。此外,未向这些节点分配 YARN 容器。
要排查此问题,请执行以下操作:
- 查看 EMR 集群主节点的资源管理器日志中是否存在运行不良的 Worker 节点。若要了解更多信息,请参阅如何解决 Amazon EMR 上 Spark 中的“从节点丢失”错误?,并查阅磁盘利用率高部分。
- 验证受影响的节点的磁盘空间使用情况,检查占用磁盘空间的文件,并执行数据恢复,以便让节点恢复正常状态。有关更多信息,请参阅为什么我的 Amazon EMR 集群中的核心节点磁盘空间不足?
ERROR [Executor task launch worker for task 631836] o.a.s.e.Executor:Exception in task 24.0 in stage 13028.0 (TID 631836) java.util.NoSuchElementException: None.get(ERROR [任务 631836 的执行器任务启动 Worker] o.a.s.e.执行器:阶段 13028.0 中的任务 24.0 (TID 631836) java.util.NoSuchElementException: None.get)
当应用程序代码和 SparkContext 初始化出现问题时,会发生此错误。
确保同一会话中没有多个 SparkContext 任务处于活动状态。如果是 Java 虚拟机(JVM),则一次只能有一个活动 SparkContext。如果要初始化其他 SparkContext,则在创建新任务之前必须先停止活动任务。
根据要求终止容器。退出代码为 137
当 YARN 容器中的任务超过为该容器分配的物理内存时,就会出现此异常。这通常发生在随机分区、分区大小不一致或执行器内核数量过多时。
查看 Spark 驱动程序日志中的错误详细信息,以确定错误原因。有关更多信息,请参阅如何访问 Amazon EMR 集群上的 Spark 驱动程序日志?
以下是驱动程序日志中的示例错误:
ERROR YarnScheduler: Lost executor 19 on ip-10-109-xx-xxx.aws.com : Container from a bad node: container_1658329343444_0018_01_000020 on host: ip-10-109-xx-xxx.aws.com . Exit status: 137.Diagnostics:
Container killed on request. Exit code is 137
Container exited with a non-zero exit code 137.
Killed by external signal
Executor container 'container_1658329343444_0018_01_000020' was killed with exit code 137. To understand the root cause, you can analyze executor container log.
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
# Executing /bin/sh -c "kill -9 23573"...
前面的错误堆栈跟踪表明执行器上没有足够的可用内存来继续处理数据。此错误可能发生在不同的任务阶段,包括窄变换和宽变换。
要解决此问题,请执行下列操作之一:
- 增加执行器内存。
注意:执行器内存包括执行任务所需的内存以及开销内存。它们的总和不得大于 JVM 的大小和 YARN 最大容器大小。 - 添加更多 Spark 分区。
- 增加随机分区的数量。
- 减少执行程序内核的数量
有关更多信息,请参阅如何解决 Amazon EMR 上 Spark 中的“Container killed on request.Exit code is 137”(根据要求停止容器。退出代码为 137)错误?
Spark 任务处于挂起状态并且未完成
Spark 任务可能由于多种原因而卡滞。例如,如果 Spark 驱动程序(应用程序主节点)进程受影响或执行器容器丢失。
这通常发生在磁盘空间利用率高或者在集群节点中使用竞价型实例且竞价型实例终止的情况下。有关更多信息,请参阅如何解决 Amazon EMR 上的 Spark 中的 ExecutorLostFailure“Slave lost”(从节点丢失)错误?
要排查此问题,请执行以下操作:
- 查看 Spark 应用程序主节点或驱动程序日志中是否存在任何异常。
- 验证 YARN 节点列表中是否存在任何运行不良的节点。当核心节点的磁盘利用率超过利用率阈值时,YARN 节点管理器运行状况服务会将此节点报告为 UNHEALTHY(运行不良)。运行不良的节点包含在 Amazon EMR 拒绝列表中。此外,未向这些节点分配 YARN 容器。
- 监控磁盘空间利用率,并配置 Amazon Elastic Block Store(Amazon EBS)卷,使 EMR 集群 Worker 节点的利用率保持在 90% 以下。
WARN Executor: Issue communicating with driver in heartbeater org.apache.spark.rpc.RpcTimeoutException: Futures timed out after [10000 milliseconds].This timeout is controlled by spark.executor.heartbeatInterval
Spark 执行器将以 spark.executor.heartbeatInterval 属性指定的间隔向 Spark 驱动程序发送心跳信号。在长时间的垃圾回收暂停期间,执行器可能不会发送心跳信号。驱动程序将会终止未能在超过指定值的范围内发送心跳信号的执行器。
TimeoutException
当执行器受到内存限制或在处理数据时面临 OOM 问题时,就会出现超时异常。这也会影响垃圾回收进程,从而导致进一步的延迟。
使用以下方法之一来解决心跳超时错误:
- 增加执行器内存。此外,对数据进行重新分区,具体取决于应用程序进程。
- 调整垃圾回收。
- 加大 spark.executor.heartbeatInterval 的间隔。
- 指定更长的 spark.network.timeout 期限。
ExecutorLostFailure "Exit status: -100.Diagnostics: Container released on a *lost* node
当核心节点或任务节点因磁盘空间利用率高而被终止时,将会发生此错误。此外,当节点因 CPU 利用率长时间较高或可用内存不足而变得无响应时,也会发生此错误。有关故障排查步骤,请参阅如何解决 Amazon EMR 中的“Exit status: -100.Diagnostics: Container released on a *lost* node”(退出状态:-100。诊断:已在“丢失”节点上发布容器)错误?
注意:当您在集群节点中使用竞价型实例并且竞价型实例终止时,也可能会发生此错误。在此情况下,EMR 集群将会预置按需型实例,以替换终止的竞价型实例。这意味着应用程序可能会自行恢复。有关更多信息,请参阅 Spark 对 Amazon EMR 的弹性和韧性的增强。
executor 38: java.sql.SQLException (Network error IOException: Connection timed out (Connection timed out)(执行器 38:java.sql.SQLException(网络错误 IOException:连接超时(连接超时))
此问题与在读取或写入数据时与 SQL 数据库通信以建立套接字连接相关。验证数据库主机是否可以在端口 1433 上接收来自 EMR 集群安全组的传入连接。
此外,查看为 SQL 数据库配置的最大并行数据库连接数和数据库实例类的内存分配情况。数据库连接也会占用内存。如果利用率很高,则检查数据库配置和允许的连接数。有关更多信息,请参阅最大数据库连接数。
Amazon S3 异常
HTTP 503“Slow Down”(运行缓慢)
当您超过前缀中的 Amazon Simple Storage Service(Amazon S3)请求速率时,会发生 HTTP 503 异常。503 异常并不总是意味着会发生故障。但是,缓解问题可以提升应用程序的性能。
有关更多信息,请参阅为什么 Amazon EMR 上的 Spark 或 Hive 任务失败并显示 HTTP 503 “Slow Down”(运行缓慢)AmazonS3Exception 错误?
HTTP 403“Access Denied”(访问被拒绝)
HTTP 403 错误是因凭证不正确或无效导致的,例如:
- 应用程序代码中指定的凭证或角色。
- 附加到 Amazon EC2 实例配置文件角色的策略。
- Amazon S3 的 Amazon Virtual Private Cloud(Amazon VPC)端点。
- S3 源和目标存储桶策略
要解决 403 错误,请确保相关的 AWS Identity and Access Management(IAM)角色或策略允许访问 Amazon S3。有关更多信息,请参阅为什么我的 Amazon EMR 应用程序失败,并显示 HTTP 403“Access Denied”(访问被拒绝)AmazonS3Exception 错误
HTTP 404“Not Found”(未找到)
HTTP 404 错误表示应用程序预期会在 S3 中找到对象,但在发出请求时,未找到该对象。常见原因包括:
- S3 路径不正确(例如,路径键入错误)。
- 该文件已被应用程序之外的进程移动或删除。
- 导致最终一致性问题的操作,例如覆盖。
有关更多信息,请参阅为什么我的 Amazon EMR 应用程序失败,并显示 HTTP 404“Not Found”(未找打)AmazonS3Exception 错误