Apache Samza 和 Apache Storm 在用例上有何不同?

Where do Apache Samza and Apache Storm differ in their use cases?

我偶然发现 this article 声称确实将 Samza 与 Storm 进行了对比,但它似乎只是解决了实现细节。

这两个分布式计算引擎在用例上有何不同?每种工具适合什么样的工作?

这是 Tony Siciliani 的一篇文章,其中提供了 Storm、Spark 和 Samza 的用例(和体系结构)比较。 Apache.org 下面还提供了指向实际用例的链接。

https://tsicilian.wordpress.com/2015/02/16/streaming-big-data-storm-spark-and-samza/

关于 Samza 和 Storm 的用例,他写道:

All three frameworks are particularly well-suited to efficiently process continuous, massive amounts of real-time data. So which one to use? There are no hard rules, at most a few general guidelines.

Apache Samza

If you have a large amount of state to work with (e.g. many gigabytes per partition), Samza co-locates storage and processing on the same machines, allowing to work efficiently with state that won’t fit in memory. The framework also offers flexibility with its pluggable API: its default execution, messaging and storage engines can each be replaced with your choice of alternatives. Moreover, if you have a number of data processing stages from different teams with different codebases, Samza ‘s fine-grained jobs would be particularly well-suited, since they can be added/removed with minimal ripple effects.

A few companies using Samza: LinkedIn, Intuit, Metamarkets, Quantiply, Fortscale…

Samza 用例列表:https://cwiki.apache.org/confluence/display/SAMZA/Powered+By

Apache 风暴

If you want a high-speed event processing system that allows for incremental computations, Storm would be fine for that. If you further need to run distributed computations on demand, while the client is waiting synchronously for the results, you’ll have Distributed RPC (DRPC) out-of-the-box. Last but not least, because Storm uses Apache Thrift, you can write topologies in any programming language. If you need state persistence and/or exactly-once delivery though, you should look at the higher-level Trident API, which also offers micro-batching.

A few companies using Storm: Twitter, Yahoo!, Spotify, The Weather Channel…

Storm 用例列表:http://storm.apache.org/documentation/Powered-By.html

Apache Storm 和 Apache Samza 之间的最大区别在于它们如何流式传输数据以进行处理。

Apache Storm 使用拓扑进行实时计算,并将其馈送到集群中,主节点在集群中将代码分发到执行代码的工作节点中。在拓扑中,数据在喷口之间传递,喷口将数据流作为不可变的键值对集吐出。

这是 Apache Storm 的架构:

Apache Samza 通过一次一条地处理消息来进行流处理。流被分成多个分区,这些分区是一个有序序列,每个分区都有一个唯一的 ID。它支持批处理,通常与 Hadoop 的 YARN 和 Apache Kafka 一起使用。

这是 Apache Samza 的架构:

在下面详细了解每个系统执行细节的具体方式。

用例

Apache Samza 由 LinkedIn 创建。

一位软件工程师写道 a post siting:

它已经在 LinkedIn 投入生产多年,目前在多个数据中心的数百台机器上运行。我们最大的 Samza 作业是在高峰流量时段每秒处理超过 1,000,000 条消息。

使用的资源:

Storm vs. Samza Comparison

Useful Architectural References of Storm and Samza

好吧,几个月来我一直在研究这些系统,我认为它们在用例方面没有太大区别。我认为最好按照以下方式比较它们:

  1. 年龄: Storm 是较旧的项目,也是本 space 中的原始项目,因此它通常更成熟且经过实战检验。 Samza 是一个较新的第二代项目,似乎从 Storm 中吸取了教训。
  2. Kafka: Samza 源于 Kafka 生态系统,并且非常以 Kafka 为中心。例如,文档说它们允许插入不同的消息系统……只要它们提供与 Kafka 类似的分区、排序和重放语义。 Storm 是一个较旧的系统,并不是专门用于与 Kafka 一起工作。
  3. 复杂性: Samza,部分原因是它对其环境做出了更强的假设("you can have any infrastructure you like as long as it works like Kafka"),部分原因是它更新,让我觉得它通常比 Storm 更简单,以一种好的方式。但 Samza 更简单的一个可能不太好的方法是它(故意?)缺乏 Storm 的 topologies(复杂执行图)的概念。如果您需要一个复杂的多级处理器,则需要将其实现为通过 Kafka 进行通信的独立任务。这有利也有弊,但 Samza 为您做出选择,而 Storm 为您提供更多选择。
  4. 状态管理: 许多 Storm 应用程序在需要维护大量状态以处理传入的元组时需要使用外部存储,如 Redis。这种情况似乎是激发 Samza 设计的主要因素之一; Samza 最显着的特点之一是它为其任务提供基于本地磁盘的 key/value 存储,以便在需要时用于此目的。