1.定义
Storm就是一个分布式实时大规模数据流的处理框架。官网上的定义是:Storm is a distributed real time computation system,Storm exposes a set of primitives for doing real time computation。
官网: http://storm.apache.org/
2.优势
Extremely broad set of use cases
Scalable
Guarantees no data loss
Extremely robust
Fault-tolerant
Programming language agnostic
这里有详细的说明: http://storm.apache.org/documentation/Rationale.html。
3.概念
Storm Cluster分两类节点,master node和worker node,各自的deamon是Nimbus和Supervisor,为了管理,中间加了一个Zookeeper,结构如下:
Nimbus和Supervisor是stateless和fail-fast的,而zooKeeper负责管理他们,即便他们挂了,Zookeeper也能唤醒并使之继续执行。Nimbus主要负责任务分配,而supervisor主要负责具体任务的管理工作。
Topologies则是对数据逻辑与信息传递的抽象,是一个重点概念。数据如何去处理,处理的数据发到哪里,主要就是这个概念了。它下面还有Spout和Bolt。
Stream是Storm各个概念的重点。官方概念:A stream is an unbounded sequence of tuples.。这个框架本身提供了数据流处理的方法,将一般的数据加工成合适的数据。先看图。
Spout是数据流的源,bolt则要以数据流作为其输入。
tuple,不言而喻,是基本处理的数据抽象。字有些多,我偷懒,直接贴原文了。
3.简单例子
用官网的例子。
Storm有两种模式,local和distributed,前者是本地线程模拟,主要测试,后者是用实际的机器的,实际效果好。
```
java Config conf = new Config();
conf.setDebug(true);
conf.setNumWorkers(2);
LocalCluster cluster = new LocalCluster();
cluster.submitTopology(“test”, conf, builder.createTopology());
Utils.sleep(10000);
cluster.killTopology(“test”);
cluster.shutdown();
```
例子中,运行10s后,结束。
Stream grouping
组件之间如何发送tuples,如图;
```
java TopologyBuilder builder = new TopologyBuilder();
builder.setSpout(“sentences”, new RandomSentenceSpout(), 5);
builder.setBolt(“split”, new SplitSentence(), 8) .shuffleGrouping(“sentences”);
builder.setBolt(“count”, new WordCount(), 12) .fieldsGrouping(“split”, new Fields(“word”));
```
SplitSentence将句子分为词,返回;WordCount持有一个Map,接受一个词,统计,返回这个词。