1.什么是拓扑
要使用storm做实时计算,首先需要创建所谓的“拓扑”。一个拓扑是一个有向图的计算。在一个拓扑中的每个节点包含处理逻辑,节点之间的连接显示数据应该如何在节点之间传递。
2.Topology
TopologyBuilder是构建拓扑的类,用于指定执行的拓扑。拓扑底层是Thrift结构,由于Thrift API非常冗长,使用TopologyBuilder可以极大地简化建立拓扑的过程。
注:百度百科一下thrift。
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
创建和提交拓扑的过程如下:首先,使用new关键字创建一个topologyBuilder对象,然后调用setSpout方法设置Spout,接着调用setBolt方法设置Bolt,最后调用createTopology方法返回StormTopology对象给submitTopology方法作为输入参数。
如:
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("word", new WordSpout());
builder.setBolt("ExclamationBolt", new ExclamationBolt()).shuffleGrouping("word");
builder.setBolt("MergeBolt", new MergeBolt()).allGrouping("ExclamationBolt");
Config conf = new Config();
// 集群模式
StormSubmitter.submitTopology(args[0], conf, builder.createTopology());
// 本地模式
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("word", conf, builder.createTopology());
3.流分组
3.1什么是流分组
流分组是拓扑定义的一部分,为每个bolt指定应该接收哪个流作为输入。流分组定义了流/元组如何在bolt的任务之间进行分发。
在集群中,spout和bolt并行执行许多任务。如果你在任务层看拓扑是怎样执行的,则会看到流分组的示意图,如:
Storm内置了七种流分组方式。
3.2随机分组
shuffle grouping对各个task的tuple分配的比较均匀。
3.3字段分组
fieldsGrouping
这种grouping机制保证相同field值的tuple会去同一个task,这对于WordCount来说非常关键,如果同一个单词不去同一个task,那么统计出来的单词次数就不对了。
3.4广播分组
All grouping
是指流被发送到所有Bolt的任务中。
3.5全局分组
Global grouping
Stream中的所有的tuple都会发送给同一个bolt任务处理,所有的tuple将会发送给拥有最小task_id的bolt任务处理。
3.6无分组
None grouping
3.7直接分组
Direct grouping
3.8自定义分组