Storm学习笔记(3)- Storm编程 **

本文详细介绍了Storm开发环境的搭建过程,包括IDEA项目的构建步骤。接着,深入探讨了Storm的核心接口,如ISpout、IComponent和IBolt,解释了它们的功能和实现方式。通过两个实战案例——求和与词频统计,展示了如何运用这些接口来设计拓扑结构和处理数据。最后,提到了Storm编程中的一些注意事项,包括错误处理和保留字段的使用限制。
摘要由CSDN通过智能技术生成

Storm开发环境搭建

本地环境配置:

	jdk: 1.8
		windows: exe  
		linux/mac(dmg): tar .....   把jdk指定到系统环境变量(~/.bash_profile)
			export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home
			export PATH=$JAVA_HOME/bin:$PATH

			source ~/.bash_profile
			echo $JAVA_HOME
			java -version
	IDEA: 
	Maven: 3.3+
		windows/linux/mac 下载安装包
		tar .... -C ~/app

		把maven指定到系统环境变量(~/.bash_profile)
		export MAVEN_HOME=/Users/rocky/app/apache-maven-3.3.9
		export PATH=$MAVEN_HOME/bin:$PATH
		source ~/.bash_profile
		echo $JAVA_HOME
		mvn -v

		调整maven依赖下载的jar所在位置: $MAVEN_HOME/conf/setting.xml
		<localRepository>/Users/rocky/maven_repos</localRepository>

可以在官网看到最新的依赖
http://storm.apache.org/releases/1.2.2/Maven.html


	在pom.xml中添加storm的maven依赖
		<dependency>
	      <groupId>org.apache.storm</groupId>
	      <artifactId>storm-core</artifactId>
	      <version>1.2.2</version>
	    </dependency>

IDEA项目构建:
选择模板
在这里插入图片描述
填写信息:下一步:点击next
在这里插入图片描述
填写信息:下一步:点击next
在这里插入图片描述
下一步:点击finish完成
在这里插入图片描述

Storm核心接口

ISpout详解

概述

  • 核心接口(interface),负责将数据发送到topology中去处理
  • Storm会跟踪Spout发出去的tuple的DAG
  • 调用ack/fail方法判断成功失败
  • tuple: message id;当出现错误的时候id可以回传
  • ack/fail/nextTuple是在同一个线程中执行的,所以不用考虑线程安全方面

核心方法

  • open: 初始化操作
  • close: 资源释放操作
  • nextTuple: 发送数据 core api
  • ack: tuple处理成功,storm会反馈给spout一个成功消息
  • fail:tuple处理失败,storm会发送一个消息给spout,处理失败

实现类

  • ctrl+alt+鼠标左键选择要打开的方法
public abstract class BaseRichSpout extends BaseComponent implements IRichSpout {
   
		public interface IRichSpout extends ISpout, IComponent 
		DRPCSpout
		ShellSpout

IComponent详解

概述:
public interface IComponent extends Serializable
为topology中所有可能的组件提供公用的方法

void declareOutputFields(OutputFieldsDeclarer declarer);
用于声明当前Spout/Bolt发送的tuple的名称
使用OutputFieldsDeclarer配合使用

实现类:

public abstract class BaseComponent implements IComponent

IBolt详解

概述

  • 职责:接收tuple处理,并进行相应的处理(filter/join/…)
  • hold住tuple再处理
  • IBolt会在一个运行的机器上创建,使用Java序列化它,然后提交到主节点(nimbus)上去执行
  • nimbus会启动worker来反序列化,调用prepare方法,然后才开始处理tuple处理

方法

  • prepare:初始化
  • execute:处理一个tuple数据,tuple对象中包含了元数据信息
  • cleanup:shutdown之前的资源清理操作

实现类:

public abstract class BaseRichBolt extends BaseComponent implements IRichBolt {
		public interface IRichBolt extends IBolt, IComponent 
		RichShellBolt

Storm求和案例编程

求和案例
  需求:1 + 2 + 3 + … = ???
  实现方案:
    Spout发送数字作为input
    使用Bolt来处理业务逻辑:求和
    将结果输出到控制台
  拓扑设计: DataSourceSpout --> SumBolt

import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.TopologyBuilder;
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.apache.storm.utils.Utils;

import java.util.Map;

/**
 * 使用Storm实现积累求和的操作
 */
public class LocalSumStormTopology {
   


    /**Spout功能实现
     * Spout需要继承BaseRichSpout
     * 数据源需要产生数据并发射
     */
    public static class DataSourceSpout extends BaseRichSpout {
   

        private SpoutOutputCollector collector;
        /**
         * 初始化方法,只会被调用一次
         * @param conf  配置参数
         * @param context  上下文
         * @param collector 数据发射器
         */
        public 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值