作者回复: 一个个来说哈~ 1)一定是在Executors侧的~ 抛开流处理不说,想一想RDD的foreach,对比着来理解就可以了~ foreach更多的,是让开发者灵活地定义Actions 2)foreachBatch其实也是类似,让开发者能以Micro-batch为粒度,去定义Actions。不过,这里说的“容错取决于实现”,并不是说不能用Checkpoint,而是说,Spark本身只能做到“At least once”,要实现Exactly once,还是要看foreachBatch里面,具体写到哪个Sink去,以你的例子,是写到MongoDB。说白了,就是如果你想做到Exactly once,那么你需要自己在应用的层面,保证Structured Streaming + MongoDB端到端做到Exactly once,比如利用MongoDB提供的一些机制,在应用的代码中,争取做到Exactly Once