分区和流之间的 Apache Kafka 关系
Apache Kafka relation between partition and stream
主题的分区和可以使用Java api创建的流之间的关系是什么?
API 喜欢
背后的基本原理是什么
Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = _consumerConnector.createMessageStreams(topicVsPartitionCountMap);
而不是简单地拥有它
List<KafkaStream<byte[], byte[]>> consumerStreams = _consumerConnector.createMessageStreams(partitionCountForTopic);
它实际上不是 topicName 到 partitionCount 的映射,而是
到你想要的流的数量。每个流提供一个
无限迭代器,因此按预期用途消耗一个线程
(你总是可以在一个线程上组合两个,但你也可以
创建较少的流开始)。
与分区的关系是一个分区总是
向同一个流提供数据。因此,在那之内
stream/thread 您将获得与现在相同的订购保证
在您的 kafka 分区中建模。所以,如果事件 A 发生在
分区 X 中的事件 B,并且分区 X 和分区 Y 都流
到流 1,那么,事件 A 保证在之前被处理
如果按顺序处理流 1,则事件 B。
- 我认为这只是他们选择的设计决策(它们本质上是相同的,两者都可以实现相同的效果)。我唯一能想到的另一件事是每次对
createMessageStreams
的调用都会到达
ZooKeeper 和 Kafka 设置流不管有多少
您获取的流,因此当您
在同一个调用中获取多个。
主题的分区和可以使用Java api创建的流之间的关系是什么?
API 喜欢
背后的基本原理是什么Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = _consumerConnector.createMessageStreams(topicVsPartitionCountMap);
而不是简单地拥有它
List<KafkaStream<byte[], byte[]>> consumerStreams = _consumerConnector.createMessageStreams(partitionCountForTopic);
它实际上不是 topicName 到 partitionCount 的映射,而是 到你想要的流的数量。每个流提供一个 无限迭代器,因此按预期用途消耗一个线程 (你总是可以在一个线程上组合两个,但你也可以 创建较少的流开始)。
与分区的关系是一个分区总是 向同一个流提供数据。因此,在那之内 stream/thread 您将获得与现在相同的订购保证 在您的 kafka 分区中建模。所以,如果事件 A 发生在 分区 X 中的事件 B,并且分区 X 和分区 Y 都流 到流 1,那么,事件 A 保证在之前被处理 如果按顺序处理流 1,则事件 B。
- 我认为这只是他们选择的设计决策(它们本质上是相同的,两者都可以实现相同的效果)。我唯一能想到的另一件事是每次对
createMessageStreams
的调用都会到达 ZooKeeper 和 Kafka 设置流不管有多少 您获取的流,因此当您 在同一个调用中获取多个。