一、配置开发环境

storm有两种操作模式: 本地模式和远程模式。使用本地模式的时候,你可以在你的本地机器上开发测试你的topology, 一切都在你的本地机器上模拟出来; 用远程模式的时候你提交的topology会在一个集群的机器上执行。

建议使用maven,只需要加上storm的依赖就可以了。

  1. <dependency>
  2. <groupId>org.apache.storm</groupId>
  3. <artifactId>storm-core</artifactId>
  4. <version>1.1.0</version>
  5. <scope>provided</scope>
  6. </dependency>

pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4.  
  5. <groupId>cn.ljh.storm</groupId>
  6. <artifactId>storm-helloworld</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9.  
  10. <name>storm-helloworld</name>
  11. <url>http://maven.apache.org</url>
  12.  
  13. <properties>
  14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15. </properties>
  16.  
  17. <dependencies>
  18. <dependency>
  19. <groupId>junit</groupId>
  20. <artifactId>junit</artifactId>
  21. <version>4.12</version>
  22. <scope>test</scope>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.apache.storm</groupId>
  26. <artifactId>storm-core</artifactId>
  27. <version>1.1.0</version>
  28. <scope>provided</scope>
  29. </dependency>
  30. </dependencies>
  31. <build>
  32. <plugins>
  33. <plugin>
  34. <artifactId>maven-assembly-plugin</artifactId>
  35. <configuration>
  36. <descriptorRefs>
  37. <descriptorRef>jar-with-dependencies</descriptorRef>
  38. </descriptorRefs>
  39. <archive>
  40. <manifest>
  41. <mainClass>cn.ljh.storm.helloworld.ExclamationTopology</mainClass>
  42. </manifest>
  43. </archive>
  44. </configuration>
  45. </plugin>
  46. </plugins>
  47. </build>
  48. </project>

二、HelloWorld关联代码

ExclamationTopology.java

  1. package cn.ljh.storm.helloworld;
  2.  
  3. import org.apache.storm.Config;
  4. import org.apache.storm.LocalCluster;
  5. import org.apache.storm.StormSubmitter;
  6. import org.apache.storm.topology.TopologyBuilder;
  7. import org.apache.storm.utils.Utils;
  8.  
  9. public class ExclamationTopology {
  10. public static void main(String[] args) throws Exception {
  11. TopologyBuilder builder = new TopologyBuilder();
  12.  
  13. builder.setSpout("word", new TestWordSpout(), 1);
  14. builder.setBolt("exclaim", new ExclamationBolt(), 1).shuffleGrouping("word");
  15. builder.setBolt("print", new PrintBolt(), 1).shuffleGrouping("exclaim");
  16.  
  17. Config conf = new Config();
  18. conf.setDebug(true);
  19.  
  20. if (args != null && args.length > 0) {
  21. conf.setNumWorkers(3);
  22.  
  23. StormSubmitter.submitTopologyWithProgressBar(args[0], conf, builder.createTopology());
  24. }
  25. else {
  26.  
  27. LocalCluster cluster = new LocalCluster();
  28. cluster.submitTopology("test3", conf, builder.createTopology());
  29. Utils.sleep(20000);
  30. cluster.killTopology("test3");
  31. cluster.shutdown();
  32. }
  33. }
  34. }

TestWordSpout.java

  1. package cn.ljh.storm.helloworld;
  2.  
  3. import org.apache.storm.topology.OutputFieldsDeclarer;
  4. import java.util.Map;
  5. import org.apache.storm.spout.SpoutOutputCollector;
  6. import org.apache.storm.task.TopologyContext;
  7. import org.apache.storm.topology.base.BaseRichSpout;
  8. import org.apache.storm.tuple.Fields;
  9. import org.apache.storm.tuple.Values;
  10. import org.apache.storm.utils.Utils;
  11. import java.util.Random;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14.  
  15. public class TestWordSpout extends BaseRichSpout {
  16. public static Logger LOG = LoggerFactory.getLogger(TestWordSpout.class);
  17. SpoutOutputCollector _collector;
  18.  
  19. public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
  20. _collector = collector;
  21. }
  22.  
  23. public void nextTuple() {
  24. Utils.sleep(100);
  25. final String[] words = new String[] {"nathan", "mike", "jackson", "golda", "bertels"};
  26. final Random rand = new Random();
  27. final String word = words[rand.nextInt(words.length)];
  28. _collector.emit(new Values(word));
  29. }
  30.  
  31. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  32. declarer.declare(new Fields("word"));
  33. }
  34. }

ExclamationBolt.java

  1. package cn.ljh.storm.helloworld;
  2.  
  3. import java.util.Map;
  4.  
  5. import org.apache.storm.task.OutputCollector;
  6. import org.apache.storm.task.TopologyContext;
  7. import org.apache.storm.topology.OutputFieldsDeclarer;
  8. import org.apache.storm.topology.base.BaseRichBolt;
  9. import org.apache.storm.tuple.Fields;
  10. import org.apache.storm.tuple.Tuple;
  11. import org.apache.storm.tuple.Values;
  12.  
  13. public class ExclamationBolt extends BaseRichBolt {
  14. OutputCollector _collector;
  15.  
  16. public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
  17. _collector = collector;
  18. }
  19.  
  20. public void execute(Tuple tuple) {
  21. _collector.emit(tuple, new Values(tuple.getString(0) + "!!!"));
  22. _collector.ack(tuple);
  23. }
  24.  
  25. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  26. declarer.declare(new Fields("word"));
  27. }
  28.  
  29. }

PrintBolt.java

  1. package cn.ljh.storm.helloworld;
  2.  
  3. import java.util.Map;
  4.  
  5. import org.apache.storm.task.OutputCollector;
  6. import org.apache.storm.task.TopologyContext;
  7. import org.apache.storm.topology.OutputFieldsDeclarer;
  8. import org.apache.storm.topology.base.BaseRichBolt;
  9. import org.apache.storm.tuple.Tuple;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12.  
  13. public class PrintBolt extends BaseRichBolt {
  14. private static Logger LOG = LoggerFactory.getLogger(PrintBolt.class);
  15. OutputCollector _collector;
  16.  
  17. public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
  18. _collector = collector;
  19. }
  20.  
  21. public void execute(Tuple tuple) {
  22. LOG.info(tuple.getString(0) + " Hello World!");
  23. _collector.ack(tuple);
  24. }
  25.  
  26. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  27. }
  28. }

三、实际运行

storm有本地模式和远程模式。

1、本地模式

本地模式一般用于测试和开发阶段,直接在Eclipse执行ExclamationTopology的main函数进行。

本地模式的代码中有设置睡眠时间,到时间后主动kill topoloyg。

Utils.sleep(20000);

开始设置的时间是10S,运行log中没有期待的输出,反而出现以下错误。

  1. org.apache.storm.shade.org.apache.zookeeper.server.ServerCnxn$EndOfStreamException: Unable to read additional data from client sessionid
  1. 0x15c8a2872ac000f, likely client has closed socket
  2. at org.apache.storm.shade.org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:228) [storm-core-1.1.0.jar:1.1.0]
  3. at org.apache.storm.shade.org.apache.zookeeper.server.NIOServerCnxnFactory.run(NIOServerCnxnFactory.java:208) [storm-core-1.1.0.jar:1.1.0]
  4. at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121]

后面设置时间为20S,运行log中也有上面错误,但是有期待的输出。

原因是机器比较慢,还没初始化完就到时间跳出了,所以把睡眠时间设置大些。

2、远程模式

集群模式需要先创建一个包含程序代码以及代码所依赖的依赖包的jar包(有关storm的jar包不用包括, 这些jar包会在工作节点上自动被添加到classpath里面去)。如果使用maven, 那么插件:Maven Assembly Plugin可以帮你打包,只要把下面的配置加入pom.xml。

  1. <plugin>
  2. <artifactId>maven-assembly-plugin</artifactId>
  3. <configuration>
  4. <descriptorRefs>
  5. <descriptorRef>jar-with-dependencies</descriptorRef>
  6. </descriptorRefs>
  7. <archive>
  8. <manifest>
  9. <mainClass>cn.ljh.storm.helloworld.ExclamationTopology</mainClass>
  10. </manifest>
  11. </archive>
  12. </configuration>
  13. </plugin>

然后运行mvn assembly:assembly就可以打包了.

(1)用storm提交topology

  1. storm jar storm-helloworld-0.0.1-SNAPSHOT-jar-with-dependencies.jar cn.ljh.storm.helloworld.ExclamationTopology ExclamationTest

运行提交命令后,出现如下log,说明提交成功。

查看集群的进程jps,两个Supervisor节点出现了worker进程

在Nimbus节点的/usr/local/storm/data/nimbus/inbox下面有提交的jar

UI界面显示提交topology

(2)终止一个topology

要终止一个topology, 执行:

  1. storm kill {stormname}

其中{stormname}是提交topology给storm集群的时候指定的名字。

storm不会马上终止topology。相反,它会先终止所有的spout,让它们不再发射任何新的tuple, storm会等Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS秒之后才杀掉所有的工作进程。这会给topology足够的时 间来完成所有我们执行storm kill命令的时候还没完成的tuple。

(3)更新一个运行中的topology

为了更新一个正在运行的topology, 唯一的选择是杀掉正在运行的topology然后重新提交一个新的。

至此HelloWorld示例完成。

四、常见配置

有很多topology级的配置可以设。 以”TOPOLOGY”打头的配置是topology级别的配置,可以覆盖全局级别的配置。下面是一些比较常见的:

1)Config.TOPOLOGY_WORKER设置:  这个设置用多少个工作进程来执行这个topology。比如,如果你把它设置成25, 那么集群里面一共会有25个java进程来执行这个topology的所有task。如果你的这个topology里面所有组件加起来一共有150的并行 度,那么每个进程里面会有6个线程(150 / 25 = 6)。

2)Config.TOPOLOGY_ACKERS: 这个配置设置acker线程的数目。Ackers是Storm的可靠性API的一部分。

3)Config.TOPOLOGY_MAX_SPOUT_PENDING:  这个设置一个spout task上面最多有多少个没有处理的tuple(没有ack/failed)回复, 我们推荐你设置这个配置,以防止tuple队列爆掉。

4)Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS: 这个配置storm的tuple的超时时间  – 超过这个时间的tuple被认为处理失败了。这个设置的默认设置是30秒,对于大多数的topology都已经足够了。

5)Config.TOPOLOGY_SERIALIZATIONS: 为了在你的tuple里面使用自定义类型,你可以用这个配置注册自定义serializer。

Storm入门(三)HelloWorld示例的更多相关文章

  1. torm入门(三)HelloWorld示例

    一.配置开发环境 storm有两种操作模式: 本地模式和远程模式.使用本地模式的时候,你可以在你的本地机器上开发测试你的topology, 一切都在你的本地机器上模拟出来; 用远程模式的时候你提交的t ...

  2. Storm入门(四)WordCount示例

    一.关联代码 使用maven,代码如下. pom.xml  和Storm入门(三)HelloWorld示例相同 RandomSentenceSpout.java /** * Licensed to t ...

  3. Spring Boot 2.x 快速入门(下)HelloWorld示例详解

    上篇 Spring Boot 2.x 快速入门(上)HelloWorld示例 进行了Sprint Boot的快速入门,以实际的示例代码来练手,总比光看书要强很多嘛,最好的就是边看.边写.边记.边展示. ...

  4. TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络

    TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络

  5. storm入门demo

    一.storm入门demo的介绍 storm的入门helloworld有2种方式,一种是本地的,另一种是远程. 本地实现: 本地写好demo之后,不用搭建storm集群,下载storm的相关jar包即 ...

  6. 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  7. 《Storm入门》中文版

    本文翻译自<Getting Started With Storm>译者:吴京润    编辑:郭蕾 方腾飞 本书的译文仅限于学习和研究之用,没有原作者和译者的授权不能用于商业用途. 译者序 ...

  8. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  9. Netty入门之HelloWorld

    Netty系列入门之HelloWorld(一) 一. 简介 Netty is a NIO client server framework which enables quick and easy de ...

随机推荐

  1. .NET Core中的性能测试工具BenchmarkDotnet

    背景介绍 之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下Be ...

  2. Chapter 5 Blood Type——7

    "You say that a lot," I noted, trying to ignore the sudden trembling in my stomach and kee ...

  3. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->用户管理模块新增“重置用户密码”功能

    不管是什么系统登录用户都有忘记密码的时候,忘记密码就进入不了系统.系统应该可以提供重置用户密码的功能.在我们框架中重置用户密码功能一般用用户管理员来完成.当然如果做得复杂点还可以由用户自己来重置(如: ...

  4. 超详细“零”基础kafka入门篇

    1.认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.org/ (1)流媒体平台有三个关键功能: 发布和订阅记录流,类 ...

  5. springboot情操陶冶-jmx解析

    承接前文springboot情操陶冶-@Configuration注解解析,近期笔者接触的项目中有使用到了jmx的协议框架,遂在前文的基础上讲解下springboot中是如何整合jmx的 知识储备 J ...

  6. Java——final关键字

    前言 Java中的关键字final的含义通常为"这是无法改变的".下面将介绍final用于修饰数据.方法和类的这三种情况. final数据 许多编程语言都有某种方法,来向告诉编译器 ...

  7. babel版本兼容报错处理:Plugin/Preset files are not allowed to export objects

    原文地址: https://www.cnblogs.com/jiebba/p/9618930.html 1.为什么会报错 ? 这里抱着错误是因为 babel 的版本冲突. 多是因为你的 babel 依 ...

  8. 【EF】CodeFirst Fluent API使用记录

    我们在使用EF CodeFirst 模式生成数据库的时候进行表的代码映射关系可以采用注解模式和Fluent API模式.这里就是记录一下使用Fluent API进行表关系映射的方法. 注解模式: 回顾 ...

  9. 查看Windows电脑上.NET Framework版本的方法(找了好久的方法)

    照网上大多数人的方法,在路径 C:\Windows\Microsoft.NET\Framework 下可以查看到.NET Framework的版本,不过无论Win7还是Win10,显示都是这样的: 那 ...

  10. win10 git bash 闪退

    使用ghost重装了win10 专业版后.安装git,尝试重装了n个版本的git,右键git bash here 直接闪退,直接进入安装目录打开git-bash.exe依旧闪退, git右键点击Git ...