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總覽。