storm程序-单词统计wordcount
来源:互联网 发布:程序员过关 编辑:程序博客网 时间:2024/06/06 14:05
spout代码:
public class MyLocalFileSpout extends BaseRichSpout { public static final String FILE_PATH = "/root/1.log";// public static final String FILE_PATH = "D:\\1.log"; private SpoutOutputCollector collector; private BufferedReader bufferedReader; //初始化方法 //该方法只会被调用一次,用来初始化 public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { this.collector = collector; try { this.bufferedReader = new BufferedReader(new FileReader(new File(FILE_PATH))); } catch (FileNotFoundException e) { e.printStackTrace(); } } //Storm实时计算的特性就是对数据一条一条的处理 //while(true){ // this.nextTuple() // } public void nextTuple() { // 每被调用一次就会发送一条数据出去 try { String line = bufferedReader.readLine(); if (StringUtils.isNotBlank(line)) { List<Object> arrayList = new ArrayList<Object>(); arrayList.add(line); collector.emit(arrayList); } } catch (IOException e) { e.printStackTrace(); } } public void declareOutputFields(OutputFieldsDeclarer declarer) { //消息源可以发射多条消息流stream。多条消息流可以理解为多中类型的数据。 declarer.declare(new Fields("juzi")); }}
bolt1 句子分割成单词代码:
/** * Map --->word,1 */public class MySplitBolt extends BaseBasicBolt { public void execute(Tuple input, BasicOutputCollector collector) { //1、数据如何获取 String juzi = (String) input.getValueByField("juzi"); //2、进行切割 String[] strings = juzi.split(" "); //3、发送数据 for (String word : strings) { //Values 对象帮我们生成一个list collector.emit(new Values(word, 1)); } } public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("word", "num")); }}
bolt2 单词统计代码:
public class MyWordCountAndPrintBolt extends BaseBasicBolt { private Map<String, Integer> wordCountMap = new HashMap<String, Integer>(); public void execute(Tuple input, BasicOutputCollector collector) { String word = (String) input.getValueByField("word"); Integer num = (Integer) input.getValueByField("num"); //1、查看单词对应的value是否存在 Integer integer = wordCountMap.get(word); if (integer == null || integer.intValue() == 0) { wordCountMap.put(word,num); }else { wordCountMap.put(word,integer.intValue()+num); } //2、打印数据 System.out.println(wordCountMap); } public void declareOutputFields(OutputFieldsDeclarer declarer) { //todo 不需要定义输出的字段 }}
storm 驱动类:
public class StormTopologyDriver { public static void main(String[] args) throws AlreadyAliveException, InvalidTopologyException { //1、准备任务信息 //Storm框架支持多语言,在JAVA环境下创建一个拓扑,需要使用TopologyBuilder进行构建 TopologyBuilder topologyBuilder = new TopologyBuilder(); /* MyLocalFileSpout类,主要是将文本内容读成一行一行的模式 * 消息源spout是Storm里面一个topology里面的消息生产者。 * 一般来说消息源会从一个外部源读取数据并且向topology里面发出消息:tuple。 * Spout可以是可靠的也可以是不可靠的。 * 如果这个tuple没有被storm成功处理,可靠的消息源spouts可以重新发射一个tuple,但是不可靠的消息源spouts一旦发出一个tuple就不能重发了。 * * 消息源可以发射多条消息流stream。多条消息流可以理解为多中类型的数据。 * 使用OutputFieldsDeclarer.declareStream来定义多个stream,然后使用SpoutOutputCollector来发射指定的stream。 * * Spout类里面最重要的方法是nextTuple。要么发射一个新的tuple到topology里面或者简单的返回如果已经没有新的tuple。 * 要注意的是nextTuple方法不能阻塞,因为storm在同一个线程上面调用所有消息源spout的方法。 * * 另外两个比较重要的spout方法是ack和fail。storm在检测到一个tuple被整个topology成功处理的时候调用ack,否则调用fail。storm只对可靠的spout调用ack和fail。 */ topologyBuilder.setSpout("mySpout", new MyLocalFileSpout(), 2); topologyBuilder.setBolt("bolt1", new MySplitBolt(), 4).shuffleGrouping("mySpout"); topologyBuilder.setBolt("bolt2", new MyWordCountAndPrintBolt(), 2).shuffleGrouping("bolt1"); //2、任务提交 //提交给谁?提交什么内容? Config config = new Config(); //定义你希望集群分配多少个工作进程给你来执行这个topology config.setNumWorkers(2); StormTopology stormTopology = topologyBuilder.createTopology(); //这在本地环境调试topology很有用, 但是在线上这么做的话会影响性能的。 config.setDebug(false); //storm的运行有两种模式: 本地模式和分布式模式. //本地模式// LocalCluster localCluster = new LocalCluster();// localCluster.submitTopology("wordcount", config, stormTopology);// 指定本地模式运行多长时间之后停止,如果不显式的关系程序将一直运行下去// Utils.sleep(10000);// localCluster.shutdown(); // 集群模式 StormSubmitter.submitTopology("wordcount1", config, stormTopology); }}
pom.xml
<?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>cn.itcast.storm</groupId> <artifactId>learnStorm</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-core</artifactId> <!--当打包到集群上运行时,集群中已经提供了storm jar包,使用provided,可以在打成的包中不包含该jar包--> <scope>provided</scope> <version>0.9.5</version> </dependency> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-kafka</artifactId> <version>0.9.5</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.8.2</artifactId> <version>0.8.1</version> <exclusions> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>cn.itcast.storm.wordcount.StormTopologyDriver</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build></project>
打包,上传至集群运行:
在storm ui上查看运行结果:
由上图可知,bolt2运行在 mini3 的6370端口。
登录mini3 查看运行日志:
阅读全文
0 0
- storm程序-单词统计wordcount
- hadoop的统计单词程序WordCount
- Storm+Kafka+Hbase的wordcount统计
- Hadoop2.2.0下通过编译单词统计例子WordCount.java熟悉如何编译自己的程序
- [pig] 统计行数和单词个数wordcount
- Mapreduce实例---统计单词个数(wordcount)
- Storm入门程序——WordCount
- 02-Storm之Hello World:单词统计
- 启动Spark Shell,在Spark Shell中编写WordCount程序,在IDEA中编写WordCount的Maven程序,spark-submit使用spark的jar来做单词统计
- 单词,标点统计程序
- 单词出现统计程序
- 单词统计程序
- 小型单词统计程序
- spark:学习杂记+wordcount(单词统计)--22
- Hadoop入门实例——WordCount统计单词
- Hadoop编程入门,统计单词出现数目wordcount
- Storm集群部署与单词计数程序
- C++统计单词小程序
- 字面量,常量,变量,左值,右值
- [C/C++] 算法训练 阶乘末尾
- 多线程并行数组求和(相邻配对模式)
- 吴恩达机器学习之最优间隔分类器
- 372. Super Pow
- storm程序-单词统计wordcount
- 解决nbconvert failed: Pandoc wasn’t found. Please check that pandoc is installed:
- 计算机图形学-在VS2013下利用MFC实现OpenGL
- linux进程间通信--消息队列相关函数(ftok)详解
- 从零开始 OpenCV (二) —— OpenCV 的基本数据类型和基本函数
- dataframe写入postgresql数据库中
- com.mchange.v2.resourcepool.ResourcePoolException: Attempted to use a closed or broken resource pool
- STL容器
- Tomcat服务器允许所有JSON进行跨域请求(不使用JSONP)