流式计算之Storm概念以及架构详解

一、什么是Storm?

Storm为分布式实时计算提供了一组通用原语,可被用于“流处理”之中,实时处理消息并更新数据库。这是管理队列及工作者集群的另一种方式。 Storm也可被用于“连续计算”(continuous computation),对数据流做连续查询,在计算时就将结果以流的形式输出给用户。它还可被用于“分布式RPC”,以并行的方式运行昂贵的运算。

Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm用于实时处理,就好比 Hadoop 用于批处理。Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。更棒的是你可以使用任意编程语言来做开发。

二、离线计算和流式计算

2.1 离线计算

离线计算:批量获取数据、批量传输数据、周期性批量计算数据、数据展示

代表技术:Sqoop批量导入数据、HDFS批量存储数据、MapReduce批量计算、Hive

2.2 流式计算

流式计算:数据实时产生、数据实时传输、数据实时计算、实时展示

代表技术:Flume实时获取数据、Kafka/metaq实时数据存储、Storm/JStorm实时数据计算、Redis实时结果缓存、持久化存储(mysql)。

一句话总结:将源源不断产生的数据实时收集并实时计算,尽可能快的得到计算结果

在这里插入图片描述

2.3 Storm与Hadoop的区别

不同点:

Storm用于实时计算 Hadoop用于离线计算
Storm处理的数据保存在内存中,源源不断 Hadoop处理的数据保存在文件系统中,一批一批
Storm的数据通过网络传输进来 Hadoop的数据保存在磁盘中

相同点:

Storm与Hadoop的编程模型相似

三、Storm的体系结构

在这里插入图片描述
在这里插入图片描述

Nimbus:负责资源分配和任务调度。

Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。通过配置文件设置当前supervisor上启动多少个worker。

Worker:运行具体处理组件逻辑的进程。Worker运行的任务类型只有两种,一种是Spout任务,一种是Bolt任务。

Executor:Storm 0.8之后,Executor为Worker进程中的具体的物理线程,同一个Spout/Bolt的Task可能会共享一个物理线程,一个Executor中只能运行隶属于同一个Spout/Bolt的Task。

Task:worker中每一个spout/bolt的线程称为一个task. 在storm0.8之后,task不再与物理线程对应,不同spout/bolt的task可能会共享一个物理线程,该线程称为executor。

在这里插入图片描述

四、Storm的运行机制

在这里插入图片描述
(1)整个处理流程的组织协调不用用户去关心,用户只需要去定义每一个步骤中的具体业务处理逻辑

(2)具体执行任务的角色是Worker,Worker执行任务时具体的行为则有我们定义的业务逻辑决定

在这里插入图片描述

五、Storm的安装配置

(1)解压:

tar -zxvf apache-storm-1.0.3.tar.gz -C ~/training/

(2)设置环境变量:
在这里插入图片描述
(3)编辑配置文件:

[root@bigdata111 apache-storm-1.0.3]$ vi /conf/storm.yaml

在这里插入图片描述

注意:如果要搭建Storm的HA,只需要在nimbus.seeds中设置多个nimbus即可

(4)把安装包复制到其他节点上即可。

六、启动和查看Storm

(1)在nimbus.host所属的机器上启动 nimbus服务和logviewer服务

storm nimbus &
storm logviewer &

(2)在nimbus.host所属的机器上启动ui服务

storm ui &

(3)在其它个点击上启动supervisor服务和logviewer服务

storm supervisor &
storm logviewer &

(4)查看storm集群:访问 http://bigdata111:8080,即可看到storm的ui界面
在这里插入图片描述

七、Storm的常用命令

有许多简单且有用的命令可以用来管理拓扑,它们可以提交、杀死、禁用、再平衡拓扑。

(1)提交任务命令格式:storm jar 【jar路径】 【拓扑包名.拓扑类名】 【拓扑名称】

storm jar storm-starter-topologies-1.0.3.jar org.apache.storm.starter.WordCountTopology MyWordCount1

(2)杀死任务命令格式:storm kill 【拓扑名称】 -w 10

(执行kill命令时可以通过-w [等待秒数]指定拓扑停用以后的等待时间)

storm kill topology-name -w 10

(3)停用任务命令格式:storm deactivte 【拓扑名称】

storm deactivte topology-name

(4)启用任务命令格式:storm activate【拓扑名称】

storm activate topology-name

(5)重新部署任务命令格式:storm rebalance 【拓扑名称】

storm rebalance topology-name

再平衡使你重分配集群任务。这是个很强大的命令。比如,你向一个运行中的集群增加了节点。再平衡命令将会停用拓扑,然后在相应超时时间之后重分配工人,并重启拓扑。

八、Demo演示:WordCount及流程分析

通过查看Storm UI上每个组件的events链接,可以查看Storm的每个组件(spout、blot)发送的消息。但Storm的event logger的功能默认是禁用的,需要在配置文件中设置:topology.eventlogger.executors: 1,具体说明如下:

"topology.eventlogger.executors": 0 	//默认,禁用
"topology.eventlogger.executors": 1 	//一个topology分配一个Event Logger.
"topology.eventlogger.executors": nil 	//每个worker.分配一个Event Logge

在这里插入图片描述
WordCount的数据流程分析:
在这里插入图片描述

九、Storm的编程模型

在这里插入图片描述
(1)Topology:Storm中运行的一个实时应用程序的名称。(拓扑)

(2)Spout:在一个topology中获取源数据流的组件。

通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。

(3)Bolt:接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。

(4)Tuple:一次消息传递的基本单元,理解为一组消息就是一个Tuple。

(5)Stream:表示数据的流向。

(6)StreamGroup:数据分组策略

Shuffle Grouping :随机分组,尽量均匀分布到下游Bolt中
Fields Grouping :按字段分组,按数据中field值进行分组;相同field值的Tuple被发送到相同的Task
All grouping :广播
Global grouping :全局分组,Tuple被分配到一个Bolt中的一个Task,实现事务性的Topology。
None grouping :不分组
Direct grouping :直接分组 指定分组

十、Storm编程案例:WordCount

流式计算一般架构图:
在这里插入图片描述
Flume:用来获取数据

Kafka:用来临时保存数据

Strom:用来计算数据

Redis:是个内存数据库,用来保存结果数据

(1)创建Spout(WordCountSpout)组件采集数据,作为整个Topology的数据源
在这里插入图片描述
(2)创建Bolt(WordCountSplitBolt)组件进行分词操作
在这里插入图片描述
(3)创建Bolt(WordCountBoltCount)组件进行单词计数操作
在这里插入图片描述
(4)创建主程序Topology(WordCountTopology),并提交到本地运行
在这里插入图片描述
(5)也可以将主程序Topology(WordCountTopology)提交到Storm集群运行
在这里插入图片描述

十一、Storm集群在ZK上保存的数据结构

在这里插入图片描述

十二、Storm集群任务提交流程

在这里插入图片描述

十三、Storm内部通信机制

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43520450/article/details/106332645