Kafka Streams“map-side”加入就像字典查找一样

时间:2016-09-21 21:56:52

标签: apache-kafka apache-kafka-streams

这个问题是Kafka Streams with lookup data on HDFS的后续问题。 我需要加入(如“地图侧”连接)小字典数据到主Kafka流

AFAIK,Kafka Stream实例始终适用于主题的给定分区。如果我想做查找, 我需要为连接键重新分配两个流,以将相关记录放在一起。

如果需要检查多个查找数据,多次来回重新分配的成本是多少? 无法将整个查找数据集发送到每个分区,因此当我从查找中构建KTable时 主题,我将在所有Kafka Stream应用程序实例中看到整个数据集。 因此,我可以在KStream#transform()方法中进行查找,这将使本地RocksDB存储与所有 我有查询数据。

我想知道哪个选项更合适:

  • 将相同数据(整个数据集)插入主题的每个分区,并在KStream#transform中执行查找。 当主题过分时,我们会有很多重复数据,但对于一个小数据集,这应该不是问题。

  • 使用DSL API对两个流进行重新分区,以便能够执行查找(连接)。 这方面的表现有什么影响?

1 个答案:

答案 0 :(得分:5)

  

AFAIK,Kafka Stream实例始终适用于主题的给定分区。如果我想进行查找,我需要为连接键重新分配两个流,以便将相关记录放在一起。

是的,从Apache Kafka 0.10.0和0.10.1开始,这就是你需要做的。

  

如果需要检查多个查找数据,多次来回重新分配的成本是多少?无法将整个查找数据集发送到每个分区,因此当我从查找主题构建KTable时,我将在所有Kafka Stream应用程序实例中看到整个数据集。

这样的功能 - 我们经常把它描述为"全球KTable"或者"全球状态" - 确实很有用,我们已经在讨论何时/如何添加它。

2017年2月28日更新:Kafka 0.10.2发布了围绕全局表的第一轮功能,您可以在其中执行KStream-to-GlobalKTable连接

  

使用DSL API对两个流进行重新分区,以便能够执行查找(连接)。在性能方面有什么影响?

其影响主要取决于输入数据的特征(数据量,统一与偏斜的数据分布等)。