源碼分析的spark版本是1.6。node
首先,先看一下 org.apache.spark.streaming.dstream.InputDStream 的 類說明:mysql
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.
翻譯以下:redis
全部輸入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,其子類以下圖所示:sql
與kafka 對接的兩個類已經 在上圖中標明。數據庫
如今對兩種方式作一下簡單的比較:apache
相同點:ide
1.內部都是經過SimpleConsumer 來獲取消息,在獲取消息以前,在獲取消息以前,from offset 和 until offset 都已經肯定。源碼分析
2.都須要在構造 FetchRequest以前,肯定leader, offset 等信息。ui
3. 其內部都有一個速率評估器,起到平衡速率的做用this
不一樣點:
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 中