从主题内的特定分区流式传输 (Kafka Streams)

Streaming from particular partition within a topic (Kafka Streams)

据我阅读 Kafka Streams 文档后的理解,不可能将它用于从给定主题的一个分区流式传输数据,总是必须通读一遍。

对吗?

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

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

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

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

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

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

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

其中分区是指分区号,

2L指的是分区的起始偏移量

参考了解更多详情。

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

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