源碼分析的spark版本是1.6。
首先,先看一下 org.apache.spark.streaming.dstream.InputDStream 的 類說明:
This is the abstract base class for all input streams. This class provides methods start() and stop()
which is called by Spark Streaming system to start and stop receiving data. Input streams that can
generate RDDs from new data by running a service/thread only on the driver node (that is, without
running a receiver on worker nodes), can be implemented by directly inheriting this InputDStream.
For example, FileInputDStream, a subclass of InputDStream, monitors a HDFS directory from the driver
for new files and generates RDDs with the new files. For implementing input streams that requires
running a receiver on the worker nodes, use org.apache.spark.streaming.dstream.ReceiverInputDStream
as the parent class.
翻譯如下:
所有輸入stream 的抽象父類,這個類提供了 start 和 stop 方法, 這兩個方法被spark streaming系統來開始接收或結束接收數據。
兩種接收數據的兩種方式:
在driver 端接收數據;
1. 輸入流通過在driver 節點上運行一個線程或服務,從新數據產生 RDD,繼承自 InputDStream 的子類 2. 輸入流通過運行在 worker 節點上的一個receiver ,從新數據產生RDD , 繼承自 org.apache.spark.streaming.dstream.ReceiverInputDStream
也就是說 spark 1.6 版本的輸入流的抽象父類就是 org.apache.spark.streaming.dstream.InputDStream,其子類如下圖所示:

與kafka 對接的兩個類已經 在上圖中標明。
現在對兩種方式做一下簡單的比較:
相同點:
1.內部都是通過SimpleConsumer 來獲取消息,在獲取消息之前,在獲取消息之前,from offset 和 until offset 都已經確定。
2.都需要在構造 FetchRequest之前,確定leader, offset 等信息。
3. 其內部都有一個速率評估器,起到平衡速率的作用
不同點:
1. offset 的管理不同。
DirectKafkaInputStream 可以通過外部介質來管理 offset, 比如 redis, mysql等數據庫,也可以是hbase等。
KafkaInputStream 則需要使用zookeeper 來管理consumer offset數據, 其內部需要監控zookeeper 的狀態。
2. receiver運行的節點不同。
DirectKafkaInputStream 對應的 receiver 是運行在 driver 節點上的。
KafkaInputStream 對應的 receiver 是運行在非driver 的executor 上的。
3. 內部對應的RDD不一樣。
DirectKafkaInputStream 對應的是 KafkaRDD,內部的迭代器是KafkaRDDIterator
KafkaInputStream 對應的是 WriteAheadLogBackedBlockRDD 或者是 BlockRDD,內部的迭代器 是自定義的 NextIterator
4. 保證Exactly-once 語義的機制不一樣。
DirectKafkaInputStream 是根據 offset 和 KafkaRDD 的機制來保證 exactly-once 語義的
KafkaInputStream 是根據zookeeper的 offset 和WAL 機制來保證 exactly-once 語義的,接收到消息之后,會先保存到checkpoint 的 WAL 中
