基础集群环境参考上一篇文章:集群基础环境搭建
Storm集群架构
Storm是Master-Slaves 主从架构(与hadoop等一致)。主节点是Nimbus,从节点是Supervisor。主节点和从节点借助Zookeeper集群来沟通。
Storm集群的各个组件本身都是无状态的(不保存状态信息),例如nimbus、supervisor、worker等,所有的状态信息都保存在zookeeper集群中。这样的话,集群的可靠性非常高,某个Nimbus(或者Supervisor)宕机后,只需要重启一个Nimbus节点(或者Supervisor节点),再从Zookeeper集群中读取状态信息就可以了。
1.Nimbus主节点:
1.监控从节点Supervisor的状态:Supervisor启动和运行过程中会定时将心跳状态信息发送到Zookeeper上,也就是在Zookeeper集群上创建Znode节点,Nimbus监听该Znode节点来监控Supervisor节点的状态。
2.接收客户端任务的提交Topology
3.进行任务代码的分发、任务Task的分配协调,异常任务的重新分配。
2.Supervisor从节点:
Supervisor是真正的工作节点。Supervisor接收到任务分配后,启动Worker节点(一个或者多个)。
1.获取任务:Nimbus分配任务的时候,将任务信息发送到Zookeeper上,Supervisor监听相应的Znode节点信息,拿到分配给他的任务。
2.获取到任务后,启动相应的Worker进程,Worker进程数根据具体的Topology来决定的,之后监控Worker进程状态(Worker进程启动好之后,在运行过程中也会将心跳状态信息发送到zookeeper上,supervisor也是通过监听znode节点信息来监控worker进程的)
3.Worker进程(JVM):
Worker进程不是常驻进程(Nimbus和Supervisor是Storm框架的常驻进程),并且跟具体的Topology相关。Worker进程上具体运行相应的Topology的Task任务。
Worker进程启动Executor线程。Task运行时真正地跑在线程上,Executor线程真正执行Task。
4.Zookeeper集群:
用来存储各节点、各组件的状态信息。
Zookeeper集群负责Nimbus节点和Supervior节点之间的通信,监控各个节点之间的状态。比如通常我们提交任务的时候是在Nimbus节点上执行的,Nimbus节点通过zk集群将任务分发下去,而Supervisor是真正执行任务的地方。Nimbus节点通过zk集群监控各个Supervisor节点的状态,当某个Supervisor节点出现故障的时候,Nimbus节点就会通过zk集群将那个Supervisor节点上的任务重新分发,在其他Supervisor节点上执行。这就意味着Storm集群也是高可用集群,如果Nimbus节点出现故障的时候,整个任务并不会停止,但是任务的管理会出现影响,通常这种情况下我们只需要将Nimbus节点恢复就可以了。Nimbus节点不支持高可用,这也是Storm目前面临的问题之一。不过一般情况下,Nimbus节点的压力不大,通常不会出现问题。
一般情况下,Zookeeper集群的压力并不大,一般只需要部署3台就够了。Zookeeper集群在Storm集群中逻辑上是独立的,但在实际部署的时候,一般会将zk节点部署在Nimbus节点或Supervisor节点上。
5.topology任务执行整体流程:
Client端向Storm集群提交Topology程序,Nimbus接收到Topology程序后进行任务分配,将执行代码以及相关的配置信息分发到各个Supervisor上(注意,这里不通过zookeeper集群。通过Thrift直接分发到Supervisor节点。)。将任务分配信息发送到Zookeeper集群上,Supervisor从Zookeeper上获取相应的任务,根据任务的要求启动Worker进程,Worker进程启动后,Worker进程会启动一些Executor线程(也是根据任务的要求启动)。Executor线程才是最终真正执行Task逻辑的组件。
Java/Python安装
- 手动下载jdk8:
- 安装:
sudo mkdir /usr/lib/jvm
sudo tar -zxvf jdk-8u191-linux-x64.tar.gz -C /usr/lib/jvm
sudo vi /etc/profile
source /etc/profile
- 设置环境变量参数如下
#set oracle jdk environment
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_191 ## 这里要注意目录要换成自己解压的jdk 目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
- 系统注册此JDK
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_191/bin/java 300
- 安装python
sudo apt install python
sudo apt install python-pip
## Zookeeper集群安装
- 下载安装包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
tar -zxvf zookeeper-3.4.13.tar.gz -C /opt/hadoop/
- 修改配置文件
cd /opt/hadoop//zookeeper-3.4.13/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改存储快照文件snapshot的目录:
dataDir=/opt/hadoop/zookeeper-3.4.13/tmp
在最后添加(这里server.x中的x是一个数字,与myid文件中的id是一致的):
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
创建一个tmp文件夹,存放myid:
mkdir /opt/hadoop/zookeeper-3.4.13/tmp
echo 1 > /opt/hadoop/zookeeper-3.4.13/tmp/myid
- 设置jvm环境变量
在/opt/hadoop/zookeeper-3.4.13/conf创建java.env文件,设置java heap size。(4G内存设置最大为3G)
export JVMFLAGS="-Xms1024m -Xmx3072m $JVMFLAGS"
- 分发安装包
将配置好的zookeeper拷贝到其它节点
scp -r zookeeper-3.4.13/ node2:/opt/hadoop/
scp -r zookeeper-3.4.13/ node3:/opt/hadoop/
修改node2和node3的myid分别为2和3
- 启动集群服务
对每台主机分别启动:
./zkServer.sh start
查看启动状态:
./zkServer.sh status
- 注意事项
- 服务监控:zookeeper服务容易异常退出,因此建议使用daemontools工具来保持运行。
- 定时压缩日志:启动定时cron任务对zookeeper数据和日志进行定时压缩,避免把存储空间耗尽。
- 具体参考维护说明:ZooKeeper Administrator's Guide
Storm集群安装
- 下载安装包:
wget http://mirror.bit.edu.cn/apache/storm/apache-storm-1.2.2/apache-storm-1.2.2.tar.gz
sudo tar -zxvf apache-storm-1.2.2.tar.gz -C /opt/hadoop/
- 配置storm
cd /opt/hadoop/apache-storm-1.2.2
sudo vi conf/storm.yaml
- 配置zookeeper地址
storm.zookeeper.servers:
- "node1"
- "node2"
- "node3"
- storm.local.dir: 增加一行,保存一些状态
storm.local.dir: "/data/storm/status"
storm.log.dir: "/data/storm/logs"
- 配置nimbus.seeds:用于配置主控节点的地址,可以配置多个。
nimbus.seeds: ["node1"]
- 配置supervisor.slots.ports: 配置工作节点上的进程端口。你配置一个端口,意味着工作节点上启动一个worker,在实际的生产环境中,我们需要根据实际的物理配置以及每个节点上的负载情况来配置这个端口的数量。在这里每个节点我象征性的配置4个端口。
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
- 将Storm分发到另外两台supervisor主机上
sudo scp -r apache-storm-1.2.2/ node2:/opt/hadoop/
sudo scp -r apache-storm-1.2.2/ node3:/opt/hadoop/
- 对于两台supervisor node,我们额外开启JMX支持,在配置文件中加入如下配置: 9998就是用于通过JMX收集supervisior JVM指标的端口。
supervisor.childopts: -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9998
- 配置环境变量
在/etc/profile加入如下配置:
export STORM_HOME=/opt/hadoop/apache-storm-1.2.2
export PATH=$STORM_HOME/bin:$PATH
- 启动storm
node1启动nimbus和storm ui:
nohup storm ui >/dev/null 2>&1 &
nohup storm nimbus >/dev/null 2>&1 &
node2和node3主机启动Supervisor节点
nohup storm supervisor >/dev/null 2>&1 &
- 打开远程管理web查看Storm安装是否成功: http://192.168.110.222:8080