storm与kafka的结合(相同单词写到一个文件)


创建工程,导入storm和kafka的jar包


主类

package cn.itcast.topo;

import storm.kafka.KafkaSpout;
import storm.kafka.SpoutConfig;
import storm.kafka.ZkHosts;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.spout.SchemeAsMultiScheme;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;
import cn.itcast.bout.WordSpliter;
import cn.itcast.bout.WriterBolt;
import cn.itcast.scheme.MessageScheme;

public class KafaTopo {
	public static void main(String[] args) {
		
		//storm的spout作为kafka的消费者,声明要消费的主题数据
		String topic = "worldcount";
		//声明kafka将本身的信息注册到zookeeper的配置
		String zkRoot = "/kafka-strom";
		//消息源
		String spoutId = "KafkaSpout";
		
		//指定zookeeper的地址
		ZkHosts brokerHosts = new ZkHosts("storm01:2181,storm02:2181,storm03:2181");
		SpoutConfig spoutConfig = new SpoutConfig(brokerHosts,topic , zkRoot, spoutId);
		spoutConfig.forceFromStart = true;
		spoutConfig.scheme = new SchemeAsMultiScheme(new MessageScheme());
		
		//拓扑构建器
		TopologyBuilder builder = new TopologyBuilder();
		//storm提供了对kafka的支持类,KafkaSpout
		builder.setSpout(spoutId, new KafkaSpout(spoutConfig));
		builder.setBolt("world-spliter", new WordSpliter()).shuffleGrouping(spoutId);
		builder.setBolt("writer", new WriterBolt(),4).fieldsGrouping("world-spliter", new Fields("word"));
		
		//配置对想
		Config config = new Config();
		config.setNumWorkers(4);
		config.setNumAckers(0);
		//本地提交模式
		LocalCluster localCluster = new LocalCluster();
		localCluster.submitTopology("WordCount", config, builder.createTopology());
	}
}

序列化类(采用utf-8编码)

package cn.itcast.scheme;

import java.io.UnsupportedEncodingException;
import java.util.List;

import backtype.storm.spout.Scheme;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;

public class MessageScheme implements Scheme{
	
	//序列化uid
	private static final long serialVersionUID = 2785643173745033380L;

	/**
	 * 反序列化,以utf-8的范式编码
	 */
	@Override
	public List<Object> deserialize(byte[] bytes) {
		String msg;
		try {
			msg = new String(bytes, "UTF-8");
			return new Values(msg);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public Fields getOutputFields() {
		
		return new Fields("msg");
	}
}

bolt切分单词

package cn.itcast.bout;

import org.apache.commons.lang.StringUtils;

import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;

/**
 * 切分每一行的单词
 * @author Administrator
 *
 */
public class WordSpliter extends BaseBasicBolt{

	
	private static final long serialVersionUID = -1034769322377482248L;

	@Override
	public void execute(Tuple input, BasicOutputCollector collector) {
		String line = input.getString(0);
		String[] words = line.split(" ");
		for (String word : words) {
			word = word.trim();
			if(StringUtils.isNotBlank(word)){
				word = word.toLowerCase();
				collector.emit(new Values(word));
			}
		}
	}

	@Override
	public void declareOutputFields(OutputFieldsDeclarer declare) {
		declare.declare(new Fields("word"));
	}

}

bolt单词写入到磁盘

package cn.itcast.bout;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;

import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple;

/**
 * 单词写入到磁盘
 * @author Administrator
 *
 */
public class WriterBolt extends BaseBasicBolt{

	
	private static final long serialVersionUID = -3550075953729137756L;

	private FileWriter writer = null;
	
	@Override
	public void prepare(Map stormConf, TopologyContext context) {
		try {
			writer = new FileWriter("E://"+UUID.randomUUID().toString());
		} catch (IOException e) {
			throw new RuntimeException();
		}
	}
	
	@Override
	public void execute(Tuple input, BasicOutputCollector collector) {
		String s = input.getString(0);
		try {
			writer.write(s);
			writer.write("\n");
			writer.flush();
		} catch (IOException e) {
			throw new RuntimeException();
		}
		
	}

	@Override
	public void declareOutputFields(OutputFieldsDeclarer arg0) {
		
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值