【问题标题】:Spark streaming. Reading in parallel from Kafka is causing repeated data火花流。从Kafka并行读取导致重复数据
【发布时间】:2017-04-05 20:57:01
【问题描述】:

我使用以下代码创建 6 个输入 DStream,这些输入 DStream 使用直接方法从 Kafka 的 6 个分区主题中读取,我发现即使为流指定相同的组 ID,我也会得到重复 6 次的数据。如果我只创建 3 个 DStream,我会得到重复 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 apache-spark streaming apache-kafka


    【解决方案1】:

    基本上,Kafka 主题被划分为通过共享负载使多个接收器/消费者更快地分发。默认情况下,当您创建 Dstream 时,一个接收器将运行并通过接收器线程并行接收来自每个 Kafka 主题分区的数据到 Dstream 分区(Java线)。如果您为一个主题创建 6 个 Dstream,则意味着同一主题有 6 个接收器这并不意味着每个部分的每个 Dstream。每个接收者都会收到一次提要,因此您每次提要获得 6 次。

    【讨论】:

      【解决方案2】:

      在直接方法中,您不应该从一个主题创建多个 DStream。

      来自documentation

      简化并行:无需创建多个输入 Kafka 流 并联合他们。使用 directStream,Spark Streaming 将创建尽可能多的 RDD 分区,因为有 Kafka 分区可供使用,这将 所有从 Kafka 并行读取的数据。所以有一个一对一的映射 Kafka和RDD分区之间,更容易理解和 调。

      所以只需创建一个 DStream,Spark 将使用所有 Kafka 分区 :)

      【讨论】:

      • @Doctor 您是否尝试过每个主题使用一个 DStream 的方法?它现在对你有用吗?
      【解决方案3】:

      我不熟悉 Python,但 Spark Scala 中的 Direct Stream 不会提交任何偏移量。因此,如果您打开一个流 n 次而不提交任何已读消息的偏移量,您的消费者将从头开始。

      如果在python中是一样的,就不需要启动n个流了。启动一个流,Spark 将自己处理分区到执行器/任务的分配。

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 2019-02-14
        • 2018-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-20
        • 2017-04-27
        • 1970-01-01
        相关资源
        最近更新 更多