使用Spark结构化流处理输入流时,出现以下异常。
org.apache.spark.SparkException:由于阶段失败,作业被中止: 5.0阶段的任务22失败1次,最近一次失败:丢失的任务 5.0阶段22.0(TID 403,本地主机,执行程序驱动程序):java.lang.OutOfMemoryError:Java堆空间
我已按照以下说明处理水印,
.withWatermark("timestamp", "5 seconds")
.groupBy(window($"timestamp", "1 second"), $"column")
可能是什么问题?我尝试将触发器从默认间隔更改为固定间隔,但仍然遇到问题。
答案 0 :(得分:1)
我认为此问题与水印或触发器无关。发生OutOfMemory
错误的原因有两个:
内存泄漏。此编程错误将导致您的应用程序不断消耗更多内存。每次使用应用程序的泄漏功能时,都会将某些对象留在Java堆空间中。随着时间的流逝,泄漏的对象会占用所有可用的Java堆空间并触发错误。
为其指定的资源数据过多。您的群集具有指定的阈值,并且只能容纳一定数量的数据。当数据量超过该阈值时,在峰值停止运行之前正常运行的作业并触发java.lang.OutOfMemoryError: Java heap space error
。
您的错误也显示task 22.0 in stage 5.0
,这意味着它成功完成了第1-4阶段。对我来说,这意味着为它指定的资源有太多数据,因为它没有像内存泄漏那样在多次运行中消失。尝试使用spark.readStream.option("maxFilesPerTrigger", "6")
之类的方法限制读取的数据量,或者增加分配给该群集的内存。