Apache spark 当状态数据增长时,Spark结构化流媒体如何处理内存状态?

Apache spark 当状态数据增长时,Spark结构化流媒体如何处理内存状态?,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,在Spark Structured Streaming(版本2.2.0)中,如果使用更新模式作为输出模式的mapGroupsWithState查询,Spark似乎正在使用java.util.ConcurrentHashMap数据结构存储内存中的状态数据。有人能详细地向我解释一下,当状态数据增长而内存不足时会发生什么?此外,是否可以使用spark配置参数更改存储在内存中的状态数据的限制 有人能详细地向我解释一下当国家 数据增长,内存不足 执行器将因OOM异常而崩溃。由于使用mapGroupWith

在Spark Structured Streaming(版本2.2.0)中,如果使用更新模式作为输出模式的
mapGroupsWithState
查询,Spark似乎正在使用
java.util.ConcurrentHashMap
数据结构存储内存中的状态数据。有人能详细地向我解释一下,当状态数据增长而内存不足时会发生什么?此外,是否可以使用spark配置参数更改存储在内存中的状态数据的限制

有人能详细地向我解释一下当国家 数据增长,内存不足

执行器将因OOM异常而崩溃。由于使用
mapGroupWithState
,您是负责添加和删除状态的人,因此,如果无法为JVM分配内存的数据使JVM无法承受,则进程将崩溃

是否可以更改存储在数据库中的状态数据的限制 内存,使用spark配置参数


无法限制存储在内存中的字节数。同样,如果这是
mapGroupsWithState
,则必须以不会导致JVM OOM的方式管理状态,例如设置超时和删除状态。如果我们讨论的是Spark为您管理状态的有状态聚合,例如
agg
组合器,那么您可以使用一个将在时间帧过去后从内存中逐出旧数据的方法来限制状态。

现有的状态存储实现使用内存哈希映射(用于存储)+HDFS(用于容错) HashMaps是版本化的(每个微批一个)。在辅助进程的执行器内存中,每个聚合分区的每个版本都有一个单独的键值映射。(要维护的版本数是可配置的) 回答你的问题:

有人能详细地向我解释一下,当状态数据增长而内存不足时会发生什么

状态存储HashMaps与洗牌任务共享执行器内存。因此,随着状态的增长或洗牌任务需要更多内存,频繁的GCs和OOM将导致执行器失败

是否可以使用spark配置参数更改内存中存储状态数据的限制

目前这是不可能的。您只能指定由状态存储和执行器任务共享的执行器内存,我们无法在它们之间分配内存。这实际上使得当前的实现在数据突然爆发的情况下变得不可靠,即使水印在这些情况下也没有帮助。
如果有兴趣了解state store在结构化流媒体中的内部工作方式,本文可能会很有用:


p、 我是Spark中配置内存的作者,您可以使用-
Spark.driver.memory
Spark.executor.memory
configs。供参考-