Apache spark 其中有状态操作的状态保存在Spark Cluster中
我曾尝试使用Spark结构化流媒体的“flatMapGroupsWithState”,这个想法很有趣,但现在我问自己,由于Spark的分布式特性,这些状态信息保存在哪里 假设我有一个集群10,那么所有10个集群是否都会共享存储负载以保留此状态信息,或者集群中的一个节点可能会过载 我在某个地方读到,状态对象必须是Java可序列化的,考虑到Java序列化效率极低,有没有一种方法可以自定义它以使用Protobuffer或Avro等 谢谢你的回答 此状态信息保存在哪里 关于遗嘱执行人 默认情况下,有200个状态存储,因为有分区。您可以使用Apache spark 其中有状态操作的状态保存在Spark Cluster中,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,我曾尝试使用Spark结构化流媒体的“flatMapGroupsWithState”,这个想法很有趣,但现在我问自己,由于Spark的分布式特性,这些状态信息保存在哪里 假设我有一个集群10,那么所有10个集群是否都会共享存储负载以保留此状态信息,或者集群中的一个节点可能会过载 我在某个地方读到,状态对象必须是Java可序列化的,考虑到Java序列化效率极低,有没有一种方法可以自定义它以使用Protobuffer或Avro等 谢谢你的回答 此状态信息保存在哪里 关于遗嘱执行人 默认情况下,有20
spark.sql.shuffle.partitions
configuration属性更改它。这样,分区的数量就等于状态存储的数量。这也意味着,无论您使用什么作为分组键,都将在分区之间洗牌您的数据,并且(很可能)一些可用的状态存储将完全没有状态(为空)
假设我有一个集群10,那么所有10个集群是否都会共享存储负载以保留此状态信息,或者集群中的一个节点可能会过载
是的,但它是由分组键和分区控制的,这是Spark开发人员编写的代码
我在某个地方读到,鉴于Java序列化效率极低,状态对象必须是Java可序列化的
无需考虑序列化,因为状态存储是任务的本地存储(在执行器上)
,有没有一种方法可以自定义它以使用Protobuffer或Avro等
当然。您应该编写自己的状态存储实现。默认情况下,只有一个HDFSBackedStateStoreProvider
使用spark.sql.streaming.stateStore.providerClass
内部配置属性进行配置