pom.xml

<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>1.2.2</version>
<!-- 本机模式,需要storm-core,集群模式不需求-->
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency> ...
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass></mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions> </plugin>
HelloWorldSpout.java
package com.ebc.spout;

import lombok.extern.slf4j.Slf4j;
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 org.apache.storm.utils.Utils; import java.util.Map; /**
* @author yaoyuan2
* @date 2019/4/11
*/
@Slf4j
public class HelloWorldSpout extends BaseRichSpout {
private SpoutOutputCollector collector; @Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector = collector;
}
/**
* 重复调用,包含spout整个逻辑
* @return void
*/
@Override
public void nextTuple() {
Utils.sleep(100);
String sendStr = "Hello World";
collector.emit(new Values(sendStr));
//log.info(sendStr);
}
/**
* 告诉storm集群,spout发送了那些字段
* @param declarer
* @return void
*/
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("sentence"));
}
}
HelloWorldBolt.java
package com.ebc.blot;

import lombok.extern.slf4j.Slf4j;
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; import java.util.Map; /**
* 读取已产生的Tuple并实现必要的统计
* @author yaoyuan2
* @date 2019/4/11
*/
@Slf4j
public class HelloWorldBolt extends BaseRichBolt {
private int myCount = 0;
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
} @Override
public void execute(Tuple input) {
String test = input.getStringByField("sentence");
if (test == "Hello World") {
myCount++;
log.info("发现了1个Hello World!现在的计数值="+Integer.toString(myCount));
}
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("myCount"));
}
}
HelloWorldTopology.java
package com.ebc;

import com.ebc.blot.HelloWorldBolt;
import com.ebc.spout.HelloWorldSpout;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.utils.Utils; /**
* @author yaoyuan2
* @date 2019/4/11
*/
public class HelloWorldTopology {
public static void main(String[] args) throws Exception {
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("helloWorld",new HelloWorldSpout(),2);
builder.setBolt("HelloWorldBolt",new HelloWorldBolt(),4).shuffleGrouping("helloWorld");
Config conf = new Config();
conf.setDebug(true);
if(args!=null && args.length > 0) {
conf.setNumWorkers(20);
StormSubmitter.submitTopology(args[0],conf,builder.createTopology());
} else {
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("test",conf,builder.createTopology());
Utils.sleep(10000);
cluster.killTopology("test");
cluster.shutdown();
}
}
}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="1" status="ERROR" strict="true" name="LogConfig">
<Properties>
<Property name="log.layout">%date{HH:mm:ss.SSS} [%thread] %-5level %logger{20}:%line - %msg%n</Property>
</Properties> <Appenders>
<Appender type="Console" name="STDOUT">
<Target>SYSTEM_OUT</Target>
<Layout type="PatternLayout" pattern="${log.layout}"/>
</Appender>
</Appenders> <Loggers>
<Root level="info">
<AppenderRef ref="STDOUT"/>
</Root>
<Logger name="org.apache.storm" level="error" />
</Loggers> </Configuration>

输出:

13:21:53.792 [Thread-22-HelloWorldBolt-executor[3 3]] INFO  com.ebc.blot.HelloWorldBolt:30 - 发现了1个Hello World!现在的计数值=36
13:21:53.855 [Thread-32-HelloWorldBolt-executor[4 4]] INFO com.ebc.blot.HelloWorldBolt:30 - 发现了1个Hello World!现在的计数值=41
13:21:53.892 [Thread-24-HelloWorldBolt-executor[1 1]] INFO com.ebc.blot.HelloWorldBolt:30 - 发现了1个Hello World!现在的计数值=35
13:21:53.955 [Thread-32-HelloWorldBolt-executor[4 4]] INFO com.ebc.blot.HelloWorldBolt:30 - 发现了1个Hello World!现在的计数值=42
13:21:53.992 [Thread-32-HelloWorldBolt-executor[4 4]] INFO com.ebc.blot.HelloWorldBolt:30 - 发现了1个Hello World!现在的计数值=43
13:21:54.055 [Thread-18-HelloWorldBolt-executor[2 2]] INFO com.ebc.blot.HelloWorldBolt:30 - 发现了1个Hello World!现在的计数值=45
13:21:57.532 [Thread-14] ERROR org.apache.storm.daemon.supervisor.ReadClusterState:182 - Failed to Sync Supervisor
java.lang.RuntimeException: java.lang.InterruptedException

blot 有4个线程执行计算。

将HelloWorldSpout.nextTuple方法中的//log.info(sendStr);放开,将HelloWorldBolt.execute方法中的log.info("发现了1个Hello World!现在的计数值="+Integer.toString(myCount));注释,输出:

13:26:48.969 [Thread-20-helloWorld-executor[7 7]] INFO  com.ebc.spout.HelloWorldSpout:35 - Hello World
13:26:49.056 [Thread-26-helloWorld-executor[6 6]] INFO com.ebc.spout.HelloWorldSpout:35 - Hello World
13:26:52.512 [Thread-14] ERROR org.apache.storm.daemon.supervisor.ReadClusterState:182 - Failed to Sync Supervisor
java.lang.RuntimeException: java.lang.InterruptedException

spout有2个线程同时向blot发送消息。

抛出的异常是因为:

Utils.sleep(10000);
cluster.killTopology("test");
cluster.shutdown();

休眠10秒后,自动关闭storm服务了。

												

storm(3)-本机模式-helloworld的更多相关文章

  1. Twitter Storm: storm的一些常见模式

    这篇文章列举出了storm topology里面的一些常见模式: 流聚合(stream join) 批处理(Batching) BasicBolt 内存内缓存 + fields grouping 组合 ...

  2. 大数据 --> 安装Hadoop-单机模式(1)

    安装Hadoop-单机模式(1) 一.在Ubuntu下创建hadoop组和hadoop用户 1)创建hadoop用户组 sudo addgroup hadoop //添加用户组 2)创建hadoop用 ...

  3. 初学JS——利用JS制作的别踩白块儿(街机模式) 小游戏

    这个是上个星期5写的了,当时是突然想写个游戏,就想到了别踩白块儿,当时的想法是 可能普通模式的别踩白块儿因为他的“块儿”是滚动的向上这种,以我目前会的技术想不出怎么写, 但是如果是街机模式,通过你每按 ...

  4. wincc的服务器-客户机模式具体做法(全抄-未测试)

    一.原来的工作方式:在同一工作组中4台计算机其windows名分别为A.B.C.D且都已安装好wincc5.0+sp2,原来在每台计算机上运行的均是单用户,4台计算机上实际运行的是一个相同的项目,最先 ...

  5. docker安装elasticsearch6.8.3-单机模式及可视化Kibana6.8.3

    docker安装elasticsearch6.8.3-单机模式 拉取镜像 docker pull elasticsearch:6.8.3 创建容器  测试环境加上-e "discovery. ...

  6. Storm入门(三)HelloWorld示例

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

  7. Storm的本地运行模式示例

    以word count为例,本地化运行模式(不需要安装zookeeper.storm集群),maven工程, pom.xml文件如下: <project xmlns="http://m ...

  8. SQL Server Reporting Services本机模式下的权限管理

    SQL Server Reporting Services在安装配置后,缺省只给BUILTIN\Administrators用户组(实际上只有本机的Administrator用户)提供管理权限.所以所 ...

  9. windows安装zookeeper-单机模式

    zookeeper下载地址:http://zookeeper.apache.org/releases.html#download   本次使用的是3.4.9版本 前提:请安装JDK 安装: 创建安装目 ...

随机推荐

  1. XStream(xml/bean转换)

    XStream 1. 什么作用  * 可以把JavaBean转换为(序列化为)xml 2. XStream的jar包  * 核心JAR包:xstream-1.4.7.jar:  * 必须依赖包:xpp ...

  2. HUST软工1501-1503班第4周作业成绩公布

    说明 本次公布的成绩为第四周作业的结果: 第4周小组作业:WordCount优化 如果同学对作业结果存在异议,可以: 在毕博平台讨论区的第4周在线答疑区发帖申诉. 或直接在博客园本帖中进行评论进行申诉 ...

  3. Hadoop(HDFS、YARN、HBase、Hive和Spark等)默认端口表

    端口 作用 9000 fs.defaultFS,如:hdfs://172.25.40.171:9000 9001 dfs.namenode.rpc-address,DataNode会连接这个端口 50 ...

  4. g++中宏NULL究竟是什么?

    NULL是个指针,还是个整数?0?或(void*)0?答案是和g++版本有关.g++ 4.6支持C++11,引入了nullptr,也许会发生变化. 可以写段简单代码求证一下: #include < ...

  5. (转)jQuery插件编写学习+实例——无限滚动

    原文地址:http://www.cnblogs.com/nuller/p/3411627.html 最近自己在搞一个网站,需要用到无限滚动分页,想想工作两年有余了,竟然都没有写过插件,实在惭愧,于是简 ...

  6. async异步操作和同步上下文

    第8章 哪个线程运行我的代码 看到社区里的朋友没有翻译完这本书,我接着对一下的章节进行翻译 像我之前说的,异步编程就是关于线程的.那就意味着我们需要理解在C#程序中哪个.NET线程什么时候运行我们的代 ...

  7. windows 多个人同时远程同一台电脑

    windows  多个人同时远程同一台电脑 第一步:(内外远程) 参考内网多个人同时远程一台电脑: http://www.cnblogs.com/zlp520/p/7688984.html 第二步:( ...

  8. Data Base oracle常见错误及解决方案

    Data Base oracle常见错误及解决方案 一.TNS协议适配器错误: 原因: 此问题的原因都是由于监听没有配置好. 解决: 1.打开oracle工具Net Manager,删除服务及监听,重 ...

  9. memcached服务

    介绍 它是一套数据缓存系统或软件 用于动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升性能的效果,实际应用环境中多用于数据库的cache的应用.它是通过预分配指定的内存空间来存储数据 定 ...

  10. str中的join方法; set集合;深浅拷贝

    一.str中的join方法 1,用join可以吧列表转换为字符串 将列表转换成字符串. 每个元素之间用_拼接 s = "_". join(['德玛', ''赵信'', '易']) ...