spark讀取kafka兩種方式的區別

參考:http://spark.apache.org/docs/1.4.1/streaming-kafka-integration.html

Receiver與Direct方法相比,後者具有以下優點。

簡化並行性

無需創建多個輸入Kafka流和聯合它們。使用directStream,Spark Streaming將創建與要消費的Kafka分區一樣多的RDD分區,這將從Kafka並行讀取數據。因此,Kafka和RDD分區之間存在一對一映射,這更容易理解和調整。

效率

在第一種方法中實現零數據丟失需要將數據存儲在預寫日誌中,該日誌進一步複製數據。這實際上是低效的,因爲數據有效地被複制兩次 - 一次是Kafka,另一次是寫入提前日誌。第二種方法消除了問題,因爲沒有接收器,因此不需要預寫日誌。只要您有足夠的Kafka保留,消息可以從Kafka恢復。

Exactly-once語義

第一種方法使用Kafka的高級API在Zookeeper中存儲消耗的偏移量。這是傳統上消費Kafka數據的方式。雖然這種方法(與預寫日誌結合)可以確保零數據丟失(即至少一次語義),但是一些記錄在一些故障下可能被消耗兩次的機會很小。這是因爲Spark Streaming可靠接收的數據與Zookeeper跟蹤的偏移之間存在不一致。因此,在第二種方法中,我們使用Zookeeper的簡單的Kafka API。偏移由Spark Streaming在其檢查點內跟蹤。這消除了Spark Streaming和Zookeeper / Kafka之間的不一致,所以每個記錄被Spark Streaming有效地接收一次。爲了實現輸出結果的一次性語義,將數據保存到外部數據存儲的輸出操作必須是冪等的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章