簡體   English   中英

火花流。 從Kafka並行讀取會導致重復數據

[英]Spark streaming. Reading in parallel from Kafka is causing repeated data

我通過以下代碼創建了6個輸入DStream,它們使用直接aproach從Kafka讀取6個分區主題,我發現即使為流指定相同的組ID,我也會重復6次數據。 如果我只創建3個DStreams,我會重復數據3次等等....

numStreams = 6
kafkaStreams = [KafkaUtils.createDirectStream(ssc, ["send6partitions"], {
  "metadata.broker.list": brokers,
  "fetch.message.max.bytes": "20971520",
  "spark.streaming.blockInterval" : "2000ms",
  "group.id" : "the-same"},
  valueDecoder = decodeValue, keyDecoder = decode_key) for _ in range (numStreams)]

kvs = ssc.union(*kafkaStreams)

我在這里做錯了什么?

我不熟悉Python,但Spark Scala中的Direct Stream不提供任何偏移。 因此,如果您打開一個流n次而不提交任何讀取消息的偏移量,您的消費者將從頭開始。

如果它在python中是相同的,則不需要啟動n個流。 啟動一個流,Spark將處理分區到執行程序/任務本身的分配。

在直接方法中,你不應該從一個主題創建許多DStream。

文檔

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

所以只需創建一個DStream,Spark將使用所有Kafka分區:)

基本上Kafka主題被分配以通過共享負載使得多個接收器/消費者的分發更快。默認情況下,當您創建Dstream時,一個接收器將通過接收器線程(Java線程)並行地從每個Kafka主題分區到Dstream分區運行和接收數據。 如果要為一個主題創建6個Dstream,則表示同一主題的6個接收器並不意味着每個端口的每個Dstream。 每個接收器一次獲得每個饋送,因此每次饋送獲得6次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM