跟我一块儿云计算(1)——storm

概述

最近要作一个实时分析的项目,因此须要深刻一下storm。java

为何storm

综合下来,有如下几点: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的架构:

S3.jpg

指南

在这个指南中,你将学到如何建立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-starter包含不少使用storm的示例。若是你第一次使用storm,首先了解一下它的架构:

  1. ExclamationTopology: Java编写的基本示例
  2. WordCountTopology: 和python一块儿使用的例子
  3. ReachTopology: 复杂的DRPC的例子

当你熟悉了上面的示例以后,能够在in src/jvm/storm/starter/ 下例如RollingTopWords 去熟悉一些更高级的实现。

若是你要学习更多的示例,能够到Storm project page.

使用storm-starter

使用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结合起来,也许处理实时的大数据真的很难!

相关文章
相关标签/搜索