Global outage event
If you're experiencing issues with your AWS services, then please refer to the AWS Health Dashboard. You can find the overall status of ongoing outages, the health of AWS services, and the latest updates from AWS engineers.
为什么我在 Amazon EMR 中的 Spark 作业失败了?
我想对 Amazon EMR 中失败的 Apache Spark 作业进行故障排除。
解决方法
应用程序故障
"Spark shuffle block fetch" 运行时异常
当 Amazon EMR 中的执行程序 Worker 节点处于运行状况不佳状态时,您可能会收到以下错误:
"ERROR ShuffleBlockFetcherIterator: Failed to get block(s) from 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)"
当 Worker 节点的磁盘利用率超过 90% 的利用率阈值时,YARN NodeManager 运行状况服务会将该节点标识为 UNHEALTHY(运行状况不佳)。Amazon EMR 会将运行状况不佳的节点加入拒绝列表,并且不会向这些节点分配 YARN 容器。
要对此问题进行故障排除,请执行以下操作:
- 查看 Amazon EMR 集群主节点中的资源管理器日志,查找运行状况不佳的 Worker 节点。有关详细信息,请参阅以下网页中的由于节点运行状况不佳,导致磁盘利用率较高部分:如何解决 Amazon EMR 上 Spark 中的 "ExecutorLostFailure: Slave lost" 错误?
- 检查受影响节点的磁盘空间利用率,查看耗用磁盘空间的文件,并执行数据恢复以使节点恢复到正常状态。有关更多信息,请参阅为什么我的 Amazon EMR 集群中的核心节点会耗尽磁盘空间?
"NoSuchElementException" 运行时异常
当应用程序代码和 SparkContext 初始化出现问题时,您可能会收到以下异常:
"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"
要解决此问题,请确保在同一个会话中没有多个 SparkContext 作业处于活动状态。同一时间只能有一个活动的 SparkContext。如果要初始化另一个 SparkContext,则必须先停止活动作业,然后才能创建新的作业。
有关更多信息,请参阅 Spark 网站上的 SparkContext。
"Container exit code 137" 错误
当任务超出其分配的物理内存时,YARN 容器会停止该任务,您会收到以下错误:
"Container killed on request.Exit code is 137"
当存在随机分区、分区大小不一致或执行程序内核数量过多时,您会收到此错误。
查看 Spark 驱动程序日志中的错误详情以确定错误原因。有关更多信息,请参阅如何访问 Amazon EMR 集群上的 Spark 驱动程序日志?
驱动程序日志中的错误示例:
ERROR YarnScheduler: Lost executor 19 on ip-10-109-##-###.aws.com : Container from a bad node: container_1658329343444_0018_01_000020 on host: ip-10-109-##-###.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"...
上述错误堆栈跟踪显示,执行程序上没有足够的可用内存来继续处理数据。此错误可能会发生在不同的作业阶段,无论是窄转换还是宽转换。
要解决此问题,请执行以下操作:
- 增加执行程序内存。
**注意:**执行程序内存包括执行任务所需的内存和开销内存。二者的总和不得超过 Java 虚拟机 (JVM) 的大小和 YARN 最大容器大小。 - 添加更多 Spark 分区。
- 增加随机分区的数量。
- 减少执行程序内核的数量。
有关更多信息,请参阅如何解决 Amazon EMR 上 Spark 中的 "Container killed on request.Exit code is 137" 错误?
Spark 作业处于挂起状态且无法完成
Spark 作业可能由于多种原因而陷入卡滞状态。例如,Spark 驱动程序进程的更改或执行程序容器的丢失都可能会停止作业。
当磁盘空间利用率过高,或者为集群节点使用竞价型实例且 AWS 已终止该竞价型实例时,Spark 作业可能会处于卡滞状态。有关更多信息,请参阅如何解决 Amazon EMR 上 Spark 中的 "ExecutorLostFailure: Slave lost" 错误?
要对此问题进行故障排除,请执行以下操作:
- 查看 Spark 驱动程序或驱动程序日志中是否存在异常。
- 检查 YARN 节点列表中是否存在运行状况不佳的节点。当核心节点上的磁盘利用率超过阈值时,YARN 节点管理器运行状况服务会将该节点标记为 UNHEALTHY(运行状况不佳)。Amazon EMR 会将运行状况不佳的节点添加到拒绝列表中,并阻止 YARN 向这些节点分配容器。
- 监控磁盘空间利用率并配置 Amazon Elastic Block Store (Amazon EBS) 卷,将 Amazon EMR 集群 Worker 节点的利用率保持在 90% 以下。
"Heartbeat communication" 错误
Spark 执行程序会按照 spark.executor.heartbeatInterval 属性指定的时间间隔向 Spark 驱动程序发送心跳信号。当发生长时间的垃圾回收暂停时,执行程序可能无法发送心跳信号。驱动程序会停止那些在超过指定值的时间内未能发送心跳信号的执行程序,并且您会收到以下错误:
"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"
内存限制或内存不足 (OOM) 问题会导致执行程序处理数据时出现超时异常。这些问题还会影响垃圾回收进程,并可能造成进一步的延迟。
要解决心跳通信错误,请使用以下选项之一:
- 增加执行程序内存。此外,根据应用程序进程,对数据进行重新分区。
- 调优垃圾回收。有关更多信息,请参阅 Apache Spark 网站上的 Garbage collection tuning(垃圾回收调优)。
- 增加 spark.executor.heartbeatInterval 的时间间隔。
- 指定更长的 spark.network.timeout 周期。
"ExecutorLostFailure" 错误
当高磁盘利用率导致核心节点或任务节点终止时,您可能会收到以下错误:
"ExecutorLostFailure "Exit status: -100.Diagnostics: Container released on a *lost* node"
当节点因 CPU 利用率长期过高或可用内存不足而变得无响应时,您也可能会收到上述错误。有关故障排除步骤,请参阅如何解决 Amazon EMR 中的 "Exit status: -100.Diagnostics: Container released on a lost node" 错误?
**注意:**当您为集群节点使用竞价型实例,且 AWS 终止了某个竞价型实例时,也可能会出现此错误。Amazon EMR 集群会预置一个按需型实例来替换已终止的竞价型实例,应用程序可能会自行恢复。有关详细信息,请参阅 Amazon EMR 上针对弹性和恢复能力的 Spark 增强功能。
"SQL connection timeout" 错误
当数据库连接尝试由于网络超时而失败时,您会收到以下错误:要解决此问题,请验证数据库主机是否可以在端口 1433 上接收来自您的 Amazon 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 Elastic Compute Cloud (Amazon EC2) 实例配置文件角色的策略。
- 用于 Amazon S3 的 Amazon Virtual Private Cloud (Amazon VPC) 端点。
- Amazon S3 源存储桶和目标存储桶策略。
要解决 403 错误,请确保相关的 AWS Identity and Access Management (IAM) 角色或策略允许访问 Amazon S3。有关更多信息,请参阅为什么我的 Amazon EMR 应用程序失败并显示 HTTP 403 "Access Denied" AmazonS3Exception 错误?
HTTP 404 "Not Found"
当应用程序期望在 Amazon S3 中查找某个对象,但在请求时未找到该对象时,您会收到 "HTTP 404 Not found" 错误。
该错误可能是由以下原因造成的:
- Amazon S3 路径不正确。
- 应用程序之外的某个进程移动或删除了该文件。
- 某个操作导致了最终一致性问题,例如覆盖。
有关更多信息,请参阅为什么我的 Amazon EMR 应用程序失败并显示 HTTP 404 "Not Found" AmazonS3Exception 错误?
- 语言
- 中文 (简体)
