1.spark可以通过checkpoint的方式来维护kafka的偏移量,配置简单,只需要配置checkpoint的路径就可以完成偏移量的维护,如果本身spark业务就采用了state状态,那么既不需要额外配置即可确保偏移量的维护。
原理:spark会将kafka spark straming处理的topic以及对应消费偏移量持久化到文件当中,当spark任务崩溃后,保存在持久化文件的偏移量将会通过反序列化得到,达到继续崩溃前的偏移量继续消费的目的。
优点:配置方便,几乎不需要额外的代码量。
缺点:本身不需要state的任务会有一些额外要注意的点,广播变量在恢复的时候需要 重新广播,否则再重新访问时将会直接崩溃。同一批数据如果存在问题没有正常trycatch,再下次恢复重启后将会直接跳过该批数据,对数据的质量存在一定风险。Spark一些配置修改之后,需要删除checkpoint目录才能起作用,也会导致偏移量的失去。环境中的kafka如果被清空,也需要删除kafka目录,否则无法恢复。
2.spark在010的kafka api中给出了异步提交偏移量的接口,可以通过将偏移量提交的方式来维护偏移量在kafka上。
原理:在kafka stream每批rdd生成的compute()方法中,将会在末尾异步提交之前的偏移量到kafka上,而发送的具体偏移量是在rdd处理的末尾通过commitAsync()提交到stream的。
优点:可以规避checkpoint带来的一些约束,修改配置不需要删除checkpoint文件也不会导致偏移量的丢失,环境中的kafka被清空只需要简单重启就能解决。
缺点:对代码的编写规范具有要求,如果任务的try catch不全面将会导致无法规避掉的崩溃问题,只有修改代码或者更换groupid能够解决。