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