Storm基础
Storm是个实时的、分布式以及具备高容错的计算系统
实时性—进程常驻内存 数据少量经过磁盘,在内存中处理
分布式—集群操作
高容错—节点宕机,信息处理不完整(acker机制来解决这些问题)
Storm计算模型
[外链图片转存失败(img-nMFRjtuU-1563924936197)(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\1561173142512.png)]
Tuple – 元组,Stream中最小数据组成单元
Spout – 数据源 (假) 发送数据/推送数据
本身不会产生数据,通过客户端得到数据(2个方法:OutputFieldsDeclarer、nextTuple)
一个Spout可以发送多个数据流(Stream)
OutputFieldsDeclarer中的declare方法声明定义的不同数据流 --为推送准备好数据类型
Spout中最核心的方法是nextTuple --不断推送
Bolt – 数据流处理组件 接受数据
拓扑中数据处理均有Bolt完成。对于简单的任务或者数据流转换,单个Bolt可以简单实现;更加复杂场景往往需要多个Bolt分多个步骤完成
一个Bolt可以发送多个数据流(Stream)
Bolt中最核心的方法是execute方法 --接收、执行数据
OutputFieldsDeclarer中的declare方法声明定义的不同数据流 --为推送准备好数据类型
Stream – 汇聚tuple形成的数据流
从Spout中源源不断传递数据给Bolt、以及上一个Bolt传递数据给下一个Bolt,所形成的这些数据通道即叫做Stream
当数据少,需要单一流时,不需要设streamID(默认ID是default),但是数据多要使用多个流时每个流都要设置数据流的ID,便于后期数据的汇聚。
Stream Grouping – 数据流分组(即数据分发策略)
DAG – 有向无环图的实现
对于Storm实时计算逻辑的封装即,由一系列通过数据流相互关联的Spout、Bolt所组成的拓扑结构
生命周期:此拓扑只要启动就会一直在集群中运行,直到手动将其kill,否则不会终止
区别于MapReduce当中的Job,MR当中的Job在计算执行完成就会终止
架构
Nimbus 分配任务、资源调度、上传jar包
Supervisor 开启进程(可以开启n个woker)
Worker 执行任务(可以执行n个task(spolt–推送数据/bolt–逻辑单元处理)任务)
编程模型
DAG (Topology) --单向运作
component组件: Spout Bolt
流式处理(异步 与 同步)
异步:客户端提交数据进行结算,并不会等待数据计算结果
例:计算PV(访问量)、UV(独立访客)、访问热点以及 某些数据的聚合、加和、平均等
[外链图片转存失败(img-UXbpTmGe-1563924936197)(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\1561172658515.png)]
同步:客户端提交数据请求之后,立刻取得计算结果并返回给客户端
例:图片特征提取
[外链图片转存失败(img-RGE1L5Up-1563924936198)(C:\Users\86158\AppData\Roaming\Typora\typora-user-images\1561172700515.png)]
Storm与MapReduce、SparkStreaming对比
Storm | MapReduce | SparkStreaming |
---|---|---|
流式处理 | 批处理 | 微批处理 |
(毫)秒级 | 分钟级 | 秒级 |
DAG模型 | Map+Reduce模型 | |
常驻运行 | 反复启停 | |
已经很稳定 | 稳定性改进 | |
独立系统,专为流式计算设计 | spark核心之上一种计算模型 能与其他组件很好结合 |
数据流分组-数据分发策略(4+4)
Shuffle grouping(随机分组):这种方式会随机分发tuple给bolt的各个task,每个bolt实例接收到的相同数量的tuple。
Fields grouping(按字段分组):根据指定字段的值进行分组。比如说,一个数据流根据“word”字段进行分组,所有具有相同“word”字段值的tuple会路由到同一个bolt的task中。
All grouping(全复制分组):将所有的tuple复制后分发给所有bolt task。每个订阅数据流的task都会接收到tuple的拷贝。
Globle grouping(全局分组):这种分组方式将所有的tuples路由到唯一一个task上。Storm按照最小的task ID来选取接收数据的task。 —可以做高可用
None grouping(不分组):在功能上和随机分组相同,是为将来预留的。
Direct grouping(指向型分组):数据源会调用emitDirect()方法来判断一个tuple应该由哪个Storm组件来接收。只能在声明了是指向型的数据流上使用。
Local or shuffle grouping(本地或随机分组):和随机分组类似,但是,会将tuple分发给同一个worker内的bolt task(如果worker内有接收数据的bolt task)。其他情况下,采用随机分组的方式。取决于topology的并发度,本地或随机分组可以减少网络传输,从而提高topology性能。
CustomGrouping(自定义分组):相当于MapReduce自己去实现一个partition