创建linux虚拟机,用户名密码都为gary,ip为192.168.32.131。
关闭防火墙:
service iptables stop
chkconfig iptables off
查看防火墙状态:
service iptables status
- 安装jdk
下载并解压jdk:
在linux下创建/opt/java目录,将将jdk中的文件复制过去。
然后添加环境变量,在/etc/profile中最后添加如下两行:
export JAVA_HOME=/opt/java
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
使其立即生效
查看java版本,java –version如果输出版本则jdk安装成功。
2.Zookeeper伪集群
2.1下载复制zookeeper
在/opt/zookeeper目录下创建三个目录:
zookeeper1、zookeeper2、zookeeper3
然后将文件夹zookeeper-3.5.1-alpha中的内容复制到这三个目录
2.2 修改各配置文件
如/opt/zookeeper/zookeeper1/conf/zoo.cfg
initLimit=5
syncLimit=2
clientPort=2181
tickTime=2000
dataDir=/opt/zookeeper/zookeeper1/data
dataLogDir=/opt/zookeeper/zookeeper1/log
server.1=localhost:4181:5181
server.2=localhost:4182:5182
server.3=localhost:4183:5183
其他两个配置文件只需要将端口分别改为2182和2183。对应目录改为自己的目录即可。
注:因为伪集群是在同一台电脑上,因此各端口不能重。
在各自的dataDir目录下创建myid文件。对应内容分别为1、2、3.
echo 1 > /opt/zookeeper/zookeeper1/data/myid
2.3启动zookeeper:
进入bin目录,输入zkServer.sh start
查看进程,jps
发现多了一个QuorumPeerMain,说明进程起来了,再查看启动成功还是失败:zkServer.sh status
因为是集群,有三个节点,才起一个肯定会失败。直接再把另两个也启动起来。
此时再查看进程,会发现启了三个:
在zookeeper1的bin下查看状态:
3.Storm伪集群
3.1下载复制storm
下载apache-storm-0.9.5。
在目录/opt/storm下创建三个目录storm1、storm2、storm3.
将apache-storm-0.9.5复制过去。
3.2 修改各配置文件
Storm1下storm.yaml内容如下:
storm.zookeeper.servers:
- "localhost"
storm.zookeeper.port: 2181
nimbus.host: "localhost"
# drpc.servers: "localhost"
ui.port: 8085
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
storm.local.dir: "/opt/storm/storm1/workdir"
storm.messaging.transport: "backtype.storm.messaging.netty.Context"
storm.messaging.netty.server_worker_threads: 1
storm.messaging.netty.client_worker_threads: 1
storm.messaging.netty.buffer_size: 5343880
storm.messaging.netty.max_retries: 100
storm.messaging.netty.max_wait_ms: 1000
storm.messaging.netty.min_wait_ms: 100
storm2下的配置文件如下:
storm.zookeeper.servers:
- "localhost"
storm.zookeeper.port: 2182
nimbus.host: "localhost"
ui.port: 8085
supervisor.slots.ports:
- 7700
- 7701
- 7702
- 7703
storm.local.dir: "/opt/storm/storm2/workdir"
storm.messaging.transport: "backtype.storm.messaging.netty.Context"
storm.messaging.netty.server_worker_threads: 1
storm.messaging.netty.client_worker_threads: 1
storm.messaging.netty.buffer_size: 5343880
storm.messaging.netty.max_retries: 100
storm.messaging.netty.max_wait_ms: 1000
storm.messaging.netty.min_wait_ms: 100
注:其中zookeeper的端口号不改为2182,就用2181也行,反正都在一个集群里,而且地址都是localhost。
storm3下的配置文件如下:
storm.zookeeper.servers:
- "localhost"
storm.zookeeper.port: 2183
nimbus.host: "localhost"
ui.port: 8085
supervisor.slots.ports:
- 8700
- 8701
- 8702
- 8703
storm.local.dir: "/opt/storm/storm3/workdir"
storm.messaging.transport: "backtype.storm.messaging.netty.Context"
storm.messaging.netty.server_worker_threads: 1
storm.messaging.netty.client_worker_threads: 1
storm.messaging.netty.buffer_size: 5343880
storm.messaging.netty.max_retries: 100
storm.messaging.netty.max_wait_ms: 1000
storm.messaging.netty.min_wait_ms: 100
3.3启动守护者进程
启动nimbus
使用jps查看多了一个nimbus进程
启动ui
进程中多了一个core进程
启动supervisor
进程中多了一个supervisor
启动另一个supervisor
在页面中查看storm状态:
http://192.168.32.132:8085/index.html
可见启了两个工作节点,都叫localhost。
4.发布storm应用
以hellostorm程序为例,它的spout是从{"one", "two", "three", "four", "five"}中随机获取一个单词发给第一组bolt,第一组bolt将每个单词添加!!!后发给下一组bolt,第二组bolt统计各单词出现的次数,并打印。
builder.setSpout("word", new WordSpout(), 1);
builder.setBolt("ExclamationBolt", new ExclamationBolt(), 4).shuffleGrouping("word");
builder.setBolt("MergeBolt", new MergeBolt(), 4).globalGrouping("ExclamationBolt");
单机运行时在后台输出内容如下:
--------------------
four!!! : 1
6998 [Thread-25-word] INFO backtype.storm.daemon.task - Emitting: word default [four]
6998 [Thread-13-ExclamationBolt] INFO backtype.storm.daemon.executor - Processing received message source: word:10, stream: default, id: {}, [four]
6998 [Thread-13-ExclamationBolt] INFO backtype.storm.daemon.task - Emitting: ExclamationBolt default [four!!!]
6998 [Thread-15-MergeBolt] INFO backtype.storm.daemon.executor - Processing received message source: ExclamationBolt:4, stream: default, id: {}, [four!!!]
--------------------
four!!! : 2
8008 [Thread-25-word] INFO backtype.storm.daemon.task - Emitting: word default [three]
8008 [Thread-9-ExclamationBolt] INFO backtype.storm.daemon.executor - Processing received message source: word:10, stream: default, id: {}, [three]
8008 [Thread-9-ExclamationBolt] INFO backtype.storm.daemon.task - Emitting: ExclamationBolt default [three!!!]
8009 [Thread-15-MergeBolt] INFO backtype.storm.daemon.executor - Processing received message source: ExclamationBolt:2, stream: default, id: {}, [three!!!]
--------------------
three!!! : 1
four!!! : 2
- 打包
将程序打包为hellostorm.jar包。放到/opt/storm/storm1/topologylib目录。
打包过程如下:
1.在hellostorm项目上右键新建一个MANIFEST.MF文件。
文件内容如下:
Manifest-Version: 1.0
Class-Path:
Main-Class: com.glodon.topology.WordTopology
其中Class-Path:为使用的包名,因为目前需要的包在storm中全有,因此不需要写包名。Main-Class:为main函数所在的类名。
2.导出jar包
不选lib选项,不选classpath和project。指定目录,下一步:
选择刚添加的文件。
将导出的hellostorm.jar包复制到storm1/topologylib中。
2.启动storm
[root@localhost toplogylib]# /opt/storm/storm1/bin/storm jar /opt/storm/storm1/topologylib/hellostorm.jar com.gary.topology.WordTopology hellotest admin admin
第一段/opt/storm/storm1/bin/storm表示使用主控节点的storm。
第二段jar 表示将要启动一个jar程序
第三段/opt/storm/storm1/topologylib/hellostorm.jar指定包路径
第四段com.gary.topology.WordTopology指定包中的main函数所在类
第五段为三个参数,第一个参数将作为storm启动名,后两个参数没有使用(见程序代码)
启动后stormUI 中就多了一个topology
运行一小会儿后查看两个节点的日志:
如:storm3下的日志在logs的worker-8702.log中。
3.关闭storm
关闭storm有两种方法:
1.在页面中
点进去后有个kill按钮。可直接关闭。弹框选择延迟多少秒关闭。
2.使用命令
在启动时指定了storm的名称:
[root@localhost topologylib]# /opt/storm/storm1/bin/storm jar /opt/storm/storm1/topologylib/hellostorm.jar com.gary.topology.WordTopology hellotest admin admin
关闭时:
[root@localhost topologylib]# /opt/storm/storm1/bin/storm kill hellotest