伴随着信息科技突飞猛进的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样、更加便捷,同时对于信息的时效性要求也愈来愈高。举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他但愿的固然是这个宝贝立刻就能够被卖家搜索出来、点击、购买啦,相反,若是这个宝贝要等到次日或者更久才能够被搜出来,估计这个大哥就要骂娘了。再举一个推荐的例子,若是用户昨天在淘宝上买了一双袜子,今天想买一副泳镜去游泳,可是却发现系统在竭尽全力地给他推荐袜子、鞋子,根本对他今天寻找泳镜的行为视而不见,估计这哥们内心就会想推荐你妹呀。其实稍微了解点背景知识的码农们都知道,这是由于后台系统作的是天天一次的全量处理,并且大可能是在夜深人静之时作的,那么你今天白天作的事情固然要明天才能反映出来啦。html
全量数据处理使用的大可能是鼎鼎大名的hadoop或者hive,做为一个批处理系统,hadoop以其吞吐量大、自动容错等优势,在海量数据处理上获得了普遍的使用。可是,hadoop不擅长实时计算,由于它自然就是为批处理而生的,这也是业界一致的共识。不然最近这两年也不会有s4,storm,puma这些实时计算系统如雨后春笋般冒出来啦。先抛开s4,storm,puma这些系统不谈,咱们首先来看一下,若是让咱们本身设计一个实时计算系统,咱们要解决哪些问题。编程
好,若是仅仅须要解决这5个问题,可能会有无数种方案,并且各有千秋,随便举一种方案,使用消息队列+分布在各个机器上的工做进程就ok啦。咱们再继续往下看。api
在2011年Storm开源以前,因为Hadoop的火红,整个业界都在喋喋不休地谈论大数据。Hadoop的高吞吐,海量数据处理的能力使得人们能够方便地处理海量数据。可是,Hadoop的缺点也和它的优势一样鲜明——延迟大,响应缓慢,运维复杂。数组
有需求也就有创造,在Hadoop基本奠基了大数据霸主地位的时候,不少的开源项目都是以弥补Hadoop的实时性为目标而被创造出来。而在这个节骨眼上Storm横空出世了。服务器
Storm带着流式计算的标签华丽丽滴出场了,看看它的一些卖点:app
下面,咱们简单地认识一下Storm这个产品。框架
Storm是一个免费开源、分布式、高容错的实时计算系统。Storm令持续不断的流计算变得容易,弥补了Hadoop批处理所不能知足的实时要求。Storm常常用于在实时分析、在线机器学习、持续计算、分布式远程调用和ETL等领域。Storm的部署管理很是简单,并且,在同类的流式计算工具,Storm的性能也是很是出众的。运维
Storm主要分为两种组件Nimbus和Supervisor。这两种组件都是快速失败的,没有状态。任务状态和心跳信息等都保存在Zookeeper上的,提交的代码资源都在本地机器的硬盘上。机器学习
下图是一个Topology设计的逻辑图的例子。分布式
下图是Topology的提交流程图。
下图是Storm的数据交互图。能够看出两个模块Nimbus和Supervisor之间没有直接交互。状态都是保存在Zookeeper上。Worker之间经过ZeroMQ传送数据。
虽然,有些地方作得仍是不太好,例如,底层使用的ZeroMQ不能控制内存使用(下个release版本,引入了新的消息机制使用netty代替ZeroMQ),多语言支持更可能是噱头,Nimbus还不支持HA。可是,就像当年的Hadoop那样,不少公司选择它是由于它是惟一的选择。而这些先期使用者,反过来促进了Storm的发展。
Storm已经发展到0.8.2版本了,看一下两年多来,它取得的成就:
Transactional topologies和Trident都是针对实际应用中遇到的重复计数问题和应用性问题的解决方案。能够看出,实际的商用给予了Storm不少良好的反馈。
Storm被普遍应用于实时分析,在线机器学习,持续计算、分布式远程调用等领域。来看一些实际的应用:
若是,业务场景中须要低延迟的响应,但愿在秒级或者毫秒级完成分析、并获得响应,并且但愿可以随着数据量的增大而拓展。那就能够考虑下,使用Storm了。
咱们只须要实现每一个分析的过程,而Storm帮咱们把消息的传送和接受都完成了。更加激动人心的是,你只须要增长某个Bolt的并行度就可以解决掉某个结点上的性能瓶颈。
在流式处理领域里,Storm的直接对手是S4。不过,S4冷淡的社区、半成品的代码,在实际商用方面输给Storm不止一条街。
若是把范围扩大到实时处理,Storm就一点都不寂寞了。
固然,Storm也有Yarn-Storm项目,能让Storm运行在Hadoop2.0的Yarn框架上,可让Hadoop的MapReduce和Storm共享资源。
知乎上有一个挺好的问答: 问:实时处理系统(相似s4, storm)对比直接用MQ来作好处在哪里? 答:好处是它帮你作了: 1) 集群控制。2) 任务分配。3) 任务分发 4) 监控 等等。
须要知道Storm不是一个完整的解决方案。使用Storm你须要加入消息队列作数据入口,考虑如何在流中保存状态,考虑怎样将大问题用分布式去解决。解决这些问题的成本可能比增长一个服务器的成本还高。可是,一旦下定决定使用了Storm并解决了那些恼人的细节,你就能享受到Storm给你带来的简单,可拓展等优点了。
技术的发展突飞猛进,数据处理领域愈来愈多优秀的开源产品。Storm的过去是成功的,未来会如何发展,咱们拭目以待吧。
本文的重点是描述Storm的应用场景和将来的发展前景,让你们对Storm有一个初步的印象。若是,要落地使用的朋友,在网上能够找到不少优秀的Storm的技术文章。例如:Storm的核心贡献者徐明明的博客和淘宝关于storm的文章。