我有一个有状态(带有flagMapGroupsWithState)的Spark结构化流应用程序。
根据当前的spark设计,似乎无法在应用程序启动后更改'spark.sql.shuffle.partitions'-除非我停止应用程序,删除检查点数据(每个this answer),然后从clean重新启动-这是不可接受的,因为这样我会丢失存储在检查点中的所有中间状态。
如何在此限制下扩展我的应用程序而不会丢失数据?
假设我在spark.sql.shuffle.partitions = 10 nodes * 4 cores/node * 3 = 120
的10个节点上启动了该应用程序,然后某个时候,我需要通过添加另外20个节点来扩展集群。
如果我不能将'spark.sql.shuffle.partitions'更改为更大的值,我根本想不出让spark利用新添加的节点的解决方案。 Spark仍会将数据集划分为120个分区,这意味着部分节点将处于空闲状态。