Storm是一个开源的分布式实时计算框架,可以简单、可靠的方式进行大数据流处理。通常用于实时分析,在线机器学习,次序计算,分布式RPC、ETL等场景。Storm具有如下特点
支持水平横向拓展
具有高容错性
处理速度非常快,每个节点每秒能处理超过一百万个tuples(元组)
易于操作和设置,并且可以与任何编程一起使用
支持本地模式运行,开发简单
支持图形化管理界面
Storm对比Hadoop
Hadoop采用mapreduce处理数据,而Mapreduce主要是对数据进行批处理,这使得Hadoop更适合于海量
离线数据处理
的场景。而Storm的设计目表是对数据进行实时计算
。
Storm与SparkStreaming
在前面讲解SparkStreaming的时候,已经提过SparkStreaming真正意义上并不能算做是一个流处理框架,SparkStreming接受实时数据,对数据拆分,然后进行微批处理。只不过SparkStreming可以将数据进行小粒度拆分,使得其能够接近于流处理的效果,但其本质上还是批处理(微批处理)
Storm对比Flink
Storm和Flink都是真正意义上的实时计算框架对比如下
storm | flink | |
---|---|---|
状态管理 | 无状态 | 有状态 |
窗口支持 | 对事件窗口支持弱,缓存整个窗口的所有数据,窗口结束时一起计算 | 窗口支持较为完善,自带一些窗口聚合方法并且会自动管理窗口状态 |
消息传递 | At Most Once 、At Least Once | At Most Once、At Least Once、Exactly Once |
容错方式 | ACK 机制:对每个消息进行全链路跟踪,失败或者超时时候进行重发 | 检查点机制:通过分布式一致性快照机制,对数据流和算子状态进行保存。在发生错误时,使系统能够进行回滚。 |
Storm流程图
一、Storm核心概念
1.Topologies(拓扑)
一个完整Strom流处理程序被成为Strom topology。它是一个有
Spouts
和Blots
通过Stream
连接起来的有向无环图,Storm会保持每个提交到集群topology持续地运行,从而源源不断的数据流,直到你将其杀死为止。
2. Stream流
Stream是Storm中的核心概念。一个Stream是无界的、以分布式方式并行创建和处理的Tuple序列。Tuple可以包含大多数基本类型以及自定义类型的数据。简单来说Tuple是流数据的载体,Stream就是一系列Tuple
3. Spouts
Spouts是数据流的源头,一个Spout可以向不止一个Streams中发送数据。Spout通常分为可靠和不可靠。可靠的Spout能够在失败的时候重新发送Touple。不可靠的Spout一旦把Tuple发送出去就不关心其去处了。
Bolts
Bolts是流处理的处理单元,它可以从一个或多个Streams中接受数据,处理完成后再发射新的Streams中,Bolts可以执行过滤,聚合,连接等操作,并能与文件系统或者数据库交互。
二、Stream groupings
Stream Groupings
注:一个圆圈表示一个Task
Spouts和bolts在集群上执行任务时,是由多个Task并行执行的,当一个Tuple需要从BoltA 发送到BoltB执行的时候。这些操作都是由Stream groupings分组策略来决定的,Strom一共有8个内置的Stream Grouping 。用户也可以自己实现
CustomStreamGrouping
接口自定义实现。
Storm 架构1. shuffle grouping
Tuple随机的分发到每个Bolt的每个Task上,每个Bolt获取等量的Tuples
2. Fields grouping
Streams通过grouping指定的字段field来分组。假设通过userid字段进行分区,那么具有相同的user-id的Tuples就会发送到一个Task
3. Partial Key grouping
Streams通过grouping中指定的字段field来分组,与fields grouping相似。但是对于两个下游的Bolt来说是负载均衡的,可以在输入数据不平均的情况下更好的优化。
4. All Grouping
Streams 会被所有的Bolts的Task进行复制,但是会存在数据重复处理,所以需要谨慎使用。
5. Global grouping
整个Streams会进入Bolt的其中一个Task,通常会进入id最小的Task。
6. None grouping
当前的None grouping和shuffle grouping等价,随机分发
7. Direct grouping
Direct grouping 只能被用于 direct streams。使用这种方式需要由Tuple的生产者直接指定由哪个Task进行处理
8. Local of shuffle grouping
如果目标Bolt有Tasks和当前Bolt的Tasks在同一个worker进程,那么则优先将Tuple Shuffled到处于同一个进程的目标Bolt的Tasks上,可以减少网络传输,否则和Shuffle grouping一样处理
三、Storm架构
1.Nimbus进程
也叫做Master Node,是Storm集群工作的全局指挥官。主要功能如下:
- 通过Thirft接口,监听接受client提交的topology
- 根据集群的Workers的资源情况,将Client提交到Topology进行任务分配,分配结果写入zookeeper
- 通过Thirft接口,监听Supervisor的下载Topology代码的请求,并且提供下载。
- 通过Thrift接口,监听UI对统计信息的读取,从zookeeper上读取统计信息,返回给UI。
- 若进程退出后,立即在本机重启,不影响集群运行
2. Supervisor进程
也叫做worker Node,是Storm集群的资源管理者,按需启动Workerj进程。主要功能如下
- 定时从zookeeper检查是否有新的Topology代码未下载到本地,删除旧的Topology代码
- 根据Nimbus的任务计划,在本机按需启动一个或者多个worker进程,并且监控进程情况。
- 若进程退出,则本机重启,不影响集群
3. Worker进程
Storm集群的任务构造者,构造spoult或Bolt的Task实例,启动Executor线程。主要功能如下:
1.根据zookeeper上分配的Task,在本进程启动一个或者多个Executor线程,将构造好的Task实例交给Executor运行。
- 向zookeeper写入心跳
- 维持传输队列,发送Tuple到其他的Worker
- 若进程退出,立即本机重启,不影响集群
4. Executor线程
Storm集群的任务执行者,循环执行Task代码。执行一个或者多个Task,执行Acker机制,负责发送Task处理状态给对应的Spout所在worker
5. zookeeper
Nimbus和Supervisor进程都被设计为快速失败(遇到任何意外情况时进程自毁),和无状态(所有状态保存在zookeeper或磁盘上)。如果进程意外被销毁,重启的时候只需要从zookeeper上获取之前的状态数据即可,不会丢失数据。
6. 并行度
并行度
- 一个运行中的Topology由集群中的多个worker进程组成
- 默认情况下,每个worker进程默认启动一个线程
- 默认情况下 每个executor默认启动一个Task线程
- Task是组成Compoment的代码单元(spout或者Bolt)
网友评论