最近要作一个实时分析的项目,因此须要深刻一下storm。java
综合下来,有如下几点:python
1. 生逢其时git
MapReduce 计算模型打开了分布式计算的另外一扇大门,极大的下降了实现分布式计算的门槛。有了MapReduce架构的支持,开发者只须要把注意力集中在如何使用 MapReduce的语义来解决具体的业务逻辑,而不用头疼诸如容错,可扩展性,可靠性等一系列硬骨头。一时间,人们拿着MapReduce这把榔头去敲 各类各样的钉子,天然而然的也试图用MapReduce计算模型来解决流处理想要解决的问题。各类失败的尝试以后,人们意识到,改良MapReduce并 不能使之适应于流处理的场景,必须发展出全新的架构来完成这一任务(MapReduce不适合作流处理的缘由Yahoo!在其S4的介绍论文里面有比较详 细的阐述,而UCBerkeley的SparkStreaming项目如今正在尝试挑战这一结论,感兴趣的同志请自行查看)。另外一方面,人们对传统的 CEP解决方案心存疑虑,认为其非分布式的架构可扩展性不够,没法scaleout来知足海量的数据处理要求。这时候,Yahoo!的S4以及 Twitter的Storm恰到好处的挠到了人们的痒处。github
2. 可扩展性编程
更加明确的说,是scaleout的能力。所谓Scale out (http://en.wikipedia.org/wiki/Scalability#Scale_horizontally_.28scale_out.29), 简单来讲就是当一个集群的处理能力不够用的时候,只要往里面再追加一些新的节点,计算有能力迁移到这些新的节点来知足须要。可能的状况下,选择 Scaleout 而非Scale up,这个观念已经深刻人心。通常来讲,实现Scaleout的关键是Shared nothing architecture,即计算所须要的各类状态都是自知足的,不存在对特定节点强依赖,这样,计算就能够很容易的在节点间迁移,整个系统计算能力不够 用的时候,加入新的节点就能够了。Storm的计算模型自己是Scaleout友好的,Topology 对应的Spout和Bolt并不须要和特定节点绑定,能够很容易的分布在多个节点上。此外,Storm还提供了一个很是强大的命令 (rebalance),能够动态调整特定Topology中各组成元素(Spout/Bolt)的数量以及其和实际计算节点的对应关系。ruby
3. 系统可靠性架构
Storm 这个分布式流计算框架是创建在Zookeeper的基础上的,大量系统运行状态的元信息都序列化在Zookeeper中。这样,当某一个节点出错时,对应 的关键状态信息并不会丢失,换言之Zookeeper的高可用保证了Storm的高可用。文档(https://github.com /nathanmarz/storm/wiki/Fault-tolerance)讨论了Storm各个子系统的错误冗余行为,能够进一步参考。框架
4. 计算的可靠性jvm
分 布式计算涉及到多节点/进程之间的通讯和依赖,正确的维护全部参与者的状态和依赖关系,是一件很是有挑战性的任务。Storm实现了一整套机制,确保消息 会被完整处理(https://github.com/nathanmarz/storm/wiki/Guaranteeing-message- processing)。 此外,经过TransactionalTopology(https://github.com/nathanmarz/storm/wiki /Transactional-topologies) ,Storm能够保证每一个tuple“被且仅被处理一次”。maven
5. Opensource
这个就不用多说了,开源使得Storm社区及其活跃,到本文写做的时候,Storm已经发展到了0.81,Storm的使用者已经有了一个长长的名单(https://github.com/nathanmarz/storm/wiki/Powered-By),其中不乏好比淘宝,支付宝,Twitter,Groupon这种互联网巨头。
6. Clojure基础上的实现
Storm的核心代码是Clojure和Java。Clojure是一门JVM基础上的函数式编程语言(http://clojure.org/), 是支持STM(SoftwareTransactional Memory)的少数几门语言之一。Clojure推出以来,获得了普遍关注,人们广泛认为,其函数式编程所具备的各类特性能在分布式环境中大有用武之 地, 而Storm则给出了一个很好的实例。从另外一个角度来讲,Storm也能大大的推进Clojure的普及。
总言之,时势造英雄,Storm在正确的时间出如今了正确的地点,并且刚恰好作了正确的事情,想不红都没有道理。
从高来看storm的架构:
在这个指南中,你将学到如何建立strom架构和部署它的集群。Java将是示例中用到的主要语言,在其它的一些示例中将使用python来描述strom支持多语言的能力。
先安装strom,能够参考:
http://my.oschina.net/leejun2005/blog/147607?from=20130804
上面的文章里面已经描述的很清楚了。
能够先从示例storm-starter开始学习strom。
地址是:
https://github.com/nathanmarz/storm-starter
你须要安装git和java而后设置这个用户的环境变量。另外还有两个示例须要安装python和ruby。
而后建立新目录下载storm-starter
$ git clone git://github.com/nathanmarz/storm-starter.git && cd storm-starter
storm-starter包含不少使用storm的示例。若是你第一次使用storm,首先了解一下它的架构:
当你熟悉了上面的示例以后,能够在in src/jvm/storm/starter/ 下例如RollingTopWords 去熟悉一些更高级的实现。
若是你要学习更多的示例,能够到Storm project page.
使用storm-starter有多种方式,可使用Leiningen或者maven。这里使用maven。
首先编译:
mvn -f m2-pom.xml compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=storm.starter.WordCountTopology
而后打包:
mvn -f m2-pom.xml package
运行测试:
mvn -f m2-pom.xml test
而后就是把打包的jar包发送到storm里运行了。
下面就是咱们正在处理的项目中使用的架构,还在讨论阶段,也但愿对这个有看法的童鞋发表一下本身的观点:
古有“即生瑜,何生亮”,不过我以为若是没有瑜和亮,可能谁都没法战胜曹操,和如今的架构一下,若是不是把流框架storm和任务处理框架hadoop结合起来,也许处理实时的大数据真的很难!