首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个子拓扑的Kafka流应用程序优化

具有多个子拓扑的Kafka流应用程序优化
EN

Stack Overflow用户
提问于 2018-07-05 23:19:57
回答 1查看 1.7K关注 0票数 0

我正在运行一个有三个子拓扑的Kafka流应用程序。活动阶段大致如下:

  1. stream主题A
  2. selectKey和重新划分主题A to主题B
  3. stream主题B
  4. foreach主题B到主题C Producer
  5. stream主题C
  6. 主题C to主题D

主题A、B和C都是物化的,这意味着如果每个主题有40个分区,我的最大并行性是120。

起初,我运行5个流应用程序,每个线程有8个线程。有了这个设置,我的表现就不一致了。似乎有些共享相同线程的子拓扑比其他线程更渴望CPU,过了一段时间,我会得到这样的错误:Member [client_id] in group [consumer_group] has failed, removing it from the group (kafka.coordinator.group.GroupCoordinator)。一切都会得到重新平衡,这可能导致性能下降,直到下一次失败和再平衡。

我的问题如下:

  1. 如何能够在一个线程上运行多个子拓扑?投票队列?
  2. 每个线程如何决定如何将计算资源分配给每个子拓扑?
  3. 在这种情况下,您如何优化线程与主题的分区比率,以避免周期性的使用者失败?1:1的比例会确保更一致的表现吗?
  4. 如果您使用1:1的比率,那么如何确保每个线程都分配自己的主题分区,而一些线程不会闲置?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-06 02:01:26

  1. 线程将轮询()不同子拓扑的所有主题,并检查记录topic元数据以将其输入正确的任务。
  2. 每个子拓扑都是相同的,也就是说,如果您愿意的话,可用的资源是均匀分布的。
  3. 只有当你有足够的核心时,1:1的比例才是有用的。我建议监视您的CPU利用率。如果它太高(大于80%),您应该添加更多的内核/线程。
  4. 卡夫卡流会自动为你处理这个问题。

几项一般性意见:

  • 您可能会考虑增加max.poll.interval.ms配置,以避免使用者退出组。
  • 您可以考虑减少max.poll.records,以减少每个poll()调用的记录,从而缩短对poll()的两个连续调用之间的时间。
  • 注意,max.poll.records并不意味着增加网络/代理通信--如果单个获取请求返回比max.poll.records配置更多的记录,数据只是在使用者内部缓冲,下一个poll()将从缓冲的数据中得到服务,从而避免代理往返。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51201092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档