我一直在查看Spark 2.3.1关于结构化流的文档,但无法找到有关有状态操作与状态存储器内部工作原理的详细信息。更具体地,我想知道的是,(1)状态存储器是否是分布式的? (2)如果是,则是按照每个工作者或核心进行分布式存储吗?
似乎在Spark以前版本中它是按工作者进行分布式存储的,但现在还不清楚。我知道它由HDFS支持,但没有解释内存存储是如何实际工作的。
确实,它是一个分布式的内存存储吗?我特别感兴趣的是去重,如果数据来自于一个大型数据集,则这需要进行规划,因为所有“Distinct”DataSet最终将在内存中保存,作为该数据集处理结束时的结果。因此,需要根据状态存储器的工作方式来规划工作者或主节点的大小。
ConcurrentHashMap
。数据由Spark中定义的分区器分区到每个映射中。每个微批处理,基于HDFS的状态存储将会获取所有已更新的键,并异步地将其存储到HDFS中。不时会发生压缩,保存的增量文件将变成“快照”文件。此外,还将进行删除。 - Yuval Itzchakov