初识Strom:
一、原理架构图
一个连续运行的主节点组织若干节点工作,构成了一个Storm集群。
在 Storm 集群中,有两类节点:主节点(master node)和工作节点(worker nodes)。
主节点运行着一个叫做 Nimbus 的守护进程,负责在集群中分发代码,为工作节点分配任务,并监控状态。Supervisor守护进程作为拓扑的一部分运行在工作节点上。每一个工作节点上面运行一个叫做Supervisor的节点。Supervisor会监听分配给它那台机器的工作,根据需要启动/关闭工作进程。每一个工作进程执行一个topology的一个子集;一个运行的topology由运行在很多机器上的很多工作进程组成。Nimbus和Supervisor之间的所有协调工作都是通过Zookeeper集群完成。另外,Nimbus进程和Supervisor进程都是快速失败(fail-fast)和无状态的。所有的状态要么在zookeeper里面, 要么在本地磁盘上。这也就意味着你可以用kill -9来杀死Nimbus和Supervisor进程, 然后再重启它们,就好像什么都没有发生过。这个设计使得Storm异常的稳定。相关概念的深度解读:
Nimbus:负责资源分配和任务调度。Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。Worker:运行具体处理组件逻辑的进程。拓扑是在一个或多个工作进程(worker processes)中运行的,但一个worker只会运行一个topology,不会同时为多个topology服务。每个工作进程都是一个实际的 JVM 进程,并且执行拓扑的一个子集。Storm会在所有的worker 中分散任务,以便实现集群的负载均衡。最后,来张图来展示它们的关系:
现在想象一下,很容易在整个 Storm 集群定义每个 bolt 和 spout 的并行性级别,因此你可以无限的扩展你的拓扑结构。通过增加Storm的并行度,可以大大提高程序运行的效率。
二、大白话理解Storm并行度:worker、executor和task之间的工作机制
1、引言
默认情况下,1个topology默认使用1个worker进程,每个worker进程默认启动1个executor,每个executor默认启动1个task。
注释:一旦启动了一个topology,worker是不能动态调整的,但是executor是可以动态调整的!!!
即:进程数固定,线程可以动态调整!!!
new一个Spout就是一个task;
new一个bolt又是一个task;
==>一个线程里面就有了两个task!!!
==>为了提高并行度:可以开多个worker,多个executor,而配置多个task(Spout或bolt)是没有效果,只是为了增加逻辑性。
2、通过自定义配置改变Strom的并行度
我们先放一个官网的topology示例,通过该实例配置来一步步的介绍这个理解起来稍微有些复杂的概念:
Config conf = new Config();
conf.setNumWorkers(2); // 为此 topology 配置两个 worker 进程
topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // blue-spout 并行度=2(2个executor)
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2) // green-bolt 并行度=2
.setNumTasks(4) // 为此 green-bolt 配置 4 个 task
.shuffleGrouping("blue-spout");
topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6) // yellow-bolt 并行度=6
.shuffleGrouping("green-bolt");
StormSubmitter.submitTopology(
"mytopology",
conf,
topologyBuilder.createTopology()
);
我们先解读一下上面配置的含义:
我们在给出官方的图,看下官方的总结:
可以看出,这个图片完整无缺地还原了代码里设定的 topology 结构:
图左最大的灰色方框,表示这个 topology;topology 里面刚好有两个白色方框,表示2个 worker 进程;每个 worker 里面的灰色方框表示 executor 线程,可以看到2个 worker 方框里各有5个 executor;为什么各有5个executor呢?因为代码里面指定的 spout 并行度=2,green-bolt并行度=2,yellow-bolt并行度=6,加起来刚好是10,而配置的 worker 数量为2,那么自然地,这10个 executor 会均匀地分配到2个 worker 里面;每个 executor 里面的黄蓝绿(写着Task)的方框,就是最小的处理单元 task 了。我们重点看绿色的 Task 方框,与其他 Task 不同的是,两个绿色方框同时出现在一个 executor 方框内。根据上面的解释,我们再通过一个图进行总结:
希望,我已经讲明白了,如果不明白,或者讲的有什么问题,欢迎留言……
下节我们将学习Storm的单机环境和分布式环境的搭建、如何提交/查看/杀死Storm作业、Storm UI界面参数介绍,并实战演示storm并行度参数调优以增强我们对Storm并行度的理解……