保姆级教程:在Ubuntu 20.04上从零搭建三节点Storm集群(含Zookeeper配置与WordCount实例)
保姆级教程:在Ubuntu 20.04上从零搭建三节点Storm集群(含Zookeeper配置与WordCount实例)
当你第一次接触分布式计算框架时,那种既兴奋又忐忑的心情我深有体会。三台机器,一堆配置,数不清的终端窗口——稍有不慎就会陷入无尽的排错循环。但别担心,这篇教程会像老友聊天一样,带你轻松走过每个关键步骤。我们会从最基础的系统准备开始,直到成功运行经典的WordCount示例,过程中每个命令都会解释清楚它的作用,让你真正理解而不仅仅是复制粘贴。
1. 环境准备与基础配置
在开始之前,确保你有三台运行Ubuntu 20.04的机器(或虚拟机)。物理机还是云实例并不重要,关键是要保证它们之间能够互相通信。我强烈建议给每台机器至少2GB内存,因为Zookeeper和Storm服务对内存有一定需求。
1.1 系统更新与必要工具安装
首先,我们需要在所有三台机器上执行系统更新并安装一些基础工具:
sudo apt update && sudo apt upgrade -y sudo apt install -y openjdk-8-jdk ssh vim net-tools为什么选择Java 8?因为Storm对Java版本比较敏感,Java 8是最稳定的选择。安装完成后,验证Java版本:
java -version你应该看到类似"openjdk version "1.8.0_xxx"的输出。如果系统中有多个Java版本,可以用以下命令设置默认版本:
sudo update-alternatives --config java1.2 主机名与hosts文件配置
清晰的网络标识是集群搭建的关键。我们先为每台机器设置独特的主机名:
# 在第一台机器上执行 sudo hostnamectl set-hostname storm1 # 在第二台机器上执行 sudo hostnamectl set-hostname storm2 # 在第三台机器上执行 sudo hostnamectl set-hostname storm3然后,在所有三台机器上编辑/etc/hosts文件,添加如下内容(假设实际IP地址为192.168.1.101-103):
192.168.1.101 storm1 192.168.1.102 storm2 192.168.1.103 storm3提示:可以使用
ifconfig或ip a命令查看本机IP地址,确保hosts文件中的IP与实际一致。
1.3 SSH免密登录配置
Storm节点间需要通过SSH通信,配置免密登录可以避免频繁输入密码。在所有机器上执行:
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys然后将每台机器的公钥互相拷贝。例如,在storm1上执行:
ssh-copy-id storm2 ssh-copy-id storm3在storm2和storm3上重复类似操作。完成后,尝试互相SSH登录验证是否不再需要密码。
2. Zookeeper集群部署
Storm依赖Zookeeper进行协调服务,我们先搭建一个三节点的Zookeeper集群。
2.1 Zookeeper安装与配置
在所有节点下载并解压Zookeeper:
wget https://downloads.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz tar -xzf apache-zookeeper-3.7.0-bin.tar.gz mv apache-zookeeper-3.7.0-bin /opt/zookeeper创建数据和日志目录:
mkdir -p /opt/zookeeper/data mkdir -p /opt/zookeeper/logs配置Zookeeper。首先复制示例配置文件:
cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg然后编辑/opt/zookeeper/conf/zoo.cfg,修改以下内容:
dataDir=/opt/zookeeper/data dataLogDir=/opt/zookeeper/logs server.1=storm1:2888:3888 server.2=storm2:2888:3888 server.3=storm3:2888:38882.2 设置myid文件
在每个节点的data目录下创建myid文件,内容分别为1、2、3:
# 在storm1上执行 echo "1" > /opt/zookeeper/data/myid # 在storm2上执行 echo "2" > /opt/zookeeper/data/myid # 在storm3上执行 echo "3" > /opt/zookeeper/data/myid2.3 启动与验证Zookeeper集群
在所有节点启动Zookeeper服务:
/opt/zookeeper/bin/zkServer.sh start检查状态,应该能看到"Mode: follower"或"Mode: leader":
/opt/zookeeper/bin/zkServer.sh status如果看到错误,可以检查日志文件/opt/zookeeper/logs/zookeeper.out。常见问题包括防火墙阻止了端口通信(2888和3888需要开放),或者myid文件配置不正确。
3. Storm集群部署
现在我们来部署Storm集群,包含一个Nimbus节点和两个Supervisor节点。
3.1 Storm安装与基础配置
在所有节点下载并解压Storm:
wget https://downloads.apache.org/storm/apache-storm-2.3.0/apache-storm-2.3.0.tar.gz tar -xzf apache-storm-2.3.0.tar.gz mv apache-storm-2.3.0 /opt/storm设置环境变量,编辑~/.bashrc添加:
export STORM_HOME=/opt/storm export PATH=$PATH:$STORM_HOME/bin然后执行source ~/.bashrc使配置生效。
3.2 配置Storm集群
在Nimbus节点(假设为storm1)上配置/opt/storm/conf/storm.yaml:
storm.zookeeper.servers: - "storm1" - "storm2" - "storm3" nimbus.seeds: ["storm1"] storm.local.dir: "/opt/storm/data" supervisor.slots.ports: - 6700 - 6701 - 6702 - 6703在Supervisor节点(storm2和storm3)上,storm.yaml配置基本相同,但不需要nimbus.seeds配置。
3.3 启动Storm服务
在Nimbus节点(storm1)上启动:
nimbus & ui & logviewer &在Supervisor节点(storm2和storm3)上启动:
supervisor & logviewer &验证集群状态,访问Nimbus节点的Web UI(默认端口8080):
http://storm1:8080你应该能看到两个Supervisor节点已注册,并有可用的worker slots。
4. 运行WordCount示例
现在我们来运行Storm的经典WordCount示例,验证集群是否正常工作。
4.1 准备示例项目
在Nimbus节点上,下载示例代码:
git clone https://github.com/apache/storm-starter.git cd storm-starter mvn clean install -DskipTests=true4.2 提交拓扑到集群
提交WordCount拓扑:
storm jar target/storm-starter-*.jar org.apache.storm.starter.WordCountTopology wordcount在Storm UI中,你应该能看到名为"wordcount"的拓扑正在运行。点击拓扑名称可以查看详细的执行情况和统计信息。
4.3 查看运行结果
Storm的日志通常位于各节点的/opt/storm/logs目录下。查看worker日志可以看到单词计数的输出:
tail -f /opt/storm/logs/workers-artifacts/wordcount-*/worker.log | grep "Thread-25"你应该能看到类似这样的输出:
DEBUG: [the, 23] DEBUG: [storm, 45] DEBUG: [hello, 12]4.4 停止拓扑
当你想停止拓扑时,可以使用:
storm kill wordcount记得在测试完成后停止拓扑,释放集群资源。
