Spark获取Kafka数据的两种方式(源码)

个人GitHub地址 :https://github.com/LinMingQiang

在sparkstreaming接受数据的时候有两种方式

(1)DirectKafkaInputDStream 使用的是 Direct 方式获取数据;DirectKafkaInputDStream 继承自 InputDStream
(2)SocketInputDStream 使用的是 Receiver-based 方式获取数据;SocketInputDStream 继承自ReceiverInputDStream

这两种方式的区别:

Direct是去数据源拉取数据,只有在真正执行的时候才去获取数据
Receiver是把数据取来存储,是实时都在获取数据并储存

ReceiverInputDStream

1:将receive分给单个excutor,在excutor启动多线程(同kafka的partiton个数)来获取kafka的数据。
2:receive一直在获取kafka数据,并存在block上,等spark job去获取执行。然后更新offset。

DirectKafkaInputDStream

获取kafka数据

由于DirectKafkaInputDStream 不是继承自ReceiverInputDStream。所以不需要有Receiver,所以也就没有获取数据,不需要将数据存在内存block里面,也就没有block信息等等

读取数据

使用Direct的方式的好处之一就是,在要使用数据的时候才去取数据。
在开始new 一个DirectKafkaInputDStream 的时候会带入一个fromOffsets,表示初始的数据偏移量(查看我kakfa相关的博客)
Spark获取Kafka数据的两种方式(源码)_第1张图片

获取kafka最后的偏移量作为untilOffsets

然后创建一个KafkaRDD。
然后更新fromOffsets和untilOffsets
后面就是KafkaRDD的内容了

KafkaRDD(查看我kafka的微博)

可以看出KafkaRDD的分区数,和kafka的分区是一样的。因为是从offset里面来的
其实对于DirectKafkaInputDStream 来说应该是单机运行的,真正并行的是KafkaRDD取数据
取数据是使用KafkaRDDIterator

GitHub地址:https://github.com/LinMingQiang/spark-util

你可能感兴趣的:(spark,kafka)