看了下官方文档,原本streaming在使用direct模式时,可以自己维护offset,感觉上还比较靠谱。
现在structed streaming 使用kafka时,enable.auto.commit 是不可设置的,按照文档说的是,structed streaming 不提交任何offset,
那spark在新版本的消费kafka中,如何保证有且仅有一次,或者是至少被消费一次。
structed streaming 并不是不提交任何offset,只是不提交到zk而已, 首先kafka本身有个topic有个存放 __consumer_offsets
, 同时还可以提交到外部存储,比如说mysql、redis 之类, 通过checkpointLocation 可以设置偏移量存储的路径,可以自己试一下.option("checkpointLocation","./checkpoint")