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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章