Spark与Kafka整合原理

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上获取这部分数据,但是开启WAL性能会受到很大的影响

2、dirct

直接连接:即每个executor直接取kafka获取数据

1、首先Driver程序会定时(batchInterval)的向executor中发送任务(4个)

  >> 问题1:Driver怎么知道要把任务发送到哪个executor中呢?

     >> Driver会调用Kafka的接口获取某个partition位于哪个节点上,根据这个来获取这些信息并发送任务到指定的节点,这就类似于Spark集群处理HDFS上的文件数据,Spark是可以知道某些文件的block在那些节点上,就是spark调用了HDFS的相关接口

  >> 问题2:为什么是4个任务?

      >> 这个个数由消费的topic的partition的个数决定,因为spark会对每个partition开启一个任务,所以任务数是kafka的某个topic的partition数

2、当每个任务确定了处理那个partition中的数据,则就有任务本身去kafka获取数据

总结:目前公司中第二种方式使用比较多,这样也有一个问题就是说当kafka中某个topic加了ACL验证,那么这种方式是不能消费加了ACL的topic中的数据,因为kafka客户端的ACL验证需要客户端配置一个环境变量在System的Properties中,在local模式下可以实现,因为local模式下启动一个虚拟机实例,即只对应一个System,而在集群模式下,要启动多个进程,即启动多个虚拟机实例,所以System的全局属性没有办法配置

想学习大数据或者想学习大数据的朋友,我整理了一套大数据的学习视频免费分享给大家,从入门到实战都有,大家可以加微信:Lxiao_28获取,还可以入微信群交流!(备注领取资料,真实有效)。

猜你喜欢

转载自blog.csdn.net/m0_37803704/article/details/80637056