我正在使用Spark Structured Streaming进行“ flatMapGroupsWithState”实验,这个想法很有趣,但是由于Spark的分布式特性,现在我要问自己,该状态信息保存在哪里。...
假设我有一个集群10,是否所有10个集群都会共享存储负载以保留此状态信息,否则存在集群中一个节点可能过载的风险?
我读到某个地方说State对象必须是Java可序列化的,考虑到Java序列化效率极低,有没有一种方法可以自定义它以使用Protobuffer或Avro等...
谢谢。.
答案 0 :(得分:1)
此状态信息保存在哪里。...
在执行人上。
由于存在分区,默认情况下有200个状态存储。您可以使用spark.sql.shuffle.partitions
配置属性对其进行更改。这样就可以使分区的数量等于状态存储的数量。这也说明,无论您用作分组键如何,都将在分区之间混洗数据,并且(很可能)某些可用状态存储将根本没有任何状态(为空)。
假设我有一个集群10,是否所有10个集群都会共享存储负载以保留此状态信息,否则存在集群中一个节点可能过载的风险?
是的,但是由分组键和分区控制,这是Spark开发人员编写的代码。
考虑到Java序列化效率极低,我在某处读到State对象必须是Java可序列化的
由于状态存储对于任务是本地的(在执行程序上),因此无需考虑序列化。
,有一种方法可以对此进行自定义,以使用Protobuffer或Avro等。
好的。您应该编写自己的状态存储实现。默认情况下,只有一个HDFSBackedStateStoreProvider
使用spark.sql.streaming.stateStore.providerClass
内部配置属性配置。