Spark ExecutorLostFailure- 原因:远程 RPC 客户端解除关联。可能是由于容器超过阈值或网络问题

anj*_*ani 6 apache-spark

我们使用 Spark 2.4 处理大约 445 GB 的数据。我们的集群有 150 个工人,每个工人有 7 个 CPU 和 127 GB。Spark 以独立模式部署。下面是我们的配置:每个 worker 一个 executor,分配了 7 个 CPU 和 120 GB。RDD 中有 2000 个分区。

我看到有时由于执行人丢失而导致工作失败。以下是错误:

驱动日志:

ExecutorLostFailure (executor 82 exited caused by one of the running tasks) Reason: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages.\nDriver 
Run Code Online (Sandbox Code Playgroud)

执行者日志:

 2020-07-03 01:53:10 INFO  Worker:54 - Executor app-20200702155258-0011/13 finished with state EXITED message Command exited with code 137 exitStatus 137
 [ERROR] 2020-06-29 17:34:42,074 SIGTERM handler org.apache.spark.executor.CoarseGrainedExecutorBackend - {} - RECEIVED SIGNAL TERM
 - Started 161 remote fetches in 3 ms
 [ERROR] 2020-06-29 17:34:42,079 SIGTERM handler org.apache.spark.executor.CoarseGrainedExecutorBackend - {} - RECEIVED SIGNAL TERM
687.0 in stage 87.0 (TID 45809). 66993 bytes result sent to driver
Run Code Online (Sandbox Code Playgroud)

此外,我注意到由于 OOM 错误,一个工作箱已关闭,但我在驱动程序或工作日志中没有看到任何 OOM 错误。

早些时候,我曾尝试在 RDD 中为每个 worker 运行 2 个 executor,3 个 CPU,每个 executor 60 GB 和 2000 个分区,但也有相同的 executor 丢失问题。

我认为我们有足够的内存分配给执行程序,但随后执行程序也会丢失代码 137,这被认为是由于内存问题,但驱动程序或执行程序日志中没有 OOM 异常。

我尝试将“spark.memory.fraction”更新为“0.8”,我看到了更好的工作成功率,但有时也会因上述错误而失败。

小智 1

可能不是一个通用的解决方案,但我通过减少spark.executor.memory到我设置的一半来解决这个问题,并且它起作用了。我猜测可能是因为除了 Spark 之外的应用程序也在我的集群机器上运行并消耗内存。将所有内存分配给 Spark 应用程序将导致机器速度减慢,从而失去通信。