2.storm学习之接口实现及代码发布集群
已单词计数为列,代码列子参见《Storm分布式实时计算模式》一书;
代码github地址:https://github.com/yuexianbing/storm_test;
基础概念:
- Storm的核心结构是tuple,无限制的tuple组成的序列即为Stream;
- spout是storm topology的主要数据入口;
- bolt接收spout的数据,对数据计算后可输出多个数据流,bolt可订阅多个由spout或bolt发射的数据;
Storm的数据流分组:
Storm内置了7种数据流分组方式:
- Shuffle grouping(随机分组):随机将tuple分发给bolt的各task,每个bolt接收到相同数量的tuple;
- Field group(按字段分组):将所有具有相同字段值的tuple路由到同一个bolt的task;
- All grouping(全复制分组):将所有的tuple复制后分发给所有的bolt task。每个订阅数据流的task都会接收到tuple的拷贝;
- Golble grouping(全局分组):将所有的tuples路由到唯一的一个task上。storm按最小的taskId来选取接收数据的task。这种分组,将所有的tuple转发到一个jvm实例,可能会引起集群中某一个节点崩溃;
- None grouping(部分组):功能上和随机分组相同;
- Direct grouping(指向型分组):数据源调用emitDirect()方法判断一个tuple应由哪个Storm组件接收;
- Local or shhuffle grouping(本地或随机分组):如果worker内由接收数据的bolt task,storm会将tuple分发给同一个worker内的bolt task。其他情况下采用随机分组。本地或随机分组可减少网络传输,从而提高topology的性能。
spout接口实现:
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;
import java.util.Map;
/**
* @author yuebing
* @version 1.0 2017/9/4
*/
public class SentenceSpout extends BaseRichSpout {
private SpoutOutputCollector outputCollector;
private String[] sentence = {
"I have a dog",
"The dog is big dog",
"Tt's name is huahua",
"It is a brave dog"
};
private int index = 0;
@Override
public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
this.outputCollector = spoutOutputCollector;
}
//提交tuple
@Override
public void nextTuple() {
if (index < sentence.length) {
this.outputCollector.emit(new Values(sentence[index]));
index++;
}
}
//发射tuple
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("sentence"));
}
}