更新時間:2021-12-17 來源:黑馬程序員 瀏覽量:
Spark Streaming支持從多種數(shù)據(jù)源獲取數(shù)據(jù),其中就包括 Kafka,要想從 數(shù)據(jù)源獲取數(shù)據(jù),首先要建立兩者之間的連接,本節(jié)來介紹兩種連接Kafka的方式。
(1)KafkaUtils.createDstream基于接收器方式,消費Kafka數(shù)據(jù)已淘汰企業(yè)中不再使用;
(2)Receiver作為常駐的Task運行在Executor等待數(shù)據(jù),但是一個Receiver效率低,需要開啟多個,再手動合并數(shù)據(jù)(union),再進行處理,很麻煩;
(3)Receiver那臺機器掛了,可能會丟失數(shù)據(jù),所以需要開啟WAL(預寫日志)保證數(shù)據(jù)安全,那么效率又會降低;
(4)Receiver方式是通過zookeeper來連接kafka隊列,調用Kafka高階API,offset存儲在zookeeper,由Receiver維護
(5)Spark在消費的時候為了保證數(shù)據(jù)不丟也會在Checkpoint中存一份offset,可能會出現(xiàn)數(shù)據(jù)不一致;
(1)KafkaUtils.createDirectStream直連方式,Streaming中每批次的每個job直接調用Simple Consumer API獲取對應Topic數(shù)據(jù),此種方式使用最多,面試時被問的最多;
(2)Direct方式是直接連接kafka分區(qū)來獲取數(shù)據(jù),從每個分區(qū)直接讀取數(shù)據(jù)大大提高并行能力
(3)Direct方式調用Kafka低階API(底層APl),offset自己存儲和維護,默認由Spark維護在checkpoint中,消除了與zk不一致的情況
(4)當然也可以自己手動維護,把offset存在MySQL/Redis中;
Spark Streaming與Kafka集成,有兩套API,原因在于Kafka Consumer API有兩套,文檔:
http://spatkapathe.org/docs/2.4.5/streaming-kafka-integration.html
http://spark apache.org/docs/latest/streaming-kafka-integration.html
Kafka0.8.x版本-早已淘汰
底層使用老的KafkaAPI:Old Kafika Consumer API
支持Receiver(已淘達)和Direct模式:
Kafka 0.10.x版本-開發(fā)中使用
底層使用新的KafkaAPI:New Kafka Consumer API
只支持Direct模式