我了解这2个之间的区别,但似乎我仍将KTable
用作“默认值”,而不是真正知道何时首选GlobalKTable
。
请分享您的经验,何时必须使用GlobalKTable
,为什么不使用它,等等。
答案 0 :(得分:3)
关键是KTable
已分区,这意味着如果您的基础主题具有N个分区,则负责这些分区的子集的实例将可以访问这些分区上的数据,但不能访问到该实例不管理的分区上的数据。
但是,GlobalKTable
将在实例的 all 中使用主题数据的 all 。例如,您想将其用于一组外部数据的联接,这些外部数据的分区未直接与传入数据链接(或无法预测其关系)。
例如假设您有一个来自users
主题的流,并且具有默认的循环分区,该流具有一个country
字段,并且您需要使用来自用户所在国家/地区的数据来丰富该users
流。然后,您可以将GlobalKTable
与国家/地区的数据一起使用,并加入例如在该国家/地区的users
流中的country GlobalKTable
流。
由于GlobalKTable允许您访问所有潜在的 joinable 数据,因此对于较小的数据,它比KTable效率更高,因为您无需为该联接重新分配数据(所有数据就在那里)。但是您应该注意大小:您必须处理每个分区中的所有数据集。这就是为什么它通常用于有限大小的数据收集中,而且也不是超大数据收集的原因。
如果在KStream
和KTable
之间执行联接,则需要重新分区数据(创建内部主题),以便根据联接键将数据重新分组。
同样,如果您使用的是Processor API,并且从一个实例中查询KTable
,那么您将拥有该实例(而不是其他实例)生成的数据。
更新:另请参见@ matthias-j-sax有关同步的评论。