spark和kafka整合有2中方式
1、receiver
顾名思义:就是有一个线程负责获取数据,这个线程叫receiver线程
解释:
1、Spark集群中的某个executor中有一个receiver线程,这个线程负责从kafka中获取数据
注意:这里的获取数据并不是从kafka中拉(pull) 而是接收数据,具体原理是该receiver线程发送请求到kafka,这个请求包含对kafka中每个partition的消费偏移量(offset),然后由kafka主动的推送数据到spark中,再有该receiver线程负责接收数据
2、当receiver线程接收到数据后会做备份处理,即把数据备份到其他的executor中,也可能会备份到这个receiver线程所在节点的executor中
3、当备份完毕后该线程会把每个partition的消费偏移量在zookeeper中修改,(新版本的kafka的offset 保存在kafka集群中)
4、修改完offset后,该receiver线程会把"消费"的数据告诉Driver
5、Driver分发任务时会根据每个executor上的数据,根据数据本地性发送
问题:
当第三步执行完后,对于kafka来说这一批数据已经消费完成,那么如果此时Driver挂掉,那么这一批数据就会丢失,为了解决这个问题,有一个叫WAL逾写日志的概念,即把一部分数据存储在HDFS上,当Driver回复后可以从HDFS上获取这部分数据,但是开