状态操作状态保存在Spark群集中的位置

时间:2019-06-05 06:17:01

标签: apache-spark spark-structured-streaming

我正在使用Spark Structured Streaming进行“ flatMapGroupsWithState”实验,这个想法很有趣,但是由于Spark的分布式特性,现在我要问自己,该状态信息保存在哪里。...

假设我有一个集群10,是否所有10个集群都会共享存储负载以保留此状态信息,否则存在集群中一个节点可能过载的风险?

我读到某个地方说State对象必须是Java可序列化的,考虑到Java序列化效率极低,有没有一种方法可以自定义它以使用Protobuffer或Avro等...

谢谢。.

1 个答案:

答案 0 :(得分:1)

  

此状态信息保存在哪里。...

在执行人上。

由于存在分区,默认情况下有200个状态存储。您可以使用spark.sql.shuffle.partitions配置属性对其进行更改。这样就可以使分区的数量等于状态存储的数量。这也说明,无论您用作分组键如何,都将在分区之间混洗数据,并且(很可能)某些可用状态存储将根本没有任何状态(为空)。

  

假设我有一个集群10,是否所有10个集群都会共享存储负载以保留此状态信息,否则存在集群中一个节点可能过载的风险?

是的,但是由分组键和分区控制,这是Spark开发人员编写的代码。

  

考虑到Java序列化效率极低,我在某处读到State对象必须是Java可序列化的

由于状态存储对于任务是本地的(在执行程序上),因此无需考虑序列化。

  

,有一种方法可以对此进行自定义,以使用Protobuffer或Avro等。

好的。您应该编写自己的状态存储实现。默认情况下,只有一个HDFSBackedStateStoreProvider使用spark.sql.streaming.stateStore.providerClass内部配置属性配置。