一项调查发现,九成企业的数据量在迅速上涨,其中16%企业的数据量每年增长0.5倍甚至更多。调研机构IDC在2011年6月的报告显示,全球数据量在2011年已达到1.8ZB,在过去5年里增加了5倍。1.8ZB是什么样的概念呢?如果把所有这些数据都刻录存入普通DVD光盘里,光盘的高度将等同于从地球到月球的一个半来回也就是大约72万英里。相当于每位美国人每分钟写3条推特微博,而且还要不停地写2.6976万年,是不是很恐怖?这还不是最恐怖的,IDC预测全球数据量大约每两年翻一番,2015年全球数据量将达到近8ZB,到2020年,全球将达到35ZB。
上面话是引用自前不久看的《一本书读懂大数据》,不知道看到这样的描述,你是否震惊了?反正我是惊到了,怎么那么多数据!!!
废话不多说,回归正题,数据多了,就会面临两个问题:
- 如何存储?
- 如何比较快地分析?
今天我们只关注第二个问题:怎么快速地分析数据?世界上聪明人那么多,只要有难题,肯定会有人去想办法,今天的两个主角:Apache storm和Spark streaming就是这些聪明人的劳动成果。
Apache storm
Storm是一个分布式的,可靠的,容错的数据流处理系统。它会把工作任务委托给不同类型的组件,每个组件负责处理一项简单特定的任务。Storm集群的输入流由一个被称作spout的组件管理,spout把数据传递给bolt, bolt要么把数据保存到某种存储器,要么把数据传递给其它的bolt。你可以想象一下,一个Storm集群就是在一连串的bolt之间转换spout传过来的数据。
Spark streamig
Spark是一个类似于MapReduce的分布式计算框架,其核心是弹性分布式数据集(RDD),提供了比MapReduce更丰富的模型,可以在快速在内存中对数据集进行多次迭代,以支持复杂的数据挖掘算法和图形计算算法。Spark Streaming是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力。
两者对比
关于这两者的详细原理与使用方法在这里就不介绍了,这儿主要从以下几个方面对这两个框架做一下对比:
处理模型与延迟
Storm处理的是每次传入的一个事件(虽然Storm trident支持batch),Spark streaming处理的是一个事件窗口内的所有事件。单从处理模型就能知道,storm的延迟要比spark streaming稍好一点。在这个方面,storm略优。
容错
在Storm中,每一个消息从创建开始就会被跟踪(ACK服务负责),所以它能够保证一个消息一定会被处理,也能够保证严格只被处理一次(这可以使用storm trident的事务机制实现)。
在Spark streaming中,由于其数据模型RDD(弹性分布式数据集)设计得比较巧妙,每一个RDD都是只读的,并且都只能从外部数据源创建或者由其他RDD经过转换操作创建。此外每一个RDD都记录了它的生成方法,所以当某些RDD没有被处理或者丢失了,就可以根据这个RDD的生成方法重新计算一遍即可,比较简单高效。在这个方面spark streaming略优。
API易用性
Storm有Java版的API,使用还是比较简单方便的,也可以使用Storm trident API。Spark streamin是使用scala语言实现的,虽然也有Java版和python版的api,但是使用java编写一个spark程序要比使用scala写的代码多得多,主要是因为scala支持函数式编程,且代码表达能力比Java强大。在这个方面,见仁见智吧,我倒是觉得区别不大。
生态系统
在这个方面,我觉的spark streamin要更胜一筹。因为:
- Spark streamin是基于Spark的,Spark这一套系统能够做的事情太多了,比如批处理,机器学习,图形计算等等,每一个公司想必都会希望使用一套统一的架构去做很多事情吧。
- Spark streaming能够运行在YARN和Mesos上,而Storm只能运行在Mesos(据说借助第三方支出组件也能运行在YARN,但是毕竟不是原生支持嘛)
- …
产品成熟度
Storm 2011年出来的,目前属于少年阶段吧;Spark 2013年出来的,目前属于小孩阶段,还是有很多的不足,稳定性当然也不一定能够保证!所以如果你对数据处理有非常严格的要求,还是使用storm吧,安全!(个人意见,勿喷,毕竟我刚接触大数据…)
总结
我两个月前才刚开始接触Storm,两周前才开始接触Spark,对比起来,我还是更喜欢spark,因为spark是万能的,虽然有点夸张。