2013年参与开发了一个类似storm的自研系统, 2014年使用过spark 4个多月,对这两个系统都有一些了解。
下面是我关于这两个系统的简单对比:
Spark:
1. 基于数据并行,。相同的操作作用在数据的不同部分,利用transformation的pipeline提高性能。
2. 本质上是batch processing,latency 通常> 1s。
3. RDD是spark的核心,封装了分布式的细节,即partition和根据lineage恢复数据。shuffle牵涉到数据在网络间的移动,为了容错,中间结果要落地磁盘,因此在一些应用中会是瓶颈。
4. RDD是immutable和coarse granularity,简化了设计。
5. 比较像优化(扩展)了MapReduce的计算框架,并将数据放进了内存,加速迭代计算,非常适合于迭代式应用,比如机器学习,adhoc查询,图计算等。
Storm:
1. 基于任务并行。。请求(或者说event)流进系统依次被topology上的task执行。不同task是并行(concurrent)执行。
2. 本质是realtime processing, latency 通常 < 1s。(Storm Trident支持批处理)。
3. 资源管理(在哪些机器上起task)和task间通信是storm的核心。
4. 比较像传统的实时后台系统多个模块(application)拼接成一个大的应用。
所以,可以看到spark和storm有不同的应用场景。能和storm比较的是spark streaming. spark streaming是一个spark的流式处理器,
基本的原理是:将一个时间窗口的数据收集起来,转换成RDD,再根据业务逻辑生成新的RDD,最后遍历结果RDD,把数据发出去。
spark streaming是一个分布式系统,也有分布式系统的复杂性。比如,receiver failure的时候,可能会丢数据。
参考资料:
1. spark paper。
2. committer的报告。Yahoo compares Storm and Spark。
3. committer的报告。storm和spark streaming的对比。