1. 程式人生 > >Spark Streaming中的Receiver方式和直連方式

Spark Streaming中的Receiver方式和直連方式

Spark Streaming從Kafka中接受資料的時候有兩種方式,一種是使用Receiver的老方法,另一種是使用直連的方法

1.Receiver方式

Receiver是使用Kafka高階消費者API實現的,與所有接收器一樣,從Kafka通過Receiver接收的資料儲存在Spark執行器中,然後由Spark Streaming啟動的作業處理資料

但是,在預設配置下,此方法可能會在失敗時丟失資料,為確保零資料丟失,必須在Spark Streaming中另外啟用Write Ahead Logs(在Spark 1.2中引入),這將同步儲存所有收到的Kafka將資料寫入分散式檔案系統(例如HDFS)上的預寫日誌,以便在發生故障時可以恢復所有資料

簡單來說就是Receiver方式就是從Kafka中拉取資料,每次接受固定時間間隔的資料儲存到記憶體中,但是這樣可能會因為資料量太大,而造成記憶體溢位,所以必須使用WAL,將溢位的部分儲存到HDFS或者磁碟中,以保證資料不丟失

這種方式效率很低,還容易丟失資料,在實際生產中已經不怎麼使用了

2.直連方式

Spark 1.3中引入了這種新的無接收器“直接”方法,以確保更強大的端到端保證,這種方法不是使用接收器來接收資料,而是定期向Kafka查詢每個主題+分割槽中的最新偏移量,並相應地定義要在每個批次中處理的偏移量範圍。當啟動處理資料的作業時,Kafka的簡單消費者API用於讀取Kafka定義的偏移範圍(類似於從檔案系統讀取的檔案)

該方法是直接將RDD中的分割槽連線到Kafka的分割槽上,相當於連線了一條水管,這樣讀取資料的效率更高

兩種方法對比:

Receiver接收固定時間間隔的資料放在記憶體中,使用Kafka的高階API,自動維護偏移量,資料達到固定的時間才進行處理,效率低並且容易丟失資料

Direct直連方式,相當於直接連線到Kafka的分割槽上,使用Kafka底層的API,效率高,但是需要自己維護偏移量