apache samza和apache kafka流的区别(关注并行性和通信)

ef1yzkbh  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(486)

在samza和kafka流中,数据流处理是在处理步骤(samza中称为“job”,kafka流中称为“processor”)的序列/图形(samza中称为“dataflow graph”,kafka流中称为“topology”)中执行的。在本问题的其余部分,我将把这两个术语称为工作流和工作者。
假设我们有一个非常简单的工作流,由一个worker a组成,该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-型号
正确地说,samza和kafka流都使用主题分区概念来复制工作流/工作者,从而并行处理以实现可伸缩性。
但是:
samza将每个worker(即job)分别复制到多个任务中(输入流中的每个分区对应一个任务)。也就是说,任务是工作流工作进程的副本。
kafka streams一次将整个工作流(即拓扑)复制到多个任务(输入流中的每个分区对应一个任务)。也就是说,任务是整个工作流的副本。
这就引出了我的问题:
假设只有一个分区:在kafka流中,不可能在两台不同的机器上部署worker(a)和(b),而在samza中这是可能的,这是正确的吗(或者换句话说:在kafka流中,是否不可能将单个任务(即拓扑副本)拆分为两台机器,而不管是否有多个分区。)
kafka流拓扑中的两个后续处理器(在同一任务中)如何通信(我知道在samza中,两个后续工作人员(即作业)之间的所有通信都是通过kafka主题完成的,但是由于必须在代码中明确地在kafka流中“标记”哪些流必须发布为kafka主题,所以这里不可能是这种情况。)
samza也自动发布所有中间流作为kafka主题(从而使它们对潜在客户可用),而kafka流只发布那些显式标记的中间流和最终流(使用 addSink 在底层api和 to 或者 through 在dsl中)?
(我知道samza也可以使用kafka以外的其他消息队列,但这与我的问题并不相关。)

z9smfwbn

z9smfwbn1#

首先,在samza和kafka流中,您可以选择是否在这两个任务(处理器)之间有一个中间主题,即拓扑可以是:
输入(kakfa主题x)-->(worker a)-->(worker b)-->输出(kafka主题y)
或:
输入(kakfa主题x)-->(工作者a)-->中间(kafka主题z)-->(工作者b)-->输出(kafka主题y)
在samza或kafka流中,在前一种情况下,您必须同时部署worker a和b,而在后一种情况下,您不能同时部署worker a或b,因为在这两种框架中,任务只能通过中间主题进行通信,并且没有基于tcp的通信通道。
在samza中,对于前一种情况,您需要将两个过滤器编码为一个任务,对于后一种情况,您需要为每个任务指定输入和输出主题,例如,对于worker a,输入是x,输出是z;对于work b,输入是z,输出是y,您可以独立地启动/停止部署的worker。
在kafka流中,对于前一种情况,您可以像这样“连接”这些处理器

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

结果就像lucas提到的那样,第一个过滤器的每个结果都会立即传递给第二个过滤器(您可以认为topic x中的每个输入记录以深度优先顺序遍历拓扑,并且任何直接连接的处理器之间都没有缓冲);
对于后一种情况,您可以在另一个主题中指示要“物化”的中间流,即:

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

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

相关问题