Spark 2.3.1结构化流状态存储内部工作原理

10

我一直在查看Spark 2.3.1关于结构化流的文档,但无法找到有关有状态操作与状态存储器内部工作原理的详细信息。更具体地,我想知道的是,(1)状态存储器是否是分布式的? (2)如果是,则是按照每个工作者或核心进行分布式存储吗?

似乎在Spark以前版本中它是按工作者进行分布式存储的,但现在还不清楚。我知道它由HDFS支持,但没有解释内存存储是如何实际工作的。

确实,它是一个分布式的内存存储吗?我特别感兴趣的是去重,如果数据来自于一个大型数据集,则这需要进行规划,因为所有“Distinct”DataSet最终将在内存中保存,作为该数据集处理结束时的结果。因此,需要根据状态存储器的工作方式来规划工作者或主节点的大小。


请访问此链接 http://asyncified.io/2017/07/30/exploring-stateful-streaming-with-spark-structured-streaming(免责声明:我是作者)。 - Yuval Itzchakov
但是这并没有解释HDFSBackedStateStore实际是如何工作的。我在文档中没有看到相关说明。 - MaatDeamon
我试图阅读这里的文档 https://jaceklaskowski.gitbooks.io/spark-structured-streaming/spark-sql-streaming-StateStore.html 但它与博客相矛盾,该博客指出现在没有每个执行器的存储。 - MaatDeamon
请您能否简单解释一下键值存储是如何工作的?如果它是基于HDFS的,那么我认为数据会被分布式地存储在磁盘上,但一旦数据被加载到内存中,如果不是分布式的,我想知道不同执行器上的核心如何访问相同的数据视图。您能帮忙解答吗? - MaatDeamon
它的工作方式如下:在每个执行器上都放置了一个ConcurrentHashMap。数据由Spark中定义的分区器分区到每个映射中。每个微批处理,基于HDFS的状态存储将会获取所有已更新的键,并异步地将其存储到HDFS中。不时会发生压缩,保存的增量文件将变成“快照”文件。此外,还将进行删除。 - Yuval Itzchakov
显示剩余2条评论
1个回答

4
在结构化流中,状态存储只有一种实现,由内存哈希映射和HDFS支持。内存哈希映射用于数据存储,而HDFS用于容错。哈希映射占用执行器工作节点的内存,每个哈希映射表示聚合分区的版本化键值数据(在去重、groupByy等聚合操作之后生成)。
但这并没有解释HDFSBackedStateStore的实际工作原理。文档中也没有相关说明。我不得不阅读代码(2.3.1),并撰写了一篇关于结构化流中状态存储内部工作原理的文章。你可能想看一下:https://www.linkedin.com/pulse/state-management-spark-structured-streaming-chandan-prakash/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接