Storm整合Springboot_springboot storm-程序员宅基地

技术标签: 架构  storm  Springboot  大数据  

Storm是一个分布式的实时的流式计算框架。

Storm运行有两种模式,分别是local与remote。

Storm的local就是单进程模式(运行在单一的JVM),local模式storm(注:下文将用storm-local来表示)整合Springboot,这与我们平常的开发方式没有多大区别。storm-local又被叫做测试模式。

Storm的remote是跨进程模式,spout与bolt运行在多个JVM中,也就是说,相互之间的消息通讯要通过远程调用的方式(跨进程)。local模式的storm(注:下文将用storm-remote来表示)与storm的开发方式差别,其实也不大(想想,也不可能很大,否则,一个不易于测试的东西,谁还想用),不过,理解起来就有很大区别了,一不小心,死都不知是怎么死的。

不管是那种方式,Storm都是必须通过Spring的factory(下文称为Spring BeanFacotry)才能获得目标bean。因此,我们设计了一个公共的工具,使可以在storm的两种运行模式下都可直接获得Spring BeanFacotry。

这个工具类比较关键,先贴出来。

package com.banling.stormspr.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**取得Spring的上下文(也就是Factory,使通过Factory可以得到目标JavaBean)
 * 
 * @author Ban
 *
 */
public class SpringContext implements ApplicationContextAware {

	private  static ApplicationContext applicationContext = null;
	
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		// TODO Auto-generated method stub
		synchronized(this) {
			if(SpringContext.applicationContext == null){
				SpringContext.applicationContext  = applicationContext;
	        }
		}
	}
	
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

}

同时,注意,必须在SpringBoot启动后并由SpringBoot初始化这个工具类SpringContext。如何做到,下文介绍。

一、storm-local整合Springboot

在架构上,是这样的:

程序启动时,组件的启动顺序是这样的,先启动SpringBoot,然后在SpringBoot中启动Strom:

程序启动后,接着就是开始Storm运算,这时,程序运行是这样的:

下面列一个简单的storm-local例子,就是计算1到n的总数,为了扩展storm的知识点(测试),同时还做了些多余的逻辑,应用字段分组。

Storm-local源码请参考:https://github.com/banat020/storm-spr-local

1.1)数据输入

1.1.1)我们设计一个数据接口NumInService,用于获得源数据输入。这个数据接口的实例(接口的实现,请查看github源)将由Spring负责初始化并管理。

package com.banling.stormspr.service;

public interface NumInService {
	
	int getNum();

}

1.1.2)Storm获取数据输入

package com.banling.stormspr.numcount.node;

import java.util.HashMap;
import java.util.Map;

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 com.banling.stormspr.config.SpringContext;
import com.banling.stormspr.service.NumInService;

/**数据输入
 * @author Ban
 *
 */
public class NumInSpout extends BaseRichSpout {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private SpoutOutputCollector collector;

	@Override
	public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
		// TODO Auto-generated method stub
		this.collector=collector;
	}

	@Override
	public void nextTuple() {
		// TODO Auto-generated method stub
		NumInService numInService=(NumInService)SpringContext.getApplicationContext().getBean("numInService");
		int curNum=numInService.getNum();
		if(curNum==-1) {//计算已经结束
			return;
		}
		int groupFlag=curNum%10;//用于分组
		Values values = new Values(curNum,groupFlag);
		collector.emit(values);
	}

	@Override
	public void declareOutputFields(OutputFieldsDeclarer declarer) {
		// TODO Auto-generated method stub
		declarer.declare(new Fields("inNum","groupFlag"));
	}

	@Override
	public Map<String, Object> getComponentConfiguration() {
		
		Map<String, Object> map=new HashMap<String, Object>();
		//仅仅是测试,因此不要跑得太快了,设置为每50ms发送一次数据
		map.put("topology.sleep.spout.wait.strategy.time.ms", 50);
	    return map;
	}
}

 

注意NumInService numInService=(NumInService)SpringContext.getApplicationContext().getBean("numInService"),就是Spout<

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/banat020/article/details/102264049

智能推荐

linux安装过程中找不到镜像文件(system operation)_linux下载httpd出现找不到镜像-程序员宅基地

文章浏览阅读8.1k次。解决方法:镜像和虚拟机的路径都不要有空格_linux下载httpd出现找不到镜像

Spring学习02:面向切面编程(AOP)_maoritian-程序员宅基地

文章浏览阅读4.3k次,点赞10次,收藏71次。Spring学习02:面向切面编程[AOP]代码冗余与装饰器模式代码冗余现象解决代码冗余的思路: 装饰模式和动态代理动态代理的写法使用动态代理解决代码冗余现象使用SpringAOP解决代码冗余AOP相关术语使用XML配置AOP使用XML配置AOP的步骤切入点表达式环绕通知使用注解配置AOP半注解配置AOP用于声明切面的注解用于声明通知的注解用于指定切入点表达式的注解纯注解配置AOP代码冗余与装饰..._maoritian

部署虚拟机到云服务器上的方法详解-程序员宅基地

文章浏览阅读1.4k次。云服务器上可以部署虚拟机 内容精选换一换默认部署在VPC下的应用可以调用API。如果域名解析失败,则参考配置内网DNS,在当前终端节点上配置DNS服务器。配置完成后,部署在VPC下的应用可以调用API。配置DNS需要配置“/etc”目录下的resolv.conf文件,指定DNS服务器的IP地址。内网DNS服务器的IP地址与您所位于的区域相关,您可通过表1获取内网DNS服务器的I华为云VPC是用户在..._虚拟机如何映射到弹性云服务器上

sql 以log形式输出_sqlserver审计日志输出为log格式-程序员宅基地

文章浏览阅读592次。mybatis-config.xml 文件下加上下面这段配置信息就可以了:<settings> <setting name="logImpl" value="STDOUT_LOGGING" /> </setting>=------------------------------------------------------分隔符--------------..._sqlserver审计日志输出为log格式

国外部分音乐人工智能/音乐科技研究机构科研项目简介_斯坦福大学 ccrma 音乐和声学计算机研究中心-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏17次。本文对国外部分音乐人工智能/音乐科技科研机构的科研项目与教学课程设置作简要介绍,包括英国伦敦玛丽女王大学(Queen Mary)的数字音乐中心(C4DM)、西班牙巴塞罗那庞培法布拉大学(UPF)的音乐技术研究组(MTG)、美国斯坦福大学的音乐与声学计算机研究中心(CCRMA)以及法国的声学/音乐协调研究所(IRCAM)。_斯坦福大学 ccrma 音乐和声学计算机研究中心

Eclipse插件(RCP)项目搭建_eclipse rcp-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏11次。介绍最新的Eclipse RCP 开发工具创建RCP项目的过程。_eclipse rcp

随便推点

LeetCode-461. 汉明距离(python3)_两个整数之间的汉明距离python-程序员宅基地

文章浏览阅读928次。两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。_两个整数之间的汉明距离python

imx226_IMX226CQJ-海思网络摄像芯片-程序员宅基地

文章浏览阅读994次。产品详情IMX226CQJ-海思网络摄像芯片广州上诚视视源信息科技有限公司联系人:陈先生QQ号:1695823546手机:13189717928 (威信同号)海思芯片: www.sxj3.com联系地址:深圳市福田区华强北华强电子市场海思系列HI3516DRBCV100、HI3520DRQCV200、HI3516CRBCV200、HI3518CRBCV100、HI3520DRQCV300、HI35..._imx226参数

52单片机中断_52单片机外部中断-程序员宅基地

文章浏览阅读4.6k次,点赞4次,收藏13次。一 中断的概念CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程被称为中断。概念可能不好理解,举个例子:假如你是个老师,你在上课,突然电话响了,一看是你老婆打过来的,你不敢不接,于是你只好暂停讲课接听电话,挂完电话,你继续讲课。这个过程中实际发生了一次中断。二 中断的响应条件1.中断源有中断请求;2.此中断_52单片机外部中断

redis数据丢失及解决-程序员宅基地

文章浏览阅读105次。Redis的数据回写机制Redis的数据回写机制分同步和异步两种,同步回写即SAVE命令,主进程直接向磁盘回写数据。在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的。异步回写即BGSAVE命令,主进程fork后,复制自身并通过这个新的进程回写磁盘,回写结束后新进程自行关闭。由于这样做不需要主进程阻塞,系统不会假死,一般默认会采用这个方法。个人感觉方法2采用fork主..._redis set get丢失

图表点编辑数据无反应_word插入图表无法编辑数据-程序员宅基地

文章浏览阅读5.7k次。Word2007文档中的图表功能相对于Word2003的图表工具Microsoft Graph而言,应用更灵活,功能更强大。要想充分发挥图表功能,用户应当在Word2007文档中创建图表,而不是在Word97~Word2003兼容文档中使用图表功能。在Word2007文档中创建图表的步骤如下所述:第1步,打开Word2007文档窗口,切换到“插入”功能区。在“插图”分组中单击“图表”按钮,如图20..._word点编辑数据无反应

BP神经网络公式推导-程序员宅基地

文章浏览阅读2k次。一、m-p神经元模型:神经网络是由许多个神经云所构成,而一个单独的神经元的结构如上图所示。若一个神经元有n个输入xxx,每一个输入都要配有一个权值www,神经元的总输入为:∑i=1nwixi\sum_{i=1}^n w_ix_ii=1∑n​wi​xi​生物的神经元需要收到一定程度的刺激才可被激活,所以用θ\thetaθ表示神经元的阈值,当总输入高于此值,该神经元才可被激活。神经元的输出yyy取决于激发函数y=f(x)y=f(x)y=f(x),神经元总输入减去阈值得到的值:∑i=1nwixi−θ\su_bp神经网络公式