storm基本概念和使用

1.storm是什么

strom是apache下的一个顶级的项目,官网地址为http://storm.apache.org/

借用官网的一段话

Apache Storm is a free and open source distributed realtime computation system

是一个免费开源的分布式实时计算系统

2.strom的特点是什么和应用场景举例

特点:实时,可扩展,容错,多语言

应用场景:实时统计用户的行为,推送用户感兴趣的内容;实时分析统计日志内容,做到预警等

3.strom核心概念

1)tuple  单个数据,可理解为水滴

2)stream 数据流,可理解为水流

3)spout 数据的发送者,spout从外部获取数据,比如kafka,可理解为水龙头

4)bolt 数据的处理单元   可以嵌套  可以理解为 水桶、水壶

5)Topology 拓扑 由spouts和bolts组成的有序无环图,可以理解为整个处理水流头流出水的流程。

4.入门demo

使用的是1.2.3版本

<dependency>
  <groupId>org.apache.storm</groupId>
  <artifactId>storm-core</artifactId>
  <version>${storm.version}</version>
 <!-- <scope>provided</scope>--> <!--打包的时候是不需要的,但编译的时候需要-->
</dependency>
package club.songhq.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;

/**
 * @description 本地求和
 * @author songhaiqiang
 * @date 2020/1/18 17:32
 *
 * @return
 */
public class LocalSumStormTopology {

    /**
     * @description spout实现baseRichSpout
     * @author songhaiqiang
     * @date 2020/1/18 17:35
     *
     * @return
     */
    public static class DataSourceSpout extends BaseRichSpout {

        private SpoutOutputCollector collector;

        /**
         * @description 声明输出字段
         * @author songhaiqiang
         * @date 2020/1/18 17:57
         * @param declarer
         * @return void
         */
        @Override
        public void declareOutputFields(OutputFieldsDeclarer declarer) {
            declarer.declare(new Fields("number"));
        }

        /**
         * @description
         * @author songhaiqiang
         * @date 2020/1/18 17:37
         * @param conf 配置参数
         * @param context 上下文
         * @param collector 数据发射器
         * @return void
         */
        @Override
        public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
            this.collector = collector;
        }

        int number = 0;
        /**
         * @description 会产生数据,在生产上是从消息队列中获取数据
         *
         * 要不停的发送数据就一定是个死循环,
         * @author songhaiqiang
         * @date 2020/1/18 17:34
         * @return void
         */
        @Override
        public void nextTuple() {
            collector.emit(new Values(++number));
            System.out.println("Spout : " +number);
            //防止数据产生太快,这个方法还提复杂的
            Utils.sleep(1000);
        }
    }

    public static class SumBolt extends BaseRichBolt{

        int sum = 0;
        /**
         * @description 初始化方法,会被执行一次
         * @author songhaiqiang
         * @date 2020/1/18 18:44
         * @param stormConf
         * @param context
         * @param collector
         * @return void
         */
        @Override
        public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {

        }

        /**
         * @description 该方法也是一个死循环
         * @author songhaiqiang
         * @date 2020/1/18 18:45
         * @param input
         * @return void
         */
        @Override
        public void execute(Tuple input) {
            //Bolt中获取值可以根据index获取,也可以根据上一个环节定义的filed名称获取(建议使用该方式)
            Integer number = input.getIntegerByField("number");
            sum += number;
            System.out.println("Bolt 输出的值是 : "+ sum);
        }

        @Override
        public void declareOutputFields(OutputFieldsDeclarer declarer) {
        //这里没有继续向下面传递tuple
        }
    }

    public static void main(String[] args) {
        TopologyBuilder topologyBuilder = new TopologyBuilder();
        topologyBuilder.setSpout("DataSourceSpout",new DataSourceSpout());
        //表示前后逻辑关系
        topologyBuilder.setBolt("SumBolt",new SumBolt()).shuffleGrouping("DataSourceSpout");
        //穿件一个Storm集群:本地模式运行,不需要搭建storm集群
        LocalCluster localCluster = new LocalCluster();
        localCluster.submitTopology("LocalSumStormTopology",new Config(),topologyBuilder.createTopology());

    }

}

5.storm并行度

 storm是在生产部署上分为nimbus,supervisor ,worker(slot) ,executor,task

worker(slot)是线程上的概念,一个supervisor默认可配置4个worker,可有这个参数指定端口号 supervisor.slots.ports,端口号的个数就是worker的个数,一个worker处理的是一个topology的子集,也就是说,一个worker只处理一个topology,但一个topology可以交给多个worker处理。

executor则是线程上的概念,一个worker上可以起多少个线程。

task则是处理数据的最小单元,可以是一个线程对应一个task,也可以是一个线程对应对应多个task。

下面是一个storm cluster的生产部署ui总览。

 

发布了37 篇原创文章 · 获赞 6 · 访问量 9269
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章