Storm案例之自增数字求和

1.案例需求

实现自增数字相加的和 1+2+3+4+5+6+........

2.需求分析

Spout来发送数字作为input

使用Bolt来实现求和逻辑

将结果输出到控制台

3.导入Storm的pom依赖

<dependency>
      <groupId>org.apache.storm</groupId>
      <artifactId>storm-core</artifactId>
      <version>1.1.1</version>
</dependency>
4.具体代码实现

package cn.ysjh;

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 SumStorm {

    /*
    Spout需要继承Base
     */

    public static class DataSourceSpout extends BaseRichSpout{

       private SpoutOutputCollector spoutOutputCollector;
        /*
        初始化方法,只会被调用一次
         */
        @Override
        public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
           this.spoutOutputCollector=spoutOutputCollector;
        }


        int num=0;
        /*
         会产生数据,在实际生产中肯定是从消息队列中获取数据
         这个方法是一个死循环,会一直运行
         */
        @Override
        public void nextTuple() {
            this.spoutOutputCollector.emit(new Values(++num));

            System.out.println("数据:"+num);

            //防止数据产生太快
            Utils.sleep(1000);
        }


        /*
          声明输出字段
         */
        @Override
        public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
            //这里要和上边nextTuple()方法中的Values中的对应
          outputFieldsDeclarer.declare(new Fields("number"));
        }
    }



    /*
     数据的累计求和Bolt:接收数据并处理
     */
  private static class SumBolt extends BaseRichBolt {

      /*
      初始化方法,会被执行一次
       */
        @Override
        public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {

        }

        int sum=0;
        /*
        获取Spout发送过来的数据
        Bolt中获取值可以根据index获取,也可以根据上一个环节中定义的fields名称获取,建议使用后一种方法
         */
        @Override
        public void execute(Tuple tuple) {

            Integer Num = tuple.getIntegerByField("number");

            sum+=Num;

            System.out.println("Sum:"+sum);
        }

        /*
         */
        @Override
        public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {

        }
    }

   public static void main(String[] args){

      //TopologyBuilder根据Spout和Bolt来构建topology,Storm中任何一个作业都是通过Topology的方式进行提交的,Topology中需要指定Spout和Bolt执行的顺序
       TopologyBuilder builder = new TopologyBuilder();
       builder.setSpout("DataSourceSpout",new DataSourceSpout());
       builder.setBolt("SumBolt",new SumBolt()).shuffleGrouping("DataSourceSpout");


       //创建本地模式,只需使用LocalCluster类
       LocalCluster cluster = new LocalCluster();
       cluster.submitTopology("SumStorm",new Config(),builder.createTopology());

   }

}
可以看出先实现Spout和Bolt,最后实现Topology进行本地运行

注意:

这里是本地运行模式,不需要Storm集群环境,如果要提交到集群上运行,最后的LocalCluster需要修改为StormSubmitter将Topology提交到集群上运行

5.运行截图




--------------------- 
作者:ysjh0014 
来源:CSDN 
原文:https://blog.csdn.net/ys_230014/article/details/83998653 
版权声明:本文为博主原创文章,转载请附上博文链接!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值