保姆级教程:在Ubuntu 20.04上从零搭建三节点Storm集群(含Zookeeper配置与WordCount实例)

保姆级教程:在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-103192.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安装与配置在所有节点下载并解压Zookeeperwget 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.1storm1:2888:3888 server.2storm2:2888:3888 server.3storm3: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安装与基础配置在所有节点下载并解压Stormwget 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.yamlstorm.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默认端口8080http://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 -DskipTeststrue4.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记得在测试完成后停止拓扑释放集群资源。