1.在使用fieldgrouping的时候并行度失效问题
问题现象如下图所示,所有的词都在同一个线程同一个对象中
拓扑图代码如下
如果将拓扑图使用fieldgrouping换成shuffleGrouping则会出现多个线程。
代码如下
FieldBolt类:
package com.wuzh.storm.group; import backtype.storm.task.OutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseRichBolt; import backtype.storm.tuple.Tuple; import java.util.Map; public class FieldBolt extends BaseRichBolt { @Override public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) { } @Override public void execute(Tuple tuple) { System.out.println("我是 "+Thread.currentThread()+"线程!"); System.out.println("我是"+this+",从上游获取的数据:"+ tuple); } @Override public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) { } }
FieldSpout类:
package com.wuzh.storm.group; import backtype.storm.spout.SpoutOutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseRichSpout; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Values; import java.util.Map; public class FieldSpout extends BaseRichSpout { //声明一个SpoutOutputCollector用于发送数据 private SpoutOutputCollector collector; //声明一个计数器 //private int number; private String str[] = {"aa","bb","cc","dd"}; @Override public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) { //获取初始化的发送器 collector=spoutOutputCollector; } @Override public void nextTuple() { int i = (int)(Math.random()*4); this.collector.emit(new Values(str[i])); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("Word")); //declarer.declare(new Fields("num","word")); } }
FieldTopology类
import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.generated.StormTopology; import backtype.storm.topology.TopologyBuilder; import backtype.storm.tuple.Fields; public class FieldTopology { public static void main(String[] args) { //创建任务的拓扑图 TopologyBuilder topologyBuilder = new TopologyBuilder(); //设置拓扑关系(spout) topologyBuilder.setSpout("fieldSpout",new FieldSpout()); //设置拓扑关系(bolt) topologyBuilder.setBolt("fieldBolt", new FieldBolt(),4) //.setNumTasks(4) .fieldsGrouping("fieldSpout",new Fields("Word")); //.shuffleGrouping("numberSpout"); //启动Topology Config conf = new Config(); conf.setDebug(false); StormTopology topology = topologyBuilder.createTopology(); //本地模式启动 LocalCluster localCluster = new LocalCluster(); localCluster.submitTopology("FieldTopology",conf,topology); } }