Kafka Streams只提供KGroupedTable

时间:2018-01-22 15:14:53

标签: java apache-kafka apache-kafka-streams

我的Kafka Streams应用程序如下:

static KafkaStreams build(AppConfig appConfig, SerdesHelper serdes) {
  final KStreamBuilder builder = new KStreamBuilder();

  builder
      .table(serdes.sourceKeySerde, serdes.sourceValueSerde, appConfig.sourceTopic)
      .groupBy(StreamBuilder::groupByMapper, serdes.intSerde, serdes.longSerde)
      .aggregate(
          StreamBuilder::initialize,
          StreamBuilder::add,
          StreamBuilder::subtract,
          serdes.sinkValueSerde)
      .to(serdes.intSerde, serdes.sinkValueSerde, appConfig.sinkTopic);

  return new KafkaStreams(builder, appConfig.streamConfig);
}

我的具体示例将记录分组如下

((k, v)) -> ((k), v[])

在使用只有两个唯一密钥的3.000.000条消息的虚拟数据运行时,我在不到一分钟的时间内在sinkTopic内收到大约10.000条消息,我希望得到4/6(基于在我设法停止申请的那一刻)。

如何确保只将具有最新分组值的密钥提交回Kafka而不是每条中间消息?

1 个答案:

答案 0 :(得分:0)

它是流处理,而不是批处理。没有"最新的分组值" - 输入是无限的,因此输出是无限的......

您只能通过

减少中间产品的数量
  1. 增加KTable缓存大小(但这似乎不是一个问题,因为你只有2个唯一键,因此如果你没有禁用缓存,它们都适合缓存或
  2. 增加提交间隔