现象:同事的Structured Streaming实时任务中配置了checkpoint,但是每次重启实时任务的时候,实时任务就只处理最新的数据,不会接之前消费offset,然后checkpoint目录下每次启动都会产生新的目录
checkpoint配置如下:
配置了spark.sql.streaming.checkpointLocation参数
解决办法:通过查看spark源代码,发现使用spark.sql.streaming.checkpointLocation的话,也需要在writeStream时配置queryName。
因为spark每次启动时候,spark都会取queryName作为checkpoint目录的一部分,如果queryName为空就会随机生成个uuid,源码如图:
另外,使用checkpoint,通过在writeStream时,配置.option("checkpointLocation", "memory/")的方式更好,不会让其他不明白的人,犯如上的错误,只配置一个参数