工作失败ExecutorLostFailure由于“内存溢出”错误

解决执行器故障的根本原因是由于执行人耗尽内存。

写的mathan.pillai

去年发表在:11月7日,2022年

问题

工作失败的ExecutorLostFailure错误消息。

ExecutorLostFailure(执行人< 1 >退出正在运行的任务之一所致)原因:遗嘱执行人心跳超时后< 148564 >

导致

ExecutorLostFailure错误信息意味着一个执行人的Apache火花集群已经丢失。这是一个通用的错误消息,可以有一个以上的根源。在本文中,我们将看看如何解决问题根源时由于执行人耗尽内存

假设你的遗嘱执行人有太多数据处理和执行程序中可用的内存量不足以处理的数据量,那么这个问题可能发生。例如如果集群的遗嘱执行人24 gb容量和如果累积的数据量大小对应于所有正在执行的任务执行人大于24 gb,那么这个问题可能发生

你如何确定伯父执行人迷失的原因吗?

  1. 打开火花UI。
  2. 点击阶段
  3. 点击失败的阶段
  4. 单击描述对应于失败的阶段。
  5. 审查的底部阶段的细节页面。
  6. 上的任务列表错误列。

错误信息描述为什么特定的任务失败了。如果你看到一条错误消息,表示内存不足,或类似的错误java.lang.OutOfMemoryError这意味着任务失败了,因为遗嘱执行人耗尽内存。

解决方案

当一个执行人失败是由于内存不足,你应该检查下列事项。

有数据倾斜吗?

检查数据是否同样分布在执行人,或者如果有任何倾斜的数据。

你可以找到这通过检查阶段总结表上的阶段的细节页面的UI火花。

如果存在数据倾斜,如果这是唯一的遗嘱执行人,更多的数据,您需要解决斜防止执行人耗尽内存。

在大多数情况下自适应查询执行(AQE)自动检测数据倾斜和解决这个问题。然而,也有一些边缘AQE可能无法正确检测数据倾斜的情况。请检查为什么没有AQE检测我的数据倾斜?(AWS|Azure|GCP更多信息)。

解决数据倾斜的如果你有麻烦,你可以尝试增加分区的数量或明确提及斜暗示的解释如何指定斜在数据集和DataFrame-based加入命令提示吗篇文章。

一个分区是当两个倾斜(分区大小> skewedPartitionFactor *值分区大小)(分区大小> skewedPartitionThresholdInBytes)是真的。

例如,给定一个值分区大小为200 MB,如果任何分区超过1 GB (200 MB * 5(5是默认的skewedPartitionFactor值)),它被认为是倾斜的。在这个例子中,如果你有一个分区大小900 MB的它不会被视为倾斜使用默认设置。

现在说你的应用程序代码(就像很多转换数据爆炸笛卡尔连接,等等)。如果你执行大量的转换,你可以压倒执行人,即使分区不是通常认为是倾斜的。

使用我们的示例违约,你可能会发现,一个900 MB的分区是太多成功的过程。如果是这样的话,你应该减少skewedPartitionFactor价值。通过降低这个值为4,然后系统认为任何超过800 MB的分区是倾斜并自动分配适当的倾斜提示。

请审查AQE文档动态处理斜加入(AWS|Azure|GCP更多信息)。

执行程序能够就够了吗?

如果数据是均匀分布在所有执行器,你还看到内存错误,执行程序没有足够的资源来处理你正试图运行的负载。

增加横向通过增加工人的数量和/或增加垂直通过选择一个工作类型与更多的内存创建集群。

这是一个正确配置流媒体工作吗?

如果没有明显的数据倾斜,但遗嘱执行人仍让太多数据过程中,您应该使用maxFilesPerTrigger和/或触发频率设置,以减少处理的数据量在任何时候。

减少执行人还有助于减少内存上的负载要求,稍高的延迟。以换取延迟时间的增加,流流事件更加可控的方式处理工作。稳定的事件流是可靠地处理每一个微观的批处理。

请检查优化与.trigger流交易文章以获取更多信息。您还应该检查火花结构化流媒体编程指南文档输入源触发器

如果你想增加处理的速度,你需要增加集群的执行人。你也可以重新分配输入流DataFrame,所以任务的数量小于或等于集群中核心的数量。


这篇文章有用吗?