Java大数据实战 Storm构建实时流处理之求和案例

package com.imooc.bigdata;

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需要继承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 number = 0;

      /**

      • 会产生数据,在生产上肯定是从消息队列中获取数据

      • 这个方法是一个死循环,会一直不停的执行
        */
        public void nextTuple() {
        this.collector.emit(new Values(++number));

        System.out.println("Spout: " + number);

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

      }

      /**

      • 声明输出字段
      • @param declarer
        */
        public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declare(new Fields(“num”));
        }
        }

    /**

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

      /**

      • 初始化方法,会被执行一次
      • @param stormConf
      • @param context
      • @param collector
        */
        public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {

      }

      int sum = 0;

      /**

      • 其实也是一个死循环,职责:获取Spout发送过来的数据

      • @param input
        */
        public void execute(Tuple input) {

        // Bolt中获取值可以根据index获取,也可以根据上一个环节中定义的field的名称获取(建议使用该方式)
        Integer value = input.getIntegerByField(“num”);
        sum += value;

        System.out.println(“Bolt: sum = [” + sum + “]”);
        }

      public void declareOutputFields(OutputFieldsDeclarer declarer) {

      }
      }

    public static void main(String[] args) throws Exception{

     // 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");
    
    
    
     // 创建一个本地Storm集群:本地模式运行,不需要搭建Storm集群
     LocalCluster cluster = new LocalCluster();
     cluster.submitTopology("LocalSumStormTopology", new Config(),
             builder.createTopology());
    

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值