copy from:

http://wiki.sankuai.com/pages/viewpage.action?pageId=591858289

一 Spark Streaming 和 Storm 的对比图

Storm Spark Streaming
消息保证 At Most OnceAt Least OnceExactly Once Exactly Once
支持语言 Clojure/Java Java/Scala/Python
消息传递框架 Netty Netty, Akka
模型 Task_parallelism Data_parallelism
Hadoop 结合 与 Hadoop 结合不好 很好的与 Hadoop 结合
调度 与 zookeeper 结合,自己进行调度 Yarn/Mesos
社区活跃度
是否有状态 无状态 有状态
是否支持 DRPC
消息处理粒度 每次处理一条消息(Trident 可以批处理) 每次处理一批消息
延迟 毫秒级别 秒级别

二 详细对比

1 Storm

Storm是一个以 task 为基本单元的实时计算引擎。Storm 会将计算和数据转换为一个 DAG 图(就是整个 Topology),Topology 从提交之后,会一直运行,直到用户手动终止,或者遇到不可恢复的问题。原生 Storm 不能运行在 Yarn 上,依赖 Zookeeper。Yahoo!Hortonworks 开发了相关的工具,可以让 Storm 运行在 Yarn 上。

Storm 使用 Netty 进行消息传输,也可以选择 ZeroMQ 等框架进行消息传递

Storm 提供 At most once/at least once/exactly once 三种语义的消息保证,exactly once 语义使用 Trident 实现

Storm 主要用于处理时效性要求非常高的任务(毫秒级别),每次处理一条消息,接受到每条消息之后,将会马上进行处理

Storm 是 Task_parallelism 模型

Storm 由 Clojure 语言实现,Clojure 可以理解为 JVM 上的 Lisp,一种纯函数式编程语言

Storm 主要支持用户用 Clojure/Java 进行开发

2 Spark

Spark是一个用于快速处理大数据的引擎,主要用于处理成批的数据。Spark 提供了 Streaming API(即 Spark Streaming),可以持续的运行小批量的计算,直到用户终止,或者遇到不可恢复的错误。Spark 与 Hadoop 结合很好,可以运行在 Yarn 集群上。

Spark 使用 Netty 与 Akka 进行消息传输

Spark 提供恰好一次的消息保证

Spark 一般用于迭代性的计算,可用于 ETL,同时也用于小批量数据的处理(秒级别)

Spark 是 Data_parallelism 模型

Spark 使用 Scala 进行开发,Scala 是运行在 JVM 上的一种 函数式和面向对象结合的语言

Spark 主要支持用户使用 Java/Scala/Python 进行开发

Storm 中 DAG 的顶点是计算,边是数据传输,Spark 中顶点是数据,边是计算

三 如何进行选择

对于用户来说,最关心的是在怎样的情况下,选择怎样的系统,对于 Storm 和 Spark Streaming 这两者的选择,大致可以从如下几个方面进行抉择

  1. 是否需要毫秒级别的延迟,如果需要则使用 Storm
  2. 是否希望和 批处理/离线 任务保持一致的逻辑和代码,是的话,考虑选择 Spark Streaming
  3. 消息的可靠性保证,如果你需要更多的选择(At Most Once,At Least Once),选择 Storm;如果你希望 Exactly Once,建议使用 Spark Streaming,也可以使用 Trident
  4. 是否希望使用程序有状态,如果希望程序无状态,选择 Storm,希望程序有状态,选择 Spark Streaming
  5. 是否希望使用 Scala,是的话选择 Spark Streaming

results matching ""

    No results matching ""