学习storm实现求和操作

时间:2023-03-09 00:10:38
学习storm实现求和操作

1 storm求和简单操作

主要逻辑,就是spout发送数据源,blot进行处理数据,主要注意的点就是 spout这有个nextTuple自旋,和使用父类的declare..方法声明要发送到下游的名称,然后blot execute接受到进行执行

1.1代码实现

package com.xiaodao.big;

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; /**
* 累积求和
*/
public class LocalSumStormTopology { /**
* spout 需要继承baserichspout
* 数据源需要产生并发送数据
*/
public static class DataSourceSpout extends BaseRichSpout{ private SpoutOutputCollector collector;
/**
* 初始化方法只会被调用一次
*
* @param conf 配置参数
* @param context 上下文
* @param collector 数据发射器
*/
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector = collector;
} int num = 0;
/**
* 会产生数据,在生产上肯定是从消息队列中获取数据
* 这个方法是一个死循环,是因为storm一直运行,会一直不行的执行
*/
public void nextTuple() {
collector.emit( new Values(num++));
System.out.println("Spout:发送 "+ num);
Utils.sleep(2000); } /**
* 声明下一个blot接受的名称,不然blot不知道接受到了什么
* @param declarer
*/
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("no"));
}
} /**
* 数据的累积求和 blot,接受数据,并处理
*/
public static class SumBlot extends BaseRichBolt{ public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) { } int sum =0;
/**
* 也是一个自旋锁.(死循环)
* @param input
*/
public void execute(Tuple input) {
//这里获取方式有很多
Integer no = input.getIntegerByField("no");
sum +=no;
System.out.println("Blot: sum = ["+ sum+"]"); } public void declareOutputFields(OutputFieldsDeclarer declarer) { }
} public static void main(String[] args) {
//任何一个作业都需要topology
//需要控制好blot spout 顺序
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("DataSourceSpout",new DataSourceSpout(),1);
builder.setBolt("SumBlot",new SumBlot(),1).shuffleGrouping("DataSourceSpout");
Config conf = new Config();
conf.setNumWorkers(2);
//如果到200个消息就不发送了
conf.setMaxSpoutPending(200);
//创建一个本地的模式,不需要搭建
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("LocalSumStormTopology",conf,builder.createTopology());
}
}

执行运行就可以