Kafka Streams:不对分区数据进行重新分区的地图

时间:2018-07-19 11:36:52

标签: apache-kafka apache-kafka-streams

我有一个基础主题为[K3,V]的KStream。 K3是由三个字段组成的密钥,即K3(a,b,c)。但是,仅按关键字字段的子集(即K2(a,b))对主题进行了划分。

现在,我想创建一个KTable来与我的PAPI处理器连接并在其中使用。我希望此KTable通过K2(a,b)进行汇总。聚合只是将值收集到集合中。

为此,我必须使用“映射”功能将我的密钥从K3转换为K2。通过创建新的重新分区主题,这将(尝试)对数据进行分区(尽管实际上数据将保留在同一分区中,因为它也将K2用作分区键),请参见下面拓扑中的“ test-customerStoreName-repartition”。

  Sub-topology: 0
Source: KSTREAM-SOURCE-0000000000 (topics: [test-customerz])
  --> KSTREAM-MAP-0000000003
Processor: KSTREAM-MAP-0000000003 (stores: [])
  --> KSTREAM-FILTER-0000000006
  <-- KSTREAM-SOURCE-0000000000
Processor: KSTREAM-FILTER-0000000006 (stores: [])
  --> KSTREAM-SINK-0000000005
  <-- KSTREAM-MAP-0000000003
Sink: KSTREAM-SINK-0000000005 (topic: test-customerStoreName-repartition)
  <-- KSTREAM-FILTER-0000000006

有没有一种方法可以进行聚合而不必通过map重新分区?

1 个答案:

答案 0 :(得分:1)

无法使用DSL,因为您无法告知库不需要重新分区。

您将需要直接使用Processor API,因为Processor API不会进行任何自动分区。

您还可以“破解”某些东西:在map()之后,可以将返回的KStream转换为KStreamImpl类型,然后通过反射可以设置内部标志{{1 }}到repartitionRequired。但这是黑客!

相关问题