26

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

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

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

如果我明白了

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

但:

  • Samza 将每个工作人员(即作业)分别复制到多个任务(输入流中的每个分区一个)。也就是说,任务是工作流的工作人员的副本。

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

这让我想到了我的问题:

  1. 假设只有一个分区:这是否正确,不能在 Kafka Streams 中的两台不同机器上部署工作程序(A)和(B),而这在 Samza 中是可能的?(或者换句话说:在Kafka Streams中是否不可能将单个任务(即拓扑副本)拆分到两台机器上,无论是否有多个分区。)

  2. Kafka Streams 拓扑中的两个后续处理器(在同一个任务中)如何通信?(我知道在 Samza 中,两个后续工作人员(即工作)之间的所有通信都是通过 Kafka 主题完成的,但是由于必须在代码中明确地在 Kafka Streams 中“标记”哪些流必须作为 Kafka 主题发布,所以这不能就是这里的情况。)

  3. Samza 还自动将所有中间流作为 Kafka 主题发布(从而使它们可供潜在客户使用),而 Kafka Streams 只发布那些明确标记的中间和最终流(addSink在低级 API 和to/或throughDSL 中),这是否正确? )?

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

4

1 回答 1

13

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

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

或者:

输入(Kakfa 主题 X)-->(工人 A)--> 中间(Kafka 主题 Z)-->(工人 B)--> 输出(Kafka 主题 Y)

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

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

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

stream1.filter(..).filter(..)

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

对于后一种情况,您可以指示中间流在另一个主题中“物化”,即:

stream1.filter(..).through("topicZ").filter(..)

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

于 2016-12-30T01:13:20.163 回答