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总览。