• 毕务刚
    2021-12-13
    老师, 有个需求是利用spark stream读kafka,分析后更新几个 mongodb表, 有几个疑问。 1. 如果利用foreach sink 更新mongodb表, foreach sink 是运行在driver侧, 还是 executor侧,如果是运行在driver侧, 那么并行处理能力是不是很差(没有利用executor的资源) 2. 如果利用 foreachBatch sink 更新mongodb表, structured-streaming-programming-guide中foreachBatch sink的Fault-tolerant是Depends on the implementation,是不是说 foreachBatch sink 不能利用checkpoint来获得已经处理的offset? 这种情况下, 如果管理 kafka的offset?

    作者回复: 一个个来说哈~ 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

    
    2