模拟了一个重复发射相同语句的execute过程。
具体解释见
https://blog.csdn.net/qq_44698610/article/details/102755830
依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ujiuye.hadoop1105</groupId>
<artifactId>test2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.10</version>
</dependency>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
<!--指定java编译版本,固定配置即可-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
项目结构:一个spout两个bolt,此处命名不规范。一个driver;
spout:
package com.uu;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.IRichSpout;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;
import java.util.Map;
/**
* Created by Administrator on 2019/10/26.
*/
public class Spout implements IRichSpout {
//设置发射器
SpoutOutputCollector spoutOutputCollector = null;
@Override
//初始化
public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
this.spoutOutputCollector = spoutOutputCollector;
}
@Override
//发射tuple,此处单词统计表现为将单词包装为map形式。发射给下一个bolt。
//由框架不停的调用。
public void nextTuple() {
String str = "what is my name";
spoutOutputCollector.emit(new Values(str));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
//设置输出字段的个数,供下游使用
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
//设置字段下游识别
outputFieldsDeclarer.declare(new Fields("count"));
}
@Override
public void ack(Object o) {
}
@Override
public void fail(Object o) {
}
@Override
public void close() {
}
@Override
public void activate() {
}
@Override
public void deactivate() {
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
第一个bolt:
package com.uu;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.IRichBolt;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
import java.util.Map;
/**
* Created by Administrator on 2019/10/26.
*/
public class CountBolt implements IRichBolt {
//设置发射器。
OutputCollector outputCollector = null;
@Override
public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
this.outputCollector = outputCollector;
}
@Override
public void execute(Tuple tuple) {
String count = tuple.getStringByField("count");
if(count != null){
String[] split = count.split(" ");
for (String s : split) {
outputCollector.emit(new Values(s,1));
}
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
//字段设置要与发射的吻合
outputFieldsDeclarer.declare(new Fields("one","two"));
}
@Override
public void cleanup() {
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
第二个bolt:
package com.uu;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.IRichBolt;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.tuple.Tuple;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Administrator on 2019/10/26.
*/
public class ExecuteBole implements IRichBolt {
//使用map来统计结果
Map<String,Integer> map = new HashMap();
@Override
public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
}
@Override
public void execute(Tuple tuple) {
String one = tuple.getStringByField("one");
int i = tuple.getInteger(1);
if(map.containsKey(one)){
Integer integer = map.get(one);
integer+=i;
map.put(one,integer);
}else {
map.put(one,i);
}
System.out.println(Thread.currentThread().getId()+one+map.get(one));
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
}
@Override
public void cleanup() {
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
driver:
package com.uu;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.tuple.Fields;
/**
* Created by Administrator on 2019/10/26.
*/
public class Driver {
public static void main(String[] args) throws Exception {
//拓扑构建器
TopologyBuilder topologyBuilder = new TopologyBuilder();
//设置spout与bolt
//整个串联起来。
topologyBuilder.setSpout("spout",new Spout(),1);
//次数设置以shuffer的方式来获取数据。shuffer表示来源随机分组。
topologyBuilder.setBolt("countBolt",new CountBolt(),1).shuffleGrouping("spout");
//第二个bolt的数据来源于第一个bolt。
topologyBuilder.setBolt("countBolt1",new ExecuteBole(),2).fieldsGrouping("countBolt",new Fields("one"));
//设置worker数量
Config config = new Config();
config.setNumWorkers(4);
// 4 提交到storm集群
if (args.length > 0) {
StormSubmitter.submitTopology("websiteTopo", config, topologyBuilder.createTopology());
} else {
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("websiteTopo", config, topologyBuilder.createTopology());
}
}
}