前言
Apache Storm是一个分布式的、可靠的、容错的实时数据流处理框架。它与Spark Streaming的最大区别在于它是逐个处理流式数据事件,而Spark Streaming是微批次处理,因此,它比Spark Streaming更实时。
一、Apache Storm的核心概念
- Nimbus:即Storm的Master,负责资源分配和任务调度。一个Storm集群只有一个Nimbus。
- Supervisor:即Storm的Slave,负责接收Nimbus分配的任务,管理所有Worker,一个Supervisor节点中包含多个Worker进程。
- Worker:工作进程,每个工作进程中都有多个Task。
- Task:任务,在 Storm 集群中每个 Spout 和 Bolt 都由若干个任务(tasks)来执行。每个任务都与一个执行线程相对应。
- Topology:计算拓扑,Storm 的拓扑是对实时计算应用逻辑的封装,它的作用与 MapReduce 的任务(Job)很相似,区别在于 MapReduce 的一个 Job 在得到结果之后总会结束,而拓扑会一直在集群中运行,直到你手动去终止它。拓扑还可以理解成由一系列通过数据流(Stream Grouping)相互关联的 Spout 和 Bolt 组成的的拓扑结构。
- Stream:数据流(Streams)是 Storm 中最核心的抽象概念。一个数据流指的是在分布式环境中并行创建、处理的一组元组(tuple)的无界序列。数据流可以由一种能够表述数据流中元组的域(fields)的模式来定义。
- Spout:数据源(Spout)是拓扑中数据流的来源。一般 Spout 会从一个外部的数据源读取元组然后将他们发送到拓扑中。根据需求的不同,Spout 既可以定义为可靠的数据源,也可以定义为不可靠的数据源。一个可靠的 Spout 能够在它发送的元组处理失败时重新发送该元组,以确保所有的元组都能得到正确的处理;相对应的,不可靠的 Spout 就不会在元组发送之后对元组进行任何其他的处理。一个 Spout 可以发送多个数据流。
- Bolt:拓扑中所有的数据处理均是由 Bolt 完成的。通过数据过滤(filtering)、函数处理(functions)、聚合(aggregations)、联结(joins)、数据库交互等功能,Bolt 几乎能够完成任何一种数据处理需求。一个 Bolt 可以实现简单的数据流转换,而更复杂的数据流变换通常需要使用多个 Bolt 并通过多个步骤完成。
- Stream grouping:为拓扑中的每个 Bolt 的确定输入数据流是定义一个拓扑的重要环节。数据流分组定义了在 Bolt 的不同任务(tasks)中划分数据流的方式。在 Storm 中有八种内置的数据流分组方式。
- Reliability:可靠性。Storm 可以通过拓扑来确保每个发送的元组都能得到正确处理。通过跟踪由 Spout 发出的每个元组构成的元组树可以确定元组是否已经完成处理。每个拓扑都有一个“消息延时”参数,如果 Storm 在延时时间内没有检测到元组是否处理完成,就会将该元组标记为处理失败,并会在稍后重新发送该元组。
安装storm
我这里安装的storm版本
storm在安装前集群的zookpeeper一定要配置好,并启动.
这里贴一张zookpeeper的配置文件,下文storm的配置中能用到
我们把storm解压到/usr/local/src目录下
tar -zxvf apache-storm-1.0.4.tar.gz -C /usr/local/src/
|
改个名
mv apache-storm-1.0.4 storm-1.0.4
|
配置环境变量
如图
配置完成,记得source
修改配置文件
修改conf目录中的storm.yaml文件:
storm.zookeeper.servers: - "master" - "slave1" - "slave2" storm.local.dir: "/usr/local/src/storm-1.0.4/localdir" storm.zookeeper.port: 2181 nimbus.seeds: ["master"] ui.host: 0.0.0.0 ui.port: 8080 supervisor.slots.ports: - 6700 - 6701 - 6702
|
storm.zookeeper.servers这个参数中写的master,slave1,slave2和zookpeeper配置文件中写的必须一致
storm.local.dir: 这个参数是storm使用的本地文件系统目录(必须存在并且storm进程可读写)
这个可以自己配置,自己选择的文件目录
提一下,这里ui.port端口是8080端口,可能会和一些组件的端口有冲突,比如8080端口我之前是spark的web端端口,端口可以自己改,我这里是把spark的端口改到了8087
怎么改spark端口,可以参考这篇文章https://www.iteye.com/blog/daizj-2227382
改一个start-master.sh文件就行了
当我们storm配置文件配置完成后,记得创建自己定义的storm本地文件目录
mkdir -p /usr/local/src/storm-1.0.4/localdir
|
master机器配置完成后,我们把文件分发到slave1与slave2上
[root@master src]# scp -r storm-1.0.4/ slave1:/usr/local/src/ [root@master src]# scp -r storm-1.0.4/ slave2:/usr/local/src/
|
同时在其他两台机器上配置环境变量,记得source
开启storm
启动storm之前,zookpeeper要先启动
在master的下启动nimbus和ui进程
[root@master storm-1.0.4]# storm nimbus & [1] 4145 [root@master storm-1.0.4]# storm ui & [2] 4236
root@master storm-1.0.4]# Running: /usr/local/src/jdk1.8.0_121/bin/java -server -Ddaemon.name=nimbus -Dstorm.options= -Dstorm.home=/usr/local/src/storm-1.0.4 -Dstorm.log.dir=/usr/local/src/storm-1.0.4/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/local/src/storm-1.0.4/lib/storm-core-1.0.4.jar:/usr/local/src/storm-1.0.4/lib/kryo-3.0.3.jar:/usr/local/src/storm-1.0.4/lib/reflectasm-1.10.1.jar:/usr/local/src/storm-1.0.4/lib/asm-5.0.3.jar:/usr/local/src/storm-1.0.4/lib/minlog-1.3.0.jar:/usr/local/src/storm-1.0.4/lib/objenesis-2.1.jar:/usr/local/src/storm-1.0.4/lib/clojure-1.7.0.jar:/usr/local/src/storm-1.0.4/lib/disruptor-3.3.2.jar:/usr/local/src/storm-1.0.4/lib/log4j-api-2.8.jar:/usr/local/src/storm-1.0.4/lib/log4j-core-2.8.jar:/usr/local/src/storm-1.0.4/lib/log4j-slf4j-impl-2.8.jar:/usr/local/src/storm-1.0.4/lib/slf4j-api-1.7.21.jar:/usr/local/src/storm-1.0.4/lib/log4j-over-slf4j-1.6.6.jar:/usr/local/src/storm-1.0.4/lib/servlet-api-2.5.jar:/usr/local/src/storm-1.0.4/lib/storm-rename-hack-1.0.4.jar:/usr/local/src/storm-1.0.4/conf -Xmx1024m -Dlogfile.name=nimbus.log -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j.configurationFile=/usr/local/src/storm-1.0.4/log4j2/cluster.xml org.apache.storm.daemon.nimbus Running: /usr/local/src/jdk1.8.0_121/bin/java -server -Ddaemon.name=ui -Dstorm.options= -Dstorm.home=/usr/local/src/storm-1.0.4 -Dstorm.log.dir=/usr/local/src/storm-1.0.4/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/local/src/storm-1.0.4/lib/storm-core-1.0.4.jar:/usr/local/src/storm-1.0.4/lib/kryo-3.0.3.jar:/usr/local/src/storm-1.0.4/lib/reflectasm-1.10.1.jar:/usr/local/src/storm-1.0.4/lib/asm-5.0.3.jar:/usr/local/src/storm-1.0.4/lib/minlog-1.3.0.jar:/usr/local/src/storm-1.0.4/lib/objenesis-2.1.jar:/usr/local/src/storm-1.0.4/lib/clojure-1.7.0.jar:/usr/local/src/storm-1.0.4/lib/disruptor-3.3.2.jar:/usr/local/src/storm-1.0.4/lib/log4j-api-2.8.jar:/usr/local/src/storm-1.0.4/lib/log4j-core-2.8.jar:/usr/local/src/storm-1.0.4/lib/log4j-slf4j-impl-2.8.jar:/usr/local/src/storm-1.0.4/lib/slf4j-api-1.7.21.jar:/usr/local/src/storm-1.0.4/lib/log4j-over-slf4j-1.6.6.jar:/usr/local/src/storm-1.0.4/lib/servlet-api-2.5.jar:/usr/local/src/storm-1.0.4/lib/storm-rename-hack-1.0.4.jar:/usr/local/src/storm-1.0.4:/usr/local/src/storm-1.0.4/conf -Xmx768m -Dlogfile.name=ui.log -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j.configurationFile=/usr/local/src/storm-1.0.4/log4j2/cluster.xml org.apache.storm.ui.core
|
到这里按下回车
在slave1和slave2下启动supervisor进程
[root@slave1 storm-1.0.4]# storm supervisor & [1] 3233 [root@slave1 storm-1.0.4]# Running: /usr/local/src/jdk1.8.0_121/bin/java -server -Ddaemon.name=supervisor -Dstorm.options= -Dstorm.home=/usr/local/src/storm-1.0.4 -Dstorm.log.dir=/usr/local/src/storm-1.0.4/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/local/src/storm-1.0.4/lib/storm-core-1.0.4.jar:/usr/local/src/storm-1.0.4/lib/kryo-3.0.3.jar:/usr/local/src/storm-1.0.4/lib/reflectasm-1.10.1.jar:/usr/local/src/storm-1.0.4/lib/asm-5.0.3.jar:/usr/local/src/storm-1.0.4/lib/minlog-1.3.0.jar:/usr/local/src/storm-1.0.4/lib/objenesis-2.1.jar:/usr/local/src/storm-1.0.4/lib/clojure-1.7.0.jar:/usr/local/src/storm-1.0.4/lib/disruptor-3.3.2.jar:/usr/local/src/storm-1.0.4/lib/log4j-api-2.8.jar:/usr/local/src/storm-1.0.4/lib/log4j-core-2.8.jar:/usr/local/src/storm-1.0.4/lib/log4j-slf4j-impl-2.8.jar:/usr/local/src/storm-1.0.4/lib/slf4j-api-1.7.21.jar:/usr/local/src/storm-1.0.4/lib/log4j-over-slf4j-1.6.6.jar:/usr/local/src/storm-1.0.4/lib/servlet-api-2.5.jar:/usr/local/src/storm-1.0.4/lib/storm-rename-hack-1.0.4.jar:/usr/local/src/storm-1.0.4/conf -Xmx256m -Dlogfile.name=supervisor.log -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j.configurationFile=/usr/local/src/storm-1.0.4/log4j2/cluster.xml org.apache.storm.daemon.supervisor.Supervisor
|
[root@slave2 storm-1.0.4]# storm supervisor & [1] 2214 [root@slave2 storm-1.0.4]# Running: /usr/local/src/jdk1.8.0_121/bin/java -server -Ddaemon.name=supervisor -Dstorm.options= -Dstorm.home=/usr/local/src/storm-1.0.4 -Dstorm.log.dir=/usr/local/src/storm-1.0.4/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/local/src/storm-1.0.4/lib/storm-core-1.0.4.jar:/usr/local/src/storm-1.0.4/lib/kryo-3.0.3.jar:/usr/local/src/storm-1.0.4/lib/reflectasm-1.10.1.jar:/usr/local/src/storm-1.0.4/lib/asm-5.0.3.jar:/usr/local/src/storm-1.0.4/lib/minlog-1.3.0.jar:/usr/local/src/storm-1.0.4/lib/objenesis-2.1.jar:/usr/local/src/storm-1.0.4/lib/clojure-1.7.0.jar:/usr/local/src/storm-1.0.4/lib/disruptor-3.3.2.jar:/usr/local/src/storm-1.0.4/lib/log4j-api-2.8.jar:/usr/local/src/storm-1.0.4/lib/log4j-core-2.8.jar:/usr/local/src/storm-1.0.4/lib/log4j-slf4j-impl-2.8.jar:/usr/local/src/storm-1.0.4/lib/slf4j-api-1.7.21.jar:/usr/local/src/storm-1.0.4/lib/log4j-over-slf4j-1.6.6.jar:/usr/local/src/storm-1.0.4/lib/servlet-api-2.5.jar:/usr/local/src/storm-1.0.4/lib/storm-rename-hack-1.0.4.jar:/usr/local/src/storm-1.0.4/conf -Xmx256m -Dlogfile.name=supervisor.log -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j.configurationFile=/usr/local/src/storm-1.0.4/log4j2/cluster.xml org.apache.storm.daemon.supervisor.Supervisor
|
按下回车,查看三台机器的jps节点进程
master上应该有nimbus节点和core节点,slave1和slave2上应该有supervisor节点
然后打开web端http://192.168.1.130:8080
这里的ip地址写自己的
到这里storm的安装也就完成了,感谢大家的阅读