【问题标题】:parallel writes different topics from single stream topic并行从单个流主题写入不同的主题
【发布时间】:2020-12-10 17:15:59
【问题描述】:

我有一个流,它将消息映射到两个不同的 map() 调用,并进一步被过滤并写入两个不同的主题。

KStream<String, byte[]>[] stream = builder.<String, byte[]>stream("source-topic");

stream.map(logic1OnData).filter(
                (key, value) -> {
                    if (key == null || value == null)
                        return false;
                    return value.data() != null;
                }).to("topic1", Produced.with(Serdes.String(), Serdes.String())

stream.map(logic2OnData).filter(
                (key, value) -> {
                    if (key == null || value == null)
                        return false;
                    return value.data() != null;
                }).to("topic2", Produced.with(Serdes.String(), Serdes.String())

有没有办法可以并行运行 stream.map(logc1OnData)... 和 stream.map(logic2OnData)? 看起来他们一个接一个地运行,即第一个地图被执行并写入 topic1 然后执行第二张地图并将其写入主题2 仅供参考.. 我不希望 num.threads.count 因为我的流输入来自单个主题,并且我正在运行同一应用程序的多个实例以从源主题主题中读取以在消费时实现并行性。

我正在寻找的是在执行和写入不同主题时的并行性

【问题讨论】:

    标签: apache-kafka apache-kafka-streams kafka-producer-api kafka-topic node-kafka-streams


    【解决方案1】:

    您正在查看的是您的操作添加到拓扑中的顺序。执行拓扑后,记录器将按照到达的顺序流经 otpology,但logic2OnData 不会等待logic1OnData 在运行之前完成处理。

    如果您担心性能,如果您想获得更多并行性,可以查看stream threads

    编辑:看来我可能误解了这个问题。

    单个子拓扑不允许您以并行方式运行每个分支。但是,您可以使用 repartition() 将 logic2OnData 制作成它自己的子拓扑,并且 repartition() 调用之后的所有内容都将能够与其之前的所有内容并行运行。

    【讨论】:

    • 您能详细说明一下吗?我希望 logic2OnData 应该与 logic1OnData 并行执行并进一步写入他们自己的主题。我看到它一个接一个地发生,而不是并行发生。我正在运行同一个应用程序的多个实例,但想让这两个子任务在每个实例中并行运行。
    • 正如@wcarlosn 所解释的,您的程序是一个单/全连接的Topology,因此它由一个线程执行。查看Topology#describe() 的输出,可以看到只有一个子拓扑。子拓扑是一个并行单元,它只在分区之间进行并行化:为每个分区创建一个所谓的任务,并由一个事物线程执行一个任务;任务中没有并行性。 (参见docs.confluent.io/platform/current/streams/architecture.html
    • 如果你真的想获得更多的并行性,你需要将你的拓扑拆分为多个子拓扑:子拓扑是你的整体拓扑的一部分,它们仅通过主题相互连接。如果您按照@wcarlson 的建议插入repartition(),您将获得两个子拓扑,因此将为每个子拓扑创建任务。因此,这些任务可以并行执行。 -- 你仍然需要增加num.stream.thread,因为如果你只有一个线程,它一次只能执行一个任务,因此,if只会“循环”通过所有分配的任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2020-11-05
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    相关资源
    最近更新 更多