eclipse配置storm1.1.0开发环境并本地跑起来
storm的开发环境搭建比hadoop(参见前文http://www.cnblogs.com/wuxun1997/p/6849878.html)简单,无需安装插件,只需新建一个java项目并配置好lib包引用即可。本地跑也无需先启动storm,直接Run As->Java Application完事。下面细看:
1、新建项目:在eclipse中点File->New->选Project->Java Project->next,输入自己想要的项目名,我这里写storm,点Finish;
2、引入jar包:右击storm项目src目录->Build Path,选Config Build Path->Libraries->Add Library,选User Library,点next,点击User Libraries->点New,输入引用lib包名,这里写storm->点Add External JARs,选storm安装目录lib包所在路径:D:\apache-storm-1.1.0\lib,为了使用中文分词还要引用到IKAnalyzer2012_FF.jar,该包下载地址同样参见上面链接->一路确定后就可以开始写代码了;
3、代码结构如下:
src
|---com.wulinfeng.storm.wordsplit.WordSplit.java
|---IKAnalyzer.cfg.xml
|---myext.dic
|---mystopword.dic
除了WordSplit.java要新写,其他3个文件无需修改,内容参见上面链接。
package com.wulinfeng.storm.wordsplit; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set; import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.BasicOutputCollector;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.topology.base.BaseBasicBolt;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme; public class WordSplit { /**
* 发射数据源
*
* @author Administrator
*
*/
public static class WordReaderSpout extends BaseRichSpout { SpoutOutputCollector _collector;
InputStreamReader isr;
boolean isEnd = false; @Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
String inputFile = "D:/input/people.txt";
try {
isr = new InputStreamReader(new FileInputStream(inputFile));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
_collector = collector;
} @Override
public void nextTuple() {
// 读取文件一次就无需再读了
if (isEnd) {
System.out.println("*******Spout is over, no neccessary to emit.*********");
return;
} // 读本地文件,一行发射一次
String line = null;
try (BufferedReader br = new BufferedReader(isr)) {
while ((line = br.readLine()) != null) {
System.out.printf("line : %s", line);
_collector.emit(new Values(line));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
isEnd = true; // 文件读完了
} } @Override
public void ack(Object id) {
} @Override
public void fail(Object id) {
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word"));
} } /**
* 处理上面发射过来的数据源
*
* @author Administrator
*
*/
public static class SplitWordBolt extends BaseRichBolt { private OutputCollector outputCollector; @Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
this.outputCollector = collector;
} @Override
public void execute(Tuple tuple) {
String sentence = tuple.getString(0); // 一次处理一行
IKSegmenter ikSeg = new IKSegmenter(new StringReader(sentence), true); // 智能分词
try {
for (Lexeme lexeme = ikSeg.next(); lexeme != null; lexeme = ikSeg.next()) {
outputCollector.emit(new Values(lexeme.getLexemeText()));
}
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word"));
} } /**
* 统计从上面取到的分词,关键人名统计后的放到result.txt
*
* @author Administrator
*
*/
public static class WordCountBolt extends BaseBasicBolt {
Map<String, Integer> counts = new HashMap<String, Integer>();
String out;
Set<String> keyName = new HashSet<>(); @Override
public void prepare(Map stormConf, TopologyContext context) {
out = "D:/out/result.txt"; // 判断result文件是否已存在,是则先删掉,以待新建
File outFile = new File(out);
if (outFile.exists()) {
outFile.delete();
} // 读字典文件并放入一个set,以备参照set里的人名读取统计结果,写入result.txt文件
try (BufferedReader br = new BufferedReader(
new InputStreamReader(WordSplit.class.getClassLoader().getResourceAsStream("myext.dic")))) {
String peopleName = null;
while ((peopleName = br.readLine()) != null) {
keyName.add(peopleName);
}
} catch (IOException e) {
e.printStackTrace();
} } @Override
public void execute(Tuple tuple, BasicOutputCollector collector) {
String word = tuple.getString(0); // 每次统计一个分词
Integer count = counts.get(word);
if (count == null)
count = 0;
count++;
counts.put(word, count);
collector.emit(new Values(word, count));
} @Override
public void cleanup() {
// 最后时刻,输出关键人名的统计结果到result.txt文件
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out)))) {
for (Map.Entry<String, Integer> keyWord : counts.entrySet()) {
if (keyName.contains(keyWord.getKey())) {
bw.write(keyWord.getKey() + " : " + keyWord.getValue() + "\r\n");
bw.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word", "count"));
}
} /**
* 输出分词结果到本地文件,过程数据放在tmp文件
*
* @author Administrator
*
*/
public static class SaveOutput extends BaseRichBolt {
String temp; @Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
temp = "D:/out/tmp" + System.currentTimeMillis(); // 判断tmp文件是否已存在,是则先删掉,以待新建
File tempFile = new File(temp);
if (tempFile.exists()) {
tempFile.delete();
}
} @Override
public void execute(Tuple input) {
// 从上面获取分词的累计次数
String name = input.getStringByField("word");
Integer counts = input.getIntegerByField("count"); // 输出分词统计过程追加到tmp文件
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(temp, true)))) {
bw.write(name + " : " + counts + "\r\n");
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// TODO Auto-generated method stub }
} public static void main(String[] args) throws Exception { TopologyBuilder builder = new TopologyBuilder(); // 新建一个拓扑 builder.setSpout("spout", new WordReaderSpout(), 1); // 设置数据源 // 读取spout里的数据,进行split处理
builder.setBolt("split", new SplitWordBolt(), 10).shuffleGrouping("spout"); // 读取split后的数据,进行count处理
builder.setBolt("count", new WordCountBolt(), 10).fieldsGrouping("split", new Fields("word")); // 保存计算结果
builder.setBolt("save", new SaveOutput(), 10).allGrouping("count"); Config conf = new Config();
conf.setDebug(true); conf.setMaxTaskParallelism(1); // 有参数则到集群跑,没有则在本地跑
if (args != null && args.length > 0) {
conf.setNumWorkers(3);
StormSubmitter.submitTopology(args[0], conf, builder.createTopology());
} else {
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("word-split", conf, builder.createTopology());
Thread.sleep(300000); // 5分钟后自动结束
cluster.shutdown();
}
} }
上面的java文件直接右键选择Run As->Java Application就可以跑起来了,因为是流的形式,所以会跑得慢一些,这里设置5分钟自动结束。跑的时候可以看到D:\out\tmpXXX.txt不断在刷数据,跑结束后可以去D:\out\result.txt看那几个猪脚的出境率。跑集群的话需要先起zookeeper和storm,把上面代码和引用的lib包打个jar,到命令行里去执行storm jar,运行情况可以去localhost:8088上看。
eclipse配置storm1.1.0开发环境并本地跑起来的更多相关文章
- eclipse配置hadoop2.7.2开发环境并本地跑起来
先安装并启动hadoop,怎么弄见上文http://www.cnblogs.com/wuxun1997/p/6847950.html.这里说下怎么设置IDE来开发hadoop代码和调试.首先要确保你本 ...
- (4)Linux(ubuntu)下配置Opencv3.1.0开发环境的详细步骤
Ubuntu下配置opencv3.1.0开发环境 1.最近工作上用到在Ubuntu下基于QT和opencv库开发应用软件(计算机视觉处理方面),特把opencv的配置过程详细记录,以供分享 2.步骤说 ...
- VS2010配置QT5.5.0开发环境
一.官网下载QT和qtvsaddin插件 网址:http://www.qt.io/download-open-source/ 1. 2. 3. 得到下载的安装包,点击安装就能够了 watermark/ ...
- Windows 8.0上Eclipse 4.4.0 配置CentOS 6.5 上的Hadoop2.2.0开发环境
原文地址:http://www.linuxidc.com/Linux/2014-11/109200.htm 图文详解Windows 8.0上Eclipse 4.4.0 配置CentOS 6.5 上的H ...
- Eclipse和PyDev搭建python开发环境
Eclipse和PyDev搭建python开发环境 1.1整体目标 本文档作为python学习者的新手教程,通过本教程能够了解python用途.语法.在实际工作中的应 ...
- EJB3.0开发环境的搭建
EJB Container的介绍SUN公司正式推出了EJB的规范之后,在众多的公司和开发者中引起了非常大的反响.标志着用Java开发企业级应用系统将变的非常easy.很多公司都已经推出了或正打算EJB ...
- ubuntu上用eclipse搭建java、python开发环境
上一篇文章讲到如何在windwos上用eclipse搭建java.python开发环境,这一讲将关注如何在ubuntu上实现搭建,本人使用虚拟机安装的ubuntu系统,系统版本为:14.04 lts ...
- windows 下用eclipse搭建java、python开发环境
本人只针对小白!本文只针对小白!本文只针对小白! 最近闲来无事,加上之前虽没有做过eclipse上java.python的开发工作,但一直想尝试一下.于是边查找资料边试验,花了一天时间在自己的机器上用 ...
- 基于Eclipse的Go语言可视化开发环境
http://jingyan.baidu.com/article/d7130635032e2f13fdf475b8.html 基于Eclipse的Go语言可视化开发环境 | 浏览:2924 | 更新: ...
随机推荐
- lamp架构之升级php版本
当你看到这篇文章的时候 YHSPY.COM 服务器上的PHP版本已经从 5.4.27 升级到了 7.0.4,这是一个重大的飞跃.一路升级遇到了很多问题.官方声称PHP7最大的升级就是在语言性能上的提升 ...
- Java Lambda表达
Java 8 lambda表达式示例 我个人对Java 8发布非常激动,尤其是lambda表达式和流API.越来越多的了解它们,我能写出更干净的代码.虽然一开始并不是这样.第一次看到用lambda表达 ...
- 64位机的pl/sql不安装32位oracle的连接方式
第一步:下载即时客户端包 在Oralce官方网站上下载Oracle Instantclient Basic package.地址如下:http://www.oracle.com/technetw ...
- EYES组——软件体系结构上机规划
EYES组——软件体系结构上机规划 考勤助手 第九周: 需求分析的详细撰写,并在此基础上探讨与完善,讨论软件的体系结构风格,画出初步的UML类图. 第十周: 选择合适的软件构架风格(3层C/S架构风格 ...
- JAVA实现IP地址解析
转载至:http://blog.csdn.net/dragontang/article/details/4151660 http://www.iteye.com/topic/340548#
- Binder机制-简单用法(一)
Binder算是android里面比较难懂的部分了,但是非常重要,基本上,当我们深入到进程交互的阶段,Binder都是一个绕不开的槛,所以我也希望帮助大家更浅显地了解到这个知识点.笔者想通过3篇博文简 ...
- mybatis引入dtd约束
window->preferences,然后寻找xml catalog,点击add如下所示 将dtd网址复制到key中 key type选择uri,选择dtd的下载路径.
- sql内连接外连接自然连接
为什么我们要使用内连接和外连接呢?可以从两张或者多张表中找出,我们需要的属性. 这个比较好:http://www.cnblogs.com/youzhangjin/archive/2009/05/22/ ...
- python学习笔记(threading多线程)
博主昨天优化了接口框架想着再添加些功能 想到对接口的性能压力测试 在工作过程中之前都是使用的工具 如:loadrunner.jmeter 想着这次准备用python实现对接口的性能压力测试 首先要实现 ...
- 解决:actual_tessdata_num_entries_ <= TESSDATA_NUM_ENTRIES:Error:Assert failed:in file ..\..\ccutil\tessdatamanager.cp p, line 50
在玩tesseract时,发现如下报错: 这个是因为Tesseract-OCR的版本和chi_sim.traindata字库版本不匹配,由于我的Tesseract-OCR是3.02.02,去googl ...