gpt4 book ai didi

apache-kafka - Apache Samza 和 Apache Kafka Streams 的区别(关注并行和通信)

转载 作者:行者123 更新时间:2023-12-03 13:36:09 24 4
gpt4 key购买 nike

在 Samza 和 Kafka Streams 中,数据流处理在处理步骤(在 Samza 中称为“作业”,在 Kafka Streams 中称为“处理器”)的序列/图(在 Samza 中称为“数据流图”,在 Kafka Streams 中称为“拓扑”)中执行)。
在本问题的其余部分中,我将这两个术语称为工作流和工作人员。

假设我们有一个非常简单的工作流程,由一个 worker A 使用传感器测量并过滤所有低于 50 的值,然后是一个 worker B 接收剩余的测量并过滤所有高于 80 的值。

输入(Kakfa 主题 X)-->( worker A)-->( worker B)--> 输出(Kafka 主题 Y)

如果我明白了

  • http://samza.apache.org/learn/documentation/0.11/introduction/concepts.html
  • http://docs.confluent.io/3.1.1/streams/architecture.html#parallelism-model

  • 正确地,Samza 和 Kafka Streams 都使用主题分区概念来复制工作流/工作人员,从而为可扩展性目的并行处理。

    但:
  • Samza 将每个工作人员(即作业)分别复制到多个任务(输入流中的每个分区一个)。也就是说,任务是工作流的工作人员的副本。
  • Kafka Streams 一次将整个工作流程(即拓扑)复制到多个任务(输入流中的每个分区一个)。也就是说,任务是整个工作流程的复制品。

  • 这让我想到了我的问题:
  • 假设只有一个分区:这是否正确,不能在 Kafka Streams 中的两台不同机器上部署工作程序 (A) 和 (B),而在 Samza 中这是可能的? (或者换句话说:在Kafka Streams中是否不可能将单个任务(即拓扑副本)拆分到两台机器上,无论是否有多个分区。)
  • Kafka Streams 拓扑中的两个后续处理器(在同一个任务中)如何通信? (我知道在 Samza 中,两个后续工作人员(即工作)之间的所有通信都是通过 Kafka 主题完成的,但是由于必须在代码中明确地在 Kafka Streams 中“标记”哪些流必须作为 Kafka 主题发布,所以不能就是这种情况。)
  • Samza 是否也自动将所有中间流作为 Kafka 主题发布(从而使它们可供潜在客户使用),而 Kafka Streams 只发布那些明确标记的中间和最终流(在低级 API 中使用 addSinktothrough 在 DSL 中)?

  • (我知道 Samza 还可以使用 Kafka 以外的其他消息队列,但这与我的问题并不真正相关。)

    最佳答案

    首先,在 Samza 和 Kafka Streams 中,您可以选择是否在这两个任务(处理器)之间设置一个中间主题,即拓扑可以是:

    Input (Kakfa topic X) --> (Worker A) --> (Worker B) --> Output (Kafka topic Y)



    或者:

    Input (Kakfa topic X) --> (Worker A) --> Intermediate (Kafka topic Z) -->(Worker B) --> Output (Kafka topic Y)



    在 Samza 或 Kafka Streams 中,在前一种情况下,您必须将 Worker A 和 B 一起部署,而在后一种情况下,您不能同时部署 Worker A 或 B,因为在任一框架任务中都只能通过中间主题进行通信,并且没有基于 TCP 的通信 channel 。

    在 Samza 中,对于前一种情况,您需要将两个过滤器编码为一个任务,对于后一种情况,您需要为每个任务指定输入和输出主题,例如对于 Worker A,输入为 X,输出为 Z,对于 Work B,输入为 Z,输出为 Y,您可以独立启动/停止部署的 worker。

    在 Kafka Streams 中,对于前一种情况,您可以像“连接”这些处理器一样
    stream1.filter(..).filter(..)

    结果就像 Lucas 提到的那样,第一个过滤器的每个结果将立即传递给第二个过滤器(您可以认为来自主题 X 的每个输入记录以深度优先排序遍历拓扑,并且任何直接之间没有缓冲连接的处理器);

    对于后一种情况,您可以指示中间流在另一个主题中“物化”,即:
    stream1.filter(..).through("topicZ").filter(..)

    并且第一个过滤器的每个结果都将发送到主题 Z,然后将其通过管道传输到第二个过滤器处理器。在这种情况下,这两个过滤器可能会部署在不同的主机或同一主机内的不同线程上。

    关于apache-kafka - Apache Samza 和 Apache Kafka Streams 的区别(关注并行和通信),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41064078/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com