2015-06-26 65 views
3

我很困惑爲什麼我只能看到一個KafkaReceiver在火花Web UI頁(8080), 但我在卡夫卡有10個分區,並且我在火花簇中使用了10個內核,我的代碼也如下python: kvs = KafkaUtils.createStream(ssc,zkQuorum,「spark-streaming-consumer」,{topic:10}) 我想KafkaReceivers數應該是10而不是1. I'我很困惑。 預先感謝您!爲什麼我只能看到一個火花流kafkaReceiver

回答

4
kvs = KafkaUtils.createStream(ssc, zkQuorum, "spark-streaming-consumer",{topic: 10}) 

該代碼創建1個接收器和10個線程。每個線程將附加到一個分區,所有數據將由1位消費者使用1個內核提取。所有其他內核將(可能)處理收到的數據。

如果你想有10個接收器,每一個連接到1分,使用1個核心,你應該這樣做:(Scala中,我的Python是弱,但你的想法):

val recvs = (1 to 10).map(i => KafkaUtils.createStream(ssc, zkQuorum, "spark-streaming-consumer",{topic: 1}) 
val kafkaData = ssc.union(recvs) 

考慮到您需要額外的Spark核心來處理接收到的數據。

+0

非常感謝你Maasg,你的回答解決了我的問題。請問在實踐中你喜歡採用哪種方法,10個1線程的接收器或10個線程的1個接收器?我想知道是否只有一個Receiver在工作,當單個Receiver被阻塞或崩潰時,工作流程將被阻止。 – Jack

+0

@Jack我們根據負載平衡。您可以嘗試5個rec x 2個線程('{topic:2}')或2個5個線程('{topic:5}')。 10是不好的分區數b/c不會留下很多選項。我們使用幻數12,所以我們可以做2 x 6,3 x 4,...,12 x 1 – maasg