先丢个官网链接
本章博客依赖官网
第一步,先放依赖:
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-jdbc</artifactId>
<version>${storm.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
我们先在mysql中创建一个简单的测试表
CREATE TABLE wc(
word varchar(20),
count int
)
在这里我们只需要编写一个spout接收数据,和一个bolt进行wordcount数据即可,逻辑与之前Storm整合Redis一致,这边直接贴代码
编写第一个spout
public static class DataSourceSpout extends BaseRichSpout {
//由于需要发送数据,所以定义一个SpoutOutputCollector
private SpoutOutputCollector collector;
@Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
//初始化SpoutOutputCollector
this.collector = collector;
}
//这边我们自定义一个数组
public static final String[] words = new String[]{"apple","banana","orange","strawberry",};
@Override
public void nextTuple() {
//我们通过随机读取数组的方式生成数据进行测试
Random random = new Random();
String word = words[random.nextInt(words.length)];
//这边为了防止刷屏,我们设定sleep一秒
Utils.sleep(1000);
//发送数据
this.collector.emit(new Values(word));
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
//声明输出字段,和上面发送的数据相对应
declarer.declare(new Fields("word"));
}
}
编写下一个bolt
public static class CountWords extends BaseRichBolt{
//由于需要发送数据,所以定义一个SpoutOutputCollector
private OutputCollector collector;
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
//初始化SpoutOutputCollector
this.collector = collector;
}
//定义一个map存放数据
Map<String,Integer> map = new HashMap<>();
@Override
public void execute(Tuple input) {
//抓取上面发送过来的数据
String word = input.getStringByField("word");
Integer i = map.get(word);
if (i == null){
i = 0;
}
i++;
map.put(word,i);
//这边输出遗传字符串方便测试
System.out.println("emit : "+word + " "+map.get(word));
//将word和count发送出去
this.collector.emit(new Values(word,map.get(word)));
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
//注意这边发送的字段名必须与数据库的字段名一致
declarer.declare(new Fields("word","count"));
}
}
重点在于main方法的编写:
结合官网:
public static void main(String[] args) {
//这串代码从官网中可以直接拷贝,只需要修改几项
Map hikariConfigMap = Maps.newHashMap();
hikariConfigMap.put("dataSourceClassName","com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
//分别修改这边的url,user,password
hikariConfigMap.put("dataSource.url", "jdbc:mysql://localhost/spark");
hikariConfigMap.put("dataSource.user","root");
hikariConfigMap.put("dataSource.password","root");
ConnectionProvider connectionProvider = new HikariCPConnectionProvider(hikariConfigMap);
//这边设置表名
String tableName = "wc";
JdbcMapper simpleJdbcMapper = new SimpleJdbcMapper(tableName, connectionProvider);
JdbcInsertBolt userPersistanceBolt = new JdbcInsertBolt(connectionProvider, simpleJdbcMapper)
.withTableName(tableName)
.withQueryTimeoutSecs(30);
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("DataSourceSpout",new DataSourceSpout());
builder.setBolt("CountWords",new CountWords()).shuffleGrouping("DataSourceSpout");
//这边直接使用setBolt函数将上面定义的JdbcInsertBolt 设置进去
builder.setBolt("JdbcInsertBolt",userPersistanceBolt).shuffleGrouping("CountWords");
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("LocalWCStormRJDBCTop",new Config(),builder.createTopology());
}
查看mysql:
每次接受的数据都写入了表中,这样Storm整合JDBC就算完成了