storm-jdbc详解

                                    今天来说说Storm集成Jdbc是如何完成的,代码如下:

写入数据:

先来讲讲官方API:

Map hikariConfigMap = Maps.newHashMap();
hikariConfigMap.put("dataSourceClassName","com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
hikariConfigMap.put("dataSource.url", "jdbc:mysql://localhost/test");
hikariConfigMap.put("dataSource.user","root");
hikariConfigMap.put("dataSource.password","password");
ConnectionProvider connectionProvider = new HikariCPConnectionProvider(hikariConfigMap);

String tableName = "user_details";//表名
JdbcMapper simpleJdbcMapper = new SimpleJdbcMapper(tableName, connectionProvider);

JdbcInsertBolt userPersistanceBolt = new JdbcInsertBolt(connectionProvider, simpleJdbcMapper)
                                    .withTableName("user")
                                    .withQueryTimeoutSecs(30);
                                    Or//这里使用表名就不要用下面的SQL了,2选1
JdbcInsertBolt userPersistanceBolt = new JdbcInsertBolt(connectionProvider, simpleJdbcMapper)
                                    .withInsertQuery("insert into user values (?,?)")
                                    .withQueryTimeoutSecs(30);                    

如果storm元组的字段与你打算写入的数据库表中的列名称具有相同的名称。要使用 SimpleJdbcMapper。

Map hikariConfigMap = Maps.newHashMap();
hikariConfigMap.put("dataSourceClassName","com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
hikariConfigMap.put("dataSource.url", "jdbc:mysql://localhost/test");
hikariConfigMap.put("dataSource.user","root");
hikariConfigMap.put("dataSource.password","password");
ConnectionProvider connectionProvider = new HikariCPConnectionProvider(hikariConfigMap);
String tableName = "user_details";
JdbcMapper simpleJdbcMapper = new SimpleJdbcMapper(tableName, connectionProvider);
//以上是整个表直接加载进去,但是如果你的ID是自增的或者有其他值是默认的,则需要使用inster to sql语句了。

例如,如果你的插入查询是Insert into user (user_id, user_name) values (?,?)

List<Column> columnSchema = Lists.newArrayList(
    new Column("user_id", java.sql.Types.INTEGER),
    new Column("user_name", java.sql.Types.VARCHAR));
JdbcMapper simpleJdbcMapper = new SimpleJdbcMapper(columnSchema);

读取数据就很简单了,我就不去讲解官方API,直接贴我写的代码了:

import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;

import java.util.Map;
/**
 * @author cwc
 * @date 2018年5月31日  
 * @description:存储数据的spout,我的读与写共用的这一个spout
 * @version 1.0.0 
 */
public class JdbcSpout extends BaseRichSpout {
	private static final long serialVersionUID = 1L;
	private SpoutOutputCollector collector;

	@Override
	public void nextTuple() {
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//这里因为时间原因,我就简写2个值,你可以自己造点别的类型的假数据跑跑
        this.collector.emit(new Values("peter",111));
        System.out.println("信息加载中---------------------");
	}

	@Override
	public void open(Map arg0, TopologyContext arg1, SpoutOutputCollector collector) {
		this.collector =collector;
	}

	@Override
	public void declareOutputFields(OutputFieldsDeclarer declarer) {
		declarer.declare(new Fields("name", "age"));
	}

}
import java.util.Map;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;

/**
 * @author cwc
 * @date 2018年5月30日  
 * @description:打印拿到的数据
 * @version 1.0.0 
 */
public class JdbcOutBolt extends BaseRichBolt{

	private OutputCollector collector;
	@Override
	public void execute(Tuple tuple) {
				String str =tuple.getString(0);
				System.out.println(str);
				
	}

	@Override
	public void prepare(Map arg0, TopologyContext arg1, OutputCollector collector) {
		// TODO Auto-generated method stub
		this.collector=collector;
	}

	@Override
	public void declareOutputFields(OutputFieldsDeclarer declarer) {
		declarer.declare(new Fields("JdbcOutBolt"));
	}
	
	
}
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.jdbc.bolt.JdbcInsertBolt;
import org.apache.storm.jdbc.bolt.JdbcLookupBolt;
import org.apache.storm.jdbc.common.Column;
import org.apache.storm.jdbc.common.ConnectionProvider;
import org.apache.storm.jdbc.common.HikariCPConnectionProvider;
import org.apache.storm.jdbc.mapper.JdbcMapper;
import org.apache.storm.jdbc.mapper.SimpleJdbcLookupMapper;
import org.apache.storm.jdbc.mapper.SimpleJdbcMapper;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.tuple.Fields;
import java.sql.Types;
import com.google.common.collect.Lists;
/**
 * @author cwc
 * @date 2018年5月31日  
 * @description:
 * @version 1.0.0 
 */
public class JdbcMain {
	public static void main(String[] args){
		
			Map<String,Object> hikariConfigMap = new HashMap<String, Object>(){{
			put("dataSourceClassName", "com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
			put("dataSource.url", "jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai");
			put("dataSource.user", "root");
			put("dataSource.password", "0992");}};
			ConnectionProvider connectionProvider = new HikariCPConnectionProvider(hikariConfigMap);
			
			JdbcWrite( connectionProvider);
//			JdbcRead( connectionProvider);
	}
	/**
	 * 写
	 * @param connectionProvider
	 */
	public static void JdbcWrite(ConnectionProvider connectionProvider){
		List<Column> columnSchema = Lists.newArrayList(
				new Column("name", java.sql.Types.VARCHAR),
			    new Column("age", java.sql.Types.INTEGER));
			JdbcMapper simpleJdbcMapper = new SimpleJdbcMapper(columnSchema);
			JdbcInsertBolt PersistanceBolt = new JdbcInsertBolt(connectionProvider, simpleJdbcMapper)
                    .withInsertQuery(" insert into storms(name,age) values (?,?) ")
                    .withQueryTimeoutSecs(30);   
		TopologyBuilder builder = new TopologyBuilder();
		builder.setSpout("jdbc-save", new JdbcSpout(), 2);
		builder.setBolt("save",  PersistanceBolt, 1).shuffleGrouping("jdbc-save");
		Config conf = new Config();
		LocalCluster cluster = new LocalCluster();
		cluster.submitTopology("test", conf, builder.createTopology());
	}
	/**
	 * 读
	 * @param connectionProvider
	 */
	public static void JdbcRead(ConnectionProvider connectionProvider){
		Fields outputFields = new Fields("name", "age");
		List<Column> queryParamColumns = Lists.newArrayList(new Column("age", Types.INTEGER));
		String selectSql = "select name,age from storms where age = ?";
		SimpleJdbcLookupMapper lookupMapper = new SimpleJdbcLookupMapper(outputFields, queryParamColumns);
		JdbcLookupBolt JdbcLookupBolt = new JdbcLookupBolt(connectionProvider, selectSql, lookupMapper)
		        .withQueryTimeoutSecs(30);
		
		TopologyBuilder builder = new TopologyBuilder();
		builder.setSpout("jdbc-reader", new JdbcSpout(), 2);
		builder.setBolt("read",  JdbcLookupBolt, 1).shuffleGrouping("jdbc-reader");
		builder.setBolt("JdbcOutBolt",new JdbcOutBolt(), 1).shuffleGrouping("");
		Config conf = new Config();
		LocalCluster cluster = new LocalCluster();
		cluster.submitTopology("test", conf, builder.createTopology());
	}
}

我spout共用的一个spout哈,大家注意下。

我这节写的比较简单,大家想看看深度,可以去看看这篇博客,博主写的比较好 ~~

https://blog.csdn.net/yidan7063/article/details/79147692

有事没事看了来个评论,共勉共勉。。







深夜码文不易,若对看官有帮助,望看官可以在右侧打赏。
原文地址:https://www.cnblogs.com/wanchen-chen/p/12934129.html