Kafka Streams中subtopology是什么?如何通过Topology.describe查看子拓扑?
Kafka Streams Sub-Topology 相关问题解答
1. Sub-Topology的具体定义
Sub-Topology是Kafka Streams对逻辑拓扑做物理拆分后的最小可执行单元,本质是一组可以在单线程内连续处理数据、无需跨网络shuffle交互的处理器节点集合。
运行时每个Sub-Topology会被封装为独立的任务实例,分配到不同的流处理线程上执行,不同Sub-Topology之间通过Kafka内部主题传递数据,彼此没有直接的调用依赖,是Kafka Streams任务调度和并行计算的基本单位。
2. 会生成新Sub-Topology的算子
所有触发数据重分区/Shuffle的操作都会拆分节点组,生成新的Sub-Topology,常见算子包括:
- 分组聚合类:
groupBy、groupByKey、count、reduce、aggregate - 重分区类:
repartition、各类Join算子(流流Join、流表Join、表表Join) - 所有需要跨节点状态同步的有状态算子
无状态转换类算子不会触发Sub-Topology拆分,会和上游节点归属到同一个Sub-Topology中,包括map、filter、flatMap、peek等。
3. 让Topology.describe()返回子拓扑信息的方法
Kafka Streams从2.5版本开始,Topology.describe()原生支持返回所有Sub-Topology的元数据,无需额外配置,构建完拓扑后直接调用即可,示例代码如下:
// 完成拓扑构建逻辑 Topology topology = streamsBuilder.build(); // 调用describe方法获取完整拓扑描述 TopologyDescription topologyDescription = topology.describe(); // 遍历获取所有子拓扑信息 Set<TopologyDescription.Subtopology> subtopologies = topologyDescription.subtopologies(); for (TopologyDescription.Subtopology subtopology : subtopologies) { // 可按需获取子拓扑ID、包含的处理器节点、关联的源/汇主题等信息 System.out.println("子拓扑ID:" + subtopology.id()); System.out.println("包含的处理器节点:" + subtopology.nodes()); }
如果使用的是2.5之前的旧版本,可通过打印拓扑的字符串输出、或者反射调用InternalTopologyBuilder的节点组相关方法获取子拓扑信息,更推荐升级到高版本使用原生API获取。
内容的提问来源于stack exchange,提问作者Jacek Laskowski
相关产品推荐
相关产品推荐

