storm多个bolt之间多对一或一对多下发

由于业务的关系,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()的区别,

这样就大功告成了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值