配色: 字号:
Storm1_Storm简介、核心概念、Storm架构、安装Storm、配置集群、编程体验Storm
2022-09-15 | 阅:  转:  |  分享 
  
Storm安装体验2018/12/18版本修改人修改记录修改时间V1.0王守奎编写2018/5/23目录Storm简介0核心概念01、Tu
ple02、Stream03、spouts04、Bolts15、Topology16、tasks17、workers18、stre
amgrouping:1Storm架构11、Nimbus:灵气,是一个masternode12、supervisor:work
node1组件2安装Storm21、jdk22、zk23、storm24、配置storm35、创建storm本地目录46、启
动zookeeper47、启动storm的守护进程41:表示标准输出(stdout),系统默认是152:表示错误输出(stder
r)52>&1>/dev/null5配置集群6编程体验Storm81、创建maven工程92、Pom.xml文件93、storm
流程114、创建WordTopology115、创建WordSpout126、创建WordSplitBolt157、创建Wor
dCountBolt168、直接运行main函数189、在完全分布式集群上运行18Storm简介实时计算系统,实时数据分析领域的领
导者使用场景:实时分析,在线机器学习,持续计算,流式计算速度快:每秒每节点处理数据百万tuple级别无状态:集群状态和分布式环境信
息在zk中保存确保每个消息至少被消费一次核心概念从一端(一般kafka)输入数据,经过一系列的数据处理后,从另一端(一般hdfs)
输出数据。类似于工厂流水线。Tuple元组,数据结构,有序的元素列表。通常是任意类型的数据,使用逗号分割,交给storm计算。2、
Stream一系列tuple,无序3、spouts水龙头。数据的来源4、Bolts转接头。逻辑处理单元,spout数据传给bolt
,bolt处理后产生新的数据,可以聚合、filter、分组...接收数据->处理->输出给bolt(多个)5、Topology一个
有向图,定点式计算(spouts、bolts),边是数据流。不会停止的,除非手动杀死(mr是会停止的)6、tasksspout和b
olt的执行过程就是task。spout和bolt都可以以多实例的方式运行(在单独的线程中)7、workers工作节点,storm
在worker之间均衡分发任务,尽量平衡资源。Worker节点的角色是监听job,启动或者停止进程。8、streamgroupi
ng:控制tuple如何进行路由内置4个分组策略(ShuffleGrouping、FieldGrouping、GlobalG
rouping、AllGrouping)Twitter的使用图:Storm架构Storm采用的是Master-Slave结构,就
是使用一个节点来管理整个集群的运行状态。Master节点被称为:Nimbus,Slave节点用来维护每台机器的状态,被称为:Sup
ervisor基础概念Topology(拓扑)Storm称用户的一个作业为Topology(拓扑)为什么叫拓扑呢?是因为Storm
的一个拓扑主要包含了许多的数据节点,还有一些计算节点,以及这些节点之间的边,也就是说Storm的拓扑是由这些点和边组成的一个有向无
环图。这些点有两种:数据源节点(Spout)、普通的计算节点(Bolt),点之间的边称为数据流(Stream),数据流中的每一条记
录称为Tuple。如下图中,每一个“水龙头”表示一个Spout,它会发送一些Tuple给下游的Bolt,这些Bolt经过处理,再发
送一个Tuple给下一个Bolt,最后,在这些Bolt里面是可以执行一些写数据到外部存储(如数据库)等操作的。在图中这个Topol
ogy里面我们看到了两个Spout和5个Bolt,在实际运行的时候,每个Spout节点都可能有很多个实例,每个Bolt也有可能有很
多个实例。就像MapReduce一样,一个Map节点并不代表只有一个并发,而有可能很多个Map实例在跑。这些Spout和Bolt的
这些边里面,用户可以设置多种的Grouping的方式。有些类似SQL中的GroupBy。用来制定这些计算是怎么分组的。Fiel
dsGrouping:保证同样的字段移动落到同一个Bolt里.组件说明Topologies为了在storm上面做实时计算,你要
去建立一些topologies。一个topology就是一个计算节点所组成的图。Topology里面的每个处理节点都包含处理逻辑,
而节点之间的连接则表示数据流动的方向。运行一个Topology是很简单的。首先,把你所有的代码以及所依赖的jar打进一个jar包
。然后运行类似下面的这个命令。stromjarall-your-code.jarbacktype.storm.MyTopol
ogyarg1arg2这个命令会运行主类:backtype.strom.MyTopology,参数是arg1,arg2。这
个类的main函数定义这个topology并且把它提交给Nimbus。stormjar负责连接到nimbus并且上传jar文件。
StreamStream是storm里面的关键抽象。一个stream是一个没有边界的tuple序列。storm提供一些原语来分布式
地、可靠地把一个stream传输进一个新的stream。比如:你可以把一个tweets流传输到热门话题的流。storm提供的最基
本的处理stream的原语是spout和bolt。你可以实现Spout和Bolt对应的接口以处理你的应用的逻辑。spout是流的源
头。比如一个spout可能从Kestrel队列里面读取消息并且把这些消息发射成一个流。又比如一个spout可以调用twitter的
一个api并且把返回的tweets发射成一个流。通常Spout会从外部数据源(队列、数据库等)读取数据,然后封装成Tuple形式,
之后发送到Stream中。Spout是一个主动的角色,在接口内部有个nextTuple函数,Storm框架会不停的调用该函数。bo
lt可以接收任意多个输入stream,作一些处理,有些bolt可能还会发射一些新的stream。一些复杂的流转换,比如从一些
tweet里面计算出热门话题,需要多个步骤,从而也就需要多个bolt。Bolt可以做任何事情:运行函数,过滤tuple,做一
些聚合,做一些合并以及访问数据库等等。Bolt处理输入的Stream,并产生新的输出Stream。Bolt可以执行过滤、函数操作、
Join、操作数据库等任何操作。Bolt是一个被动的角色,其接口中有一个execute(Tupleinput)方法,在接收到消息
之后会调用此函数,用户可以在此方法中执行自己的处理逻辑。spout和bolt所组成一个网络会被打包成topology,topol
ogy是storm里面最高一级的抽象(类似Job),你可以把topology提交给storm的集群来运行。topology里面
的每一个节点都是并行运行的。在你的topology里面,你可以指定每个节点的并行度,storm则会在集群里面分配那么多线程来
同时计算。一个topology会一直运行直到你显式停止它。storm自动重新分配一些运行失败的任务,并且storm保证你不会有数
据丢失,即使在一些机器意外停机并且消息被丢掉的情况下。数据模型(DataModel)storm使用tuple来作为它的数据模型
。每个tuple是一堆值,每个值有一个名字,并且每个值可以是任何类型,在我的理解里面一个tuple可以看作一个没有方法的java对
象(或者是一个表的字段)。总体来看,storm支持所有的基本类型、字符串以及字节数组作为tuple的值类型。你也可以使用你自己定义
的类型来作为值类型,只要你实现对应的序列化器(serializer)。一个Tuple代表数据流中的一个基本的处理单元,例如一条c
ookie日志,它可以包含多个Field,每个Field表示一个属性。Tuple本来应该是一个Key-Value的Map,由于各个
组件间传递的tuple的字段名称已经事先定义好了,所以Tuple只需要按序填入各个Value,所以就是一个ValueList。一
个没有边界的、源源不断的、连续的Tuple序列就组成了Stream。topology里面的每个节点必须定义它要发射的tuple的每
个字段。安装Stormjdk略zkzookeeper是nimbus和supervisor进行交互的中介。1、nimbus通过在zo
okeeper上写状态信息来分配任务。通俗的讲就是写哪些supervisor执行哪些task的对应关系。而supervisor则通
过从zookeeper上读取这些状态信息,来领取任务。2、supervisor、task会发送心跳到zookeeper,使得nim
bus可以监控整个集群的状态,从而在task执行失败时,可以重启他们。3、storma)下载apache-storm-1.1.0.
tar.gzb)安装$>tar-xzvfapache-storm-1.1.0.tar.gz$>mvapache-storm-
1.1.0/soft$>cd/soft$>ln-sapache-storm-1.1.0/stormc)环境变量[/etc
/profile]STORM_HOME=/soft/stormPATH="...:/soft/storm/bin"4、配置stor
m[/soft/storm/conf/storm.yaml]###########TheseMUSTbefilledin
forastormconfiguration#此处填写的是zookeeper集群的地址或者主机名(需要修改)storm.
zookeeper.servers:-"datanode1"-"datanode2"-"datanode3"#注意,如
果你使用的ZooKeeper集群的端口不是默认端口,你还需要相应地配置storm.zookeeper.port。#master
的ip或主机名,nimbus.host:集群的工作节点需要知道集群中的哪台机器是主机,以便从主机上下载拓扑以及配置文件,如下所示:
#nimbus.host:"namenode"?旧版新版用?????nimbus.seeds替换了#storm集群nimbusH
A主机名或配置,可以配置多个避免单点故障nimbus.seeds:["namenode”]#storm.local.dir:N
imbus和Supervisor后台进程都需要一个用于存放一些状态数据(比如jar包、配置文件等等)的目录。你可以在每个
机器上创建好这个目录,赋予相应的读写权限,并将该目录写入配置文件中,如下所示:storm.local.dir:"/home/h
adoop/storm"#supervisor.slots.ports:你需要通过此配置项配置每个Supervisor机器能够
运行的工作进程(worker)数。每个worker都需要一个单独的端口来接收消息,这个配置项就定义了worker可以使用的
端口列表。如果你在这里定义了5个端口,那么Storm就会在该机器上分配最多5个worker。如果定义3个端口,那
Storm至多只会运行三个worker。此项的默认值是6700、6701、6702、6703四个端口,如下所示:supe
rvisor.slots.ports:-6700-6701-6702-6703常见问题:解决方案:按照如下的语法进
行配置空格storm.zookeeper.servers:-空格"datanode1"-空格"datanode1"-空格"
datanode1"空格nimbus.seeds:?空格"namenode"5、创建storm本地目录$>mkdir~/stor
m6、启动zookeeper$>zkServer.shstart...启动storm的守护进程$>stormnimbus>
/dev/null2>1//启动主节点$>stormsupervisor>/dev/null2>1//启动从节点
$>stormui>/dev/null2>1//启动后台UI管理界面$>nohupstormnimbus1>/d
ev/null2>&1&$>nohupstormsupervisor1>/dev/null2>&1&?$>nohup
stormui1>/dev/null2>&1&?$>stormnimbus&//启动nimbus$>storm
supervisor&$>stormui&//启动web服务器8080http://namenode:8080/i
ndex.html知识点LinuxShell下”>/dev/null2>&1“相关知识说明0:表示键盘输入(stdin)1:表
示标准输出(stdout),系统默认是12:表示错误输出(stderr)command>/dev/null2>&1&==
command1>/dev/null2>&1&1)command:表示shell命令或者为一个可执行程序2)>:表示重定向
到哪里3)/dev/null:表示Linux的空设备文件4)2:表示标准错误输出5)&1:&表示等同于的意思,2>&1,表示2
的输出重定向等于于16)&:表示后台执行,即这条指令执行在后台运行1>/dev/null:表示标准输出重定向到空设备文件,也就是不
输出任何信息到终端,不显示任何信息。2>&1:表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以
标准错误输出也重定向到空设备文件。这条命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到
/dev/null文件,也就是清空.所以可以看出">/dev/null2>&1"常用来避免shell命令或者程序等运行中有内
容输出。2>&1>/dev/null命令行的重定向什么的,是在执行命令之前就准备好了的.解释顺序从左至右依次进行,2&>
1,而1是屏幕,所以标准错误重定向到屏幕,再而1>/dev/null,即标准输出重定向到/dev/null,上述2
>&1>/dev/null并不是什么同一时刻要么产生标准输出要么产生标准错误.而是两个不同的东西.command>fi
le2>file与command>file2>&1有什么区别呢?command>file2>file的意思是
将命令所产生的标准输出信息,和错误的输出信息送到file中.command>file2>file这样的写法,stdout
和stderr都直接送到file中,file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD
2两个同时去抢占file的管道.而command>file2>&1这条命令就将stdout直接送向file,stderr
继承了FD1管道后,再被送往file,此时,file只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stder
r的内容.从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会用comman
d>file2>&1这样的写法.&>/dev/null这个就是,不管你是啥玩意儿文件描述符,通通重定向到/dev/null
配置集群配置storm[/soft/storm/conf/storm.yaml]参数,nimbus.seeds:["nameno
de",”datanode1”]改为两个节点避免单点故障,其它的参数同安装步骤所设。1、复制目录,并创建storm链接$>xcop
y.shapache-storm-1.1.02、配置环境变量$>xcopy.sh/etc/profile启动zookeeper
集群$>zkServer.shstart4、在管理节点(namenode,datanode1)上启动nimbus和ui,在数据节
点(datanode1...)上启动supervisor$>nohupstormnimbus1>/dev/null2>&1
&$>nohupstormsupervisor1>/dev/null2>&1&?$>nohupstormui1>
/dev/null2>&1&?编程体验Storm1、创建maven工程2、Pom.xml文件ttp://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/20
01/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org
/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">sion>4.0.0com.bmbig
Data-storm
0.0.1-SNAPSHOTcies>junittifactId>junit4.11testope>org.apache
.storm
storm-core1.1.0

org.apache.zookeeper
zookeeper<
version>3.4.9roupId>org.slf4jlog4j-over-slf4jd>org.slf4j
slf4j-log4j12
org.apa
che.logging.log4j
log4j-slf4j-implId>
org.apache.logging.log4jpId>log4j>log4jlog4jsions>
org.apa
che.thrift
libthrift0.
7.0
<
groupId>org.apache.stormstorm-kafkactId>1.1.0