当使用 1 个分区时,何时在 KTable 上使用 GlobalKTable
When to use GlobalKTable over KTable when 1 partition is used
我理解两者之间的区别,但是,我似乎仍然将 KTable
用作 "default",我真的不知道什么时候更喜欢 GlobalKTable
.
请分享您的经验,什么时候必须使用 GlobalKTable
,为什么不使用它等等。
关键是 KTable
是分区的,这意味着如果您有一个包含 N 个分区的基础主题,则负责这些分区子集的实例将可以访问这些分区上的数据,但不是此实例未管理的分区上的数据。
但是,GlobalKTable
将使用 all 个实例中的 all 个主题数据。例如,您希望将它用于与一组外部数据的连接,这些数据的分区与传入数据没有直接链接(或者无法预测其关系)。
例如假设您有一个来自 users
主题的流,具有默认的循环分区,它有一个 country
字段,并且您需要使用来自用户国家/地区的数据来丰富该 users
流。然后,您可以使用带有国家/地区数据的 GlobalKTable
,并加入例如users
流与那个 country GlobalKTable
在国家/地区。
由于 GlobalKTable 允许您访问所有潜在的 joinable 数据,因此对于较小的数据,它比 KTable 更有效,因为您不需要重新分区数据对于该连接(所有数据都在那里)。但是您应该注意大小:您必须处理每个分区中的所有数据集。这就是为什么它通常用于有限大小的数据集合,也不是超大的。
如果您在 KStream
和 KTable
之间执行连接,则需要重新分区数据(创建内部主题),以根据连接键重新分组数据。
类似地,如果您使用处理器 API,如果您从一个实例查询 KTable
,您将拥有该实例生成的数据,而不是另一个实例生成的数据实例。
更新:另请参阅@matthias-j-sax 对同步的评论。
我理解两者之间的区别,但是,我似乎仍然将 KTable
用作 "default",我真的不知道什么时候更喜欢 GlobalKTable
.
请分享您的经验,什么时候必须使用 GlobalKTable
,为什么不使用它等等。
关键是 KTable
是分区的,这意味着如果您有一个包含 N 个分区的基础主题,则负责这些分区子集的实例将可以访问这些分区上的数据,但不是此实例未管理的分区上的数据。
但是,GlobalKTable
将使用 all 个实例中的 all 个主题数据。例如,您希望将它用于与一组外部数据的连接,这些数据的分区与传入数据没有直接链接(或者无法预测其关系)。
例如假设您有一个来自 users
主题的流,具有默认的循环分区,它有一个 country
字段,并且您需要使用来自用户国家/地区的数据来丰富该 users
流。然后,您可以使用带有国家/地区数据的 GlobalKTable
,并加入例如users
流与那个 country GlobalKTable
在国家/地区。
由于 GlobalKTable 允许您访问所有潜在的 joinable 数据,因此对于较小的数据,它比 KTable 更有效,因为您不需要重新分区数据对于该连接(所有数据都在那里)。但是您应该注意大小:您必须处理每个分区中的所有数据集。这就是为什么它通常用于有限大小的数据集合,也不是超大的。
如果您在 KStream
和 KTable
之间执行连接,则需要重新分区数据(创建内部主题),以根据连接键重新分组数据。
类似地,如果您使用处理器 API,如果您从一个实例查询 KTable
,您将拥有该实例生成的数据,而不是另一个实例生成的数据实例。
更新:另请参阅@matthias-j-sax 对同步的评论。