【问题标题】:GlobalKtable initialization durationGlobalKtable 初始化持续时间
【发布时间】:2021-02-08 19:51:24
【问题描述】:

我正在寻找建议。 我必须使用 GlobalKtables 来处理大量主题并加入我的处理器。 连接涉及 80Go - 8 个分区 主题和 50Go 单个分区 主题。

当我的 java 处理器启动时,它会基于这 2 个主题创建 2 个 GlobalKTables。 在消费这个的同时,我做我的生意,一切都很好。

我在每个主题上使用非常少量的数据对其进行了测试,并且效果很好。 这是 GKT init 的片段:

myStreamBuilder.globalTable(myTopicName, Consumed.with(Serdes.String(), myDbziumSerdes))

但是,当在我的环境中部署之前描述的大量主题时,我的应用程序似乎“初始化”GlobalKTables 已经 8 小时了。而且似乎没有新的事件被处理。

问题:

  • 我可以使用 GlobalKTables 吗?
  • 对我的处理器安装的内存占用有什么影响 这些 GlobalKTables?
  • 还有其他更好的方法吗?

我曾考虑使用数据库而不是 GlobalKTables 来防止这个初始化时间,但它需要重新开发处理器的主要部分。

环境: 爪哇 14 卡夫卡 2.5.1

【问题讨论】:

    标签: java apache-kafka-streams debezium rocksdb


    【解决方案1】:

    使用GlobalKTable 意味着Kafka 主题将完全复制到属于您的application.id 的每个KafkaStreams,无论是在内存中还是在磁盘上(即RocksDB),具体取决于您如何实现StateStore

    GlobalKTable 用于与KStream 执行连接,使用的连接键可以与输入流的键不同,而无需重新划分输入主题。

    通常,GlobalKTable 用于具体化包含参考数据或随时间缓慢变化的数据的主题。

    GlobalKTable 的一个缺点是 KafkaStreams 只使用一个全局线程来管理所有全局表。这就是为什么多个GlobalKTable 的初始化可能需要一段时间,几秒钟到几小时。

    要优化初始化,您可以覆盖/增加这些设置:

    // for global consumer (default values).
    streamsConfig.put(StreamsConfig.globalConsumerPrefix(ConsumerConfig.MAX_POLL_RECORDS_CONFIG), 1000);
    streamsConfig.put(StreamsConfig.globalConsumerPrefix(ConsumerConfig.FETCH_MAX_BYTES_CONFIG), 52428800);
    streamsConfig.put(StreamsConfig.globalConsumerPrefix(ConsumerConfig.MAX_PARTITION_FETCH_BYTES_CONFIG), 1048576);
    streamsConfig.put(StreamsConfig.globalConsumerPrefix(ConsumerConfig.RECEIVE_BUFFER_CONFIG), 65536);
    

    此外,GlobalKTable 的输入主题应该被压缩(即cleanup.policy=compact)。此外,您可以尝试减小主题的段大小(例如减少到 100MB)以增加段轮换的频率,从而进行更积极的压缩。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-11
      • 2020-02-17
      • 2017-05-26
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 2012-10-06
      相关资源
      最近更新 更多