【问题标题】:Streaming from particular partition within a topic (Kafka Streams)从主题中的特定分区流式传输(Kafka Streams)
【发布时间】:2017-06-20 15:42:38
【问题描述】:

据我在阅读 Kafka Streams 文档后了解,不可能将其用于仅来自给定主题的一个分区的流式数据,总是必须完整阅读。

对吗?

如果有,未来是否有计划为 API 提供这样的选项?

【问题讨论】:

  • 这个问题对我来说不是很清楚。您的流应用程序的源可以是只有一个分区的主题。但有可能我还没有理解这个问题......你能详细说明一下吗?
  • 我举个例子。假设我有 10 个分区的主题“A”,我想从这个主题流式传输数据,但只从分区 4 流式传输数据,而不从其他分区收集数据。
  • 那么您只需将分区 4 中的数据复制到另一个只有 1 个分区的主题中,并将其用作 Streams 的输入。

标签: apache-kafka apache-kafka-streams


【解决方案1】:

不,您不能这样做,因为内部消费者订阅了主题,该主题加入了通过 application-id 指定的消费者组,因此分区是自动分配的。 顺便说一句,你为什么要这样做? 如果不重新平衡,您将失去 Kafka Stream 提供的可扩展性功能,因为只需添加/删除流应用程序的实例,您就可以扩展整个流程,这要归功于分区上的重新平衡。

【讨论】:

  • 我想拥有这样的功能,因为在某些情况下,我确切地知道我感兴趣的数据在哪个分区。因此,仅从这个特定分区进行流式传输应该会带来更好的性能,因为要过滤掉的数据更少。但是感谢您的澄清!
【解决方案2】:

您可以使用 PartitionGrouper 执行与您的需求类似的操作。分区分组器可用于根据给定的主题分区创建流任务。

例如参考 DefaultPartitionGrouper 实现。但这需要定制。

因此,正如@ppatierno 建议的那样,请查看您的用例,然后以您不必偏离标准实践的方式设计拓扑。

【讨论】:

    【解决方案3】:

    您可以通过正确指定主题、分区号和偏移量来做到这一点

     Map(new TopicPartition(topic, partition) -> 2L)
        val stream = KafkaUtils.createDirectStream[String, String](
              ssc,
              PreferConsistent,
              Subscribe[String, String](topics, kafkaParams,offsets))
    

    partition 指的是分区号,

    2L指分区的起始偏移量

    更多详情请参考streaming_from_specific_partiton

    【讨论】:

      【解决方案4】:

      您无法在 Kafka 消费者中指定分区,因为这就是 Kafka 扩展的原因。或者我们可以说只有分布式系统才能工作。您可以进行分段并将每个分段分配给一个主题,每个主题应该只有一个分区。

      由于主题是在 ZooKeeper 中注册的,如果尝试添加太多主题,您可能会遇到问题,例如如果您拥有一百万用户并决定为每个用户创建一个主题。

      【讨论】:

        猜你喜欢
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        • 2016-03-24
        相关资源
        最近更新 更多