由于业务的关系,bolt之间的下发一般分为以下几种:
1.一对一,单线条
2.多对一,汇聚式
3.一对多,发散式
至于说 多对多,交叉式,就可以看成是多个一对多来处理,原理也一样
一对一,就不赘述了,基本只要入门storm,都知道怎么搞,
对于多对一,也比较简单,比如我有多个业务bolt,最后都要调用数据入库的bolt,
可以这样处理:
TopologyBuilder topologyBuilder = new TopologyBuilder();
...........
topologyBuilder.setBolt("insertOracle", new HandleInstanceBolt(), 1).shuffleGrouping("前边传入");
topologyBuilder.setBolt("decodeData", new HandleDataBolt(), 1).shuffleGrouping("前边传入");
//以上两个bolt都要下发给DbServiceBolt处理,这样处理分配两个不同的Id就可以
topologyBuilder.setBolt("dbService1", new DbServiceBolt(), 1).shuffleGrouping("insertOracle");
topologyBuilder.setBolt("dbService2", new DbServiceBolt(), 1).shuffleGrouping("decodeData");
本质还是一对一,只不过是把同一个bolt多复用的一下
对于一对多,比如有一份原始数据,多个地方都需要使用,并且可以并行,那就分发给多个bolt,
还是以上边的代码为例,HandleDataBolt把数据分发给多个bolt
首先在要下发的bolt里先要把多个下发数据结构初始化好:
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
List<String> fields = new ArrayList<>();
fields.add("key");
fields.add("crcId");
fields.add("diviceId");
fields.add("data");
outputFieldsDeclarer.declareStream("DbServiceBolt_1", new Fields(fields));
List<String> fields1 = new ArrayList<>();
fields1.add("map");
fields1.add("key");
fields1.add("data");
fields1.add("diviceId");
outputFieldsDeclarer.declareStream("DbServiceBolt_2", new Fields(fields1));
}
业务里选择合适的条件下发:
@Override
public void execute(Tuple tuple) {
/**
*省略前后逻辑
*/
if(Id > 0){
Values values = new Values();
values.add(key);
values.add(diviceId);
collector.emit("DbServiceBolt_1", values);
}else{
Values values2 = new Values();
/**
*省略参数
*/
collector.emit("DbServiceBolt_2", values2 );
}
}
TopologyBuilder topologyBuilder = new TopologyBuilder();
...........
topologyBuilder.setBolt("decodeData", new HandleDataBolt(), 1).shuffleGrouping("前边传入");
//用多个bolt接收就可以,一定要注意这里的对应关系,Id和类名都不同,只有接收的上个bolt的id相同
topologyBuilder.setBolt("dbService1", new DbServiceBolt_1(), 1).localOrShuffleGrouping("decodeData","DbServiceBolt_1");
topologyBuilder.setBolt("dbService2", new DbServiceBolt_2(), 1).localOrShuffleGrouping("decodeData","DbServiceBolt_2");
注意
localOrShuffleGrouping() 和 shuffleGrouping()的区别,
这样就大功告成了