1元组

storm初级教程 002 strom基础教程_赋值

public void execute(Tuple input) {
this.collector.emit(new Values("元组values1","元组values2"));
this.collector.ack(input);// 提供可靠性保障
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
//声明一个输出流,其中tuple包括了单词和对应的计数,向后发射
//其他bolt可以订阅这个数据流进一步处理
declarer.declare(new Fields("元组key1","key2"));
}

由元组的定义可以知道declarer.declare中key的数据和emit发射的value数量需相等

2流stream

不同于元组,流是抽象概念,是无界的元组序列【无界也就是说消息源可以源源不断的输入实时数据】,这些数据在拓扑上被传递计算,这些数据形象的被抽象成stream 其中OutputFieldsDeclarer不仅申明流还可以申明模式

storm初级教程 002 strom基础教程_数据_02

storm初级教程 002 strom基础教程_storm基础概念_03

以上的执行都是针对同一拓扑,不同拓扑之间互不影响

 

3spout数据源

其特性如下:1 支持可靠(在拓扑上完成为可靠)[ack(),fail()方法]和不可靠特性 ,2nextTuple会被不停调用,[如果没有新的元组则调用不产生影响]

3 storm可以发布多个流【申明,赋值,emit】4 一个拓扑可以申明多个spout

storm初级教程 002 strom基础教程_storm基础概念_04

 

 

4Bolt 闪电

总是订阅spout或者上游的bolt 并使用execute进行执行

订阅的时候根据流分组策略进行订阅并获取相应的元组,流分组默认有8种策略也可以扩展CustomStreamGrouping自定义

builder.setBolt(SPLIT_BOLT_ID, splitBolt,2).setNumTasks(4).shuffleGrouping(SENTENCE_SPOUT_ID);

5 拓扑

执行任务的抽象,类似于mapreduce任务,但其永远不会停止除非主动杀死或意外宕掉

 

6 task vs executor

 任务: 每个spout bolt的上进行计算的线程称为任务,一个bolt可以有多个线程,例如并行为2 


builder.setBolt(BOLT_ID, splitBolt,2)


执行器:storm0.8以后 ,多个task可能共享物理线程,这个线程称为执行器

【笔者认为可能是利用线程池复用资源】