当前位置: 首页 > 知识库问答 >
问题:

Apache Samza和Apache Kafka Streams之间的区别(关注并行性和通信)

罗渝
2023-03-14

在Samza和Kafka流中,数据流处理是在处理步骤(在Samza中称为“dataflow graph”,在Kafka流中称为“topology”)的序列/图(在Samza中称为“job”,在Kafka流中称为“processor”)中执行的。

假设我们有一个非常简单的工作流程,由一个工作者a组成,该工作者a消耗传感器测量值并过滤所有低于50的值,然后是一个工作者B,该工作者B接收剩余的测量值并过滤所有高于80的值。

输入(Kakfa主题X)-->(工作者A)-->(工作者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流都使用主题分区概念来复制工作流/工作者,从而为可伸缩性目的并行化处理。

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

这就引出了我的问题:

>

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

  • 共有1个答案

    邢焕
    2023-03-14

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

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

    或:

    在Samza或Kafka流中,在前一种情况下,您必须将工作者A和B部署在一起,而在后一种情况下,您不能将工作者A或B部署在一起,因为在这两种框架中,任务仅通过中间主题进行通信,并且没有基于TCP的通信通道。

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

    在Kafka流中,对于前一种情况,您可以将这些处理器“串联”起来,如

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

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

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

    stream1.filter(..).through("topicZ").filter(..)
    
     类似资料:
    • 本文向大家介绍串行和并行传输之间的区别,包括了串行和并行传输之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,当计算机/笔记本电脑之间进行数据传输时,可能会有两种类型的数据传输,即串行或并行。根据这两种传输方式的不同特征,我们可以对其进行区分。 以下是串行传输和并行传输之间的重要区别- 序号 键 串行传输 平行传输 1 定义 串行传输是一种传输类型,其中单个通信链路用于将数据从一端传输

    • 我试图使用@consume注释bean使用通过spring JmsTemplate发送的JMS消息。当使用JMSTemplate发送消息时,使用者不接收消息。 然而,当使用Camel的ProducerTemplate发送时,将接收消息。 @org.springframework.jms.annotation.jMSListener和@org.apache.camel.consume之间有什么区别?

    • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

    • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。

    • 问题内容: PHP和Javascript有什么区别? 我知道一个是服务器端脚本,另一个是浏览器端。但是我要问的是,使用Javascript可以显示警报消息,我也可以简单地使用PHP来执行警报消息,而无需使用任何功能或使用if- else组合。 那么PHP和Javascript是排他性的吗,比如如果我使用一个,那么就不应该使用另一个,或者? 问题答案: 什么是差异黑白PHP和JavaScript 大