
storm分布式计算结构称为topology(拓扑)由stream,spout,bolt组成。
spout代表一个storm拓扑中的数据入口,连接到数据源,将数据转化为一个个tuple,并发射tuple
stream是由无限制个tuple组成的序列。tuple为storm的核心数据结构,是包含了一个或多个键值对的列表。
bolt可以理解为计算程序中的运算或者函数,bolt的上游是输入流,经过bolt实施运算后,可输出一个或者多个输出流。
bolt可以订阅多个由spout或者其他bolt发射的数据流,用以构建复杂的数据流转换网络。
上述即为storm最基本的组成元素,无论storm如何运行,都是以stream,spout,bolt做为最基本的运行单元。而这三者则是共同构成了一个storm拓扑topology。
首先需要明确一个概念,bolt,spout实例,都属于任务,spout产生数据流,并发射,bolt消费数据流,进行计算,并进行落地或再发射,他们的存在以及运行过程都需要消耗资源,而storm集群是一个提供了资源的集群,我们要做的就是将spout/boult实例合理分配到storm集群提供的计算资源上,这样就可以让spout/bolt得以执行。
worker为JVM进程,一个topology会分配到一个或者多个worker上运行。
executor是worker内的java线程,是具体执行bolt/spout实例用的。下篇文章在介绍如何提供storm并行计算能力时会介绍worker以及executor的配置。
在storm中,worker是由supervisor进程创建,并进行监控的。storm集群遵循主从模式,主为nimbus,从为supervisor,storm集群由一个主节点(确实有单点问题),和多个工作节点(supervisor)组成,并使用zookeeper来协调集群中的状态信息,比如任务分配情况,worker状态,supervisor的拓扑度量。
通过配置可指定supervisor上可运行多少worker。一个worker代表一个slot。
nimbus守护进程的主要职责是管理,协调和监控在集群上运行的topology.包括topology的发布,任务指派,事件处理失败时重新指派任务。
supervisor守护进程等待nimbus分配任务后生成并监控workers执行任务。supervosior和worker都是运行在不同的JVM进程上。
了解了集群模式下,storm大致的分布概念,下面结合笔者做的一个实例,了解一下如何发布计算资源到storm集群上。
笔者定义了一个spout,两个bolt 运算过程如下:
其中streamMaking是一个不断生成随机数(5~30)的spout实例,Step1Bolt会过滤掉15以下的随机数(过滤),15以上的随机数会乘以16(计算),再将结果向后发射。Step2Bolt订阅Step1Bolt发射的数据,接收数据后,打印输出。流程结束。
笔者在定义spout/bolt实例时,配置了spout,bolt的并行执行数。其中
streamMaking:4 Step1Bolt:2 Step2Bolt 1
这样,发布成功后,storm会根据我的配置,分配足够的计算资源给予spout/bolt进行执行。
发布:
发布时,spout和bolt都是在一起以jar的形式发布到nimbus上的,分配后,内部定义的spout和bolt将以组件的形式被nimbus分配至worker进程中执行。
其中worker都是由supervisor创建的,创建出来的worker进程与supervisor是分开的不同进程。一个supervisor可创建多少worker可通过修改storm安装目录下的storm.yaml进行配置。
task是执行的最小单元。spout/bolt实例在定义中指定了,要起多少task,以及多少executor。也即一个topology发布之前已经定义了task总量,和需要多少资源来执行我的task总量。nimbus将根据已有的计算资源进行分配。
下图中: nimbus左边代表着计算任务量,和所需计算配置
nimbus右边代表着计算资源
nimbus将根据计算资源信息,合理的分发计算任务量。
发布成功后,通过storm自带的UI功能,可以查看你发布的topology运行以及其中每个组件的分布执行情况。
监控图像中清晰的显示了,目前部署的topology,以及topology中每个组件所分配的计算资源所在host,以及每个组件发射了多少tuple,接收了多少tuple,以及有多少个executor在并行执行。
本文讲述了storm内的基本元素以及基本概念,后续将讲述storm的重点配置信息,以及如何提高并发计算能力,窗口概念等高级特性,后续会进行源码分析,以及与其他实时计算中间件的比较。
在过去,在windows下跑storm是一个极大的挑战。通常,这种方式会涉及到Storm的源码编程方式,storm的生态依赖以及如何让windows伪装成UNIX/POSIX。就是因为这个原因,导致了很大一部分Storm的潜在用户放弃了将storm整合的到大数据处理框架中。
非常感谢Storm的开发者David Lao以及 来自Yahoo!的贡献(making-storm-fly-with-netty),下一个storm版本 (0.9.1-incubating) 将会更容易地部署到windows环境中。
下面,我将列出几个步骤,讲述如何将storm部署到windows环境中,并且将会跑一个简单的拓扑在这个环境中。这是一个简单的创建单节点以及跑一个"word count"简单拓扑的过程。
先附上UI图:
安装JAVA:
下载JDK(Storm 需要的环境是JDK6/7),在这个步骤中,我使用JDK 7,大家可以自行到Oracle官网下载。
我将它安装在:
C:\Java\jdk1.7.0_45\
安装Python:
为了测试python的安装,我将部署"word count"来自storm-starter project 的例子,一个用python写的multi-lang bolt。我使用的python2.7.6可以从这里下载。
我将python安装在这里:
C:\Python27\
安装以及执行Zookeeper:
下载 Apache Zookeeper 3.3.6并且解压它。按照如下命令进行配置以及执行:
>cd zookeeper-3.3.6
>copy conf\zoo_sample.cfg conf\zoo.cfg
>.\bin\zkServer.cmd
安装Storm
允许storm部署到windows下的官方正式版本现在还没有发布,但是你可以下载并且编译包含了这个功能的版本,点击这里下载。
(源码分支参考这里)。
解压压缩包到你想要的位置。我选择 C盘。
配置环境变量
在windows下需要配置两个环境变量: STORM_HOME 以及 JAVA_HOME ,并且同样要将安装路径配置到PATH中。
JAVA_HOME
C:\Java\jdk1.7.0_45\
STORM_HOME
C:\storm-0.9.1-incubating-SNAPSHOT-12182013\
PATH Add:
%STORM_HOME%\bin%JAVA_HOME%\binC:\Python27C:\Python27\Lib\site-packages\C:\Python27\Scripts\
PATHEXT Add:
.PY
Start Nimbus, Supervisor, and Storm UI Daemons
为每一个运行实例打开一个命令行:
Nimbus
>cd %STORM_HOME%
>storm nimbus
Supervisor
>cd %STORM_HOME%
>storm supervisor
Storm UI
>cd %STORM_HOME%
>storm ui
通过浏览器 http://localhost:8080/ 验证一下Storm是否已经跑起来了。
部署“Word Count” 拓扑:
编译 storm-starter 项目。
部署 Word Count 拓扑到你的本地集群中:
>storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology WordCount -c nimbus.host=localhost
刷新UI页面,就可以看到任务已经跑起来了。
storm集群中运行的应用有三点。1、流处理,Storm可用来实时处理新数据和更新数据库,兼具容错性和可扩展性,即Storm可以用来处理源源不断流进来的消息,处理之后将结果写入某个存储中。
2、持续计算,Storm可进行连续查询并把结果即时反馈给客户端,能保证计算可以永久运行,直到用户结束计算进程为止。
3、分布式远程程序调用,Storm的拓扑结构是一个等待调用信息的分布函数,当它收到一条调用信息后,会对查询进行计算,并返回查询结果。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)