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 这两者的选择,大致可以从如下几个方面进行抉择
- 是否需要毫秒级别的延迟,如果需要则使用 Storm
- 是否希望和 批处理/离线 任务保持一致的逻辑和代码,是的话,考虑选择 Spark Streaming
- 消息的可靠性保证,如果你需要更多的选择(At Most Once,At Least Once),选择 Storm;如果你希望 Exactly Once,建议使用 Spark Streaming,也可以使用 Trident
- 是否希望使用程序有状态,如果希望程序无状态,选择 Storm,希望程序有状态,选择 Spark Streaming
- 是否希望使用 Scala,是的话选择 Spark Streaming