Ubuntu 22.04 安装 Apache Storm 2.8.9 指南
在 Ubuntu 22.04 上从零安装 Apache Storm 2.8.9,涵盖 OpenJDK 17 前置、官方 tar.gz 下载校验、独立安装 ZooKeeper 3.8.7、storm.yaml 配置、systemd 托管 nimbus/supervisor/ui/logviewer、WordCount 拓扑提交验证与 JVM 堆 256-512MB 设置,命令与回显均实测
Ubuntu 22.04 安装 Apache Storm 2.8.9 指南
目标:在真实 Ubuntu 22.04 服务器上从零安装 Apache Storm 2.8.9(分布式实时计算框架),覆盖 OpenJDK 17 前置、官方包下载校验、独立安装 ZooKeeper 3.8.7、storm.yaml 集群配置、systemd 托管四大守护进程、提交官方 WordCount 示例拓扑验证与 JVM 堆 256-512MB 控制。以下命令与回显均在 Ubuntu 22.04.5 真实环境逐步实测。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Java:OpenJDK 17.0.20.1(
openjdk-17-jdk-headless) - Python:3.10.12(storm 命令行脚本依赖)
- Apache Storm:2.8.9(
.tar.gz二进制包,372,775,041 字节) - ZooKeeper:3.8.7(
apache-zookeeper-3.8.7-bin.tar.gz,15,817,732 字节) - 安装目录:
/opt/storm、/opt/zookeeper - 数据目录:
/data/storm(storm.local.dir)、/data/zookeeper(ZooKeeper dataDir) - 端口:Nimbus 6627、UI 8080、Logviewer 8081、ZooKeeper 2181、Worker slots 6700-6703
- 运行用户:root
二、前置条件
- 一台 Ubuntu 22.04 服务器,root 权限。
- 需安装
openjdk-17-jdk-headless(含jps)、python3、wget、curl、net-tools(含netstat)、tar。 - Storm 运行强依赖 ZooKeeper 协调服务(存储集群状态),需先装好 ZooKeeper 3.8.x。
- 服务器需能访问 Apache 存档站或其镜像(下载 Storm / ZooKeeper 安装包)。
⚠️ Storm 2.8.9 必须运行在 Java 17 及以上:实测用 Java 11 启动直接报
UnsupportedClassVersionError(class file version 61.0 需 Java 17,55.0 为 Java 11),完整错误见「十二、常见问题」12.1。Storm 2.8.x 早期版本(2.8.0-2.8.2)可运行于 Java 8/11,但 2.8.9 已升级编译目标。
三、版本选型说明
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Apache Storm | 2.8.9 | 2.x 系列最新稳定版;官方最新大版本 3.1.0 已发布但生态组件兼容性仍在演进,生产推荐 2.8.9 |
| OpenJDK | 17 | Storm 2.8.9 编译目标为 Java 17(class file 61.0),Java 8/11 无法运行 |
| ZooKeeper | 3.8.7 | Storm 官方推荐 ZooKeeper 3.5+,3.8 LTS 稳定 |
| Python | 3.6+ | bin/storm 命令行脚本为 Python 实现,Ubuntu 22.04 自带 3.10.12 |
💡 Storm 2.x 官方二进制包仅发布
.tar.gz一种格式;-src.tar.gz/-src.zip为源码包,无需编译即可运行。
四、在线安装方案(A:官方存档直下)
4.1 安装 OpenJDK 17 与基础工具
apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y \
openjdk-17-jdk-headless python3 wget curl net-tools tar
验证版本回显:
# java -version
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-post-1ubuntu1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-post-1ubuntu1-22.04-Ubuntu, mixed mode, sharing)
# python3 --version
Python 3.10.12
4.2 下载 Apache Storm 2.8.9 并校验 sha512
cd /opt
wget -O apache-storm-2.8.9.tar.gz \
https://archive.apache.org/dist/storm/apache-storm-2.8.9/apache-storm-2.8.9.tar.gz
⚠️ 官方存档站到部分机房带宽波动明显(实测约 4MB/min,全程约 90 分钟)。内网带宽受限时改用第五节的镜像方案(华为云镜像实测数分钟内完成,sha512 与官方完全一致)。
校验包完整性(官方 sha512 清单):
curl -s https://archive.apache.org/dist/storm/apache-storm-2.8.9/apache-storm-2.8.9.tar.gz.sha512
sha512sum apache-storm-2.8.9.tar.gz
实测回显(两者一致):
f545c00e84136fd929b84673e15999bf9c31993d78dc6d06aa49f9cf41dfe45786d5564fb5dc2e70b8098b190dcf53092cd53503963d75b3b6384ba8a431a165 apache-storm-2.8.9.tar.gz
4.3 解压安装到 /opt/storm
cd /opt
tar -xzf apache-storm-2.8.9.tar.gz
mv apache-storm-2.8.9 storm
ls storm/
解压后目录:
DEPENDENCY-LICENSES
LICENSE
NOTICE
README.markdown
RELEASE
SECURITY.md
bin
conf
...
4.4 确认版本号
/opt/storm/bin/storm version
实测回显:
Running: java -client -Ddaemon.name= -Dstorm.options= -Dstorm.home=/opt/storm -Dstorm.log.dir=/opt/storm/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib:/usr/lib64 -Dstorm.conf.file= -cp /opt/storm/*:/opt/storm/lib/*:/opt/storm/extlib/*:/opt/storm/extlib-daemon/*:/opt/storm/conf org.apache.storm.utils.VersionInfo
Storm 2.8.9
Branch v2.8.9
From source with checksum dd8ab586a06db2ced58135f6be47980
💡
storm version同时回显实际调用的 java 启动行,可借此确认 JVM 版本来源。
五、在线安装方案(B:华为云镜像加速)
镜像站提供与官方一致的完整版本列表(含 2.8.9)。下载后同样用官方 sha512 校验:
cd /opt
wget -q -O apache-storm-2.8.9.tar.gz \
https://mirrors.huaweicloud.com/apache/storm/apache-storm-2.8.9/apache-storm-2.8.9.tar.gz
ls -l apache-storm-2.8.9.tar.gz
sha512sum apache-storm-2.8.9.tar.gz
实测回显:
-rw-r--r-- 1 root root 372775041 Jul 18 16:05 apache-storm-2.8.9.tar.gz
f545c00e84136fd929b84673e15999bf9c31993d78dc6d06aa49f9cf41dfe45786d5564fb5dc2e70b8098b190dcf53092cd53503963d75b3b6384ba8a431a165 apache-storm-2.8.9.tar.gz
后续解压安装步骤与 4.3、4.4 完全相同。
5.1 多方案对比与选择建议
| 维度 | 方案 A:官方存档直下 | 方案 B:华为云镜像 |
|---|---|---|
| 版本 | 2.8.9 | 2.8.9(sha512 与官方一致,实测核对) |
| 是否需联网 | 是 | 是 |
| 下载速度 | 实测约 4MB/min,约 90 分钟 | 实测数分钟内完成 |
| 包完整性 | 官方源 | 镜像源(建议 sha512 校验后使用) |
| 适用场景 | 安全合规要求必须官方源 | 追求效率 / 带宽受限 |
选择建议:可联网服务器优先方案 B 加速获取;有合规要求必须从 Apache 官方域名下载时用方案 A,并务必执行 sha512 校验。断网环境可先在能联网的机器上用任一方案下载 .tar.gz,再拷贝到目标服务器解压安装。
六、安装并配置 ZooKeeper 3.8.7(强依赖)
Storm 集群状态(Nimbus 选主、Supervisor 心跳、拓扑分配)全部存于 ZooKeeper。单机部署时 ZooKeeper 与 Storm 装同一台机器即可。
6.1 下载并解压
cd /opt
wget -q -O apache-zookeeper-3.8.7-bin.tar.gz \
https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.8.7/apache-zookeeper-3.8.7-bin.tar.gz
tar -xzf apache-zookeeper-3.8.7-bin.tar.gz
mv apache-zookeeper-3.8.7-bin zookeeper
6.2 配置 zoo.cfg 与 myid
mkdir -p /data/zookeeper/logs
cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
sed -i 's|^dataDir=.*|dataDir=/data/zookeeper|' /opt/zookeeper/conf/zoo.cfg
echo "server.1=127.0.0.1:2888:3888" >> /opt/zookeeper/conf/zoo.cfg
echo "admin.enableServer=false" >> /opt/zookeeper/conf/zoo.cfg
echo 1 > /data/zookeeper/myid
配置说明:
| 配置项 | 值 | 说明 |
|---|---|---|
dataDir | /data/zookeeper | ZooKeeper 数据与快照目录 |
server.1 | 127.0.0.1:2888:3888 | 单节点集群成员定义(2888 同步端口、3888 选举端口) |
admin.enableServer | false | 关闭 ZooKeeper AdminServer(默认监听 8080,会与 Storm UI 默认端口冲突,实测踩坑见 12.4) |
单机独立模式 server.1 可省略,但保留后可平滑扩为多节点伪集群。
6.3 配置 JVM 堆(256MB)与 systemd 托管
新建 /opt/zookeeper/conf/zookeeper-env.sh:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export ZOO_LOG_DIR=/data/zookeeper/logs
export ZK_SERVER_HEAP=256
💡
ZK_SERVER_HEAP控制 ZooKeeper 服务进程堆上限,默认 1000MB;设为 256 生成-Xmx256m。
新建 /etc/systemd/system/zookeeper.service:
[Unit]
Description=Apache ZooKeeper
After=network.target
[Service]
Type=forking
User=root
Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
ExecStart=/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo.cfg
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
Restart=on-failure
[Install]
WantedBy=multi-user.target
6.4 启动并验证 ZooKeeper
systemctl daemon-reload
systemctl enable zookeeper
systemctl start zookeeper
systemctl is-active zookeeper
/opt/zookeeper/bin/zkServer.sh status /opt/zookeeper/conf/zoo.cfg
实测回显:
Created symlink /etc/systemd/system/multi-user.target.wants/zookeeper.service → /etc/systemd/system/zookeeper.service.
active
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone
七、配置 storm.yaml
Storm 读取配置的顺序:conf/storm.yaml(集群配置)覆盖内置默认值。编辑 /opt/storm/conf/storm.yaml:
storm.zookeeper.servers:
- "127.0.0.1"
nimbus.seeds: ["127.0.0.1"]
storm.local.dir: "/data/storm"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
ui.port: 8080
logviewer.port: 8081
nimbus.childopts: "-Xms256m -Xmx512m"
supervisor.childopts: "-Xms256m -Xmx512m"
ui.childopts: "-Xms256m -Xmx512m"
logviewer.childopts: "-Xms256m -Xmx512m"
配置说明:
| 配置项 | 本指南值 | 说明 |
|---|---|---|
storm.zookeeper.servers | 127.0.0.1 | ZooKeeper 主机列表,多节点逗号分隔逐行列出 |
nimbus.seeds | 127.0.0.1 | Nimbus 种子主机列表,客户端与 Supervisor 由此发现主 Nimbus |
storm.local.dir | /data/storm | Nimbus/Supervisor 本地状态目录(jar 上传暂存、心跳等) |
supervisor.slots.ports | 6700-6703 | 每个 Worker 占用一个端口,4 端口 = 最多 4 个 Worker 进程 |
ui.port | 8080 | Storm UI 端口 |
logviewer.port | 8081 | 日志查看服务端口 |
*.childopts | -Xms256m -Xmx512m | 四个守护进程各自的 JVM 堆参数(覆盖默认大堆) |
创建数据目录:
mkdir -p /data/storm
💡 JVM 堆控制:Storm 各守护进程默认堆偏大(Nimbus -Xmx1024m、UI -Xmx768m),小内存服务器务必通过
*.childopts限制在 256-512MB。Worker 堆由worker.heap.memory.mb(默认 768)与worker.childopts的%HEAP-MEM%占位符控制,提交拓扑时也可按拓扑覆盖。
7.1 校验配置解析值
/opt/storm/bin/storm localconfvalue ui.port
/opt/storm/bin/storm localconfvalue nimbus.seeds
实测回显:
ui.port: 8080
nimbus.seeds: 127.0.0.1
八、systemd 托管 Storm 四守护进程
Storm 守护进程均可前台运行,适合 systemd 托管。四个服务单元逐个创建(每行 systemd 命令只操作一个单元)。
/etc/systemd/system/storm-nimbus.service:
[Unit]
Description=Apache Storm Nimbus
After=network.target zookeeper.service
Wants=zookeeper.service
[Service]
Type=simple
User=root
ExecStart=/opt/storm/bin/storm nimbus
ExecStop=/bin/kill -TERM $MAINPID
Restart=on-failure
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
/etc/systemd/system/storm-supervisor.service:
[Unit]
Description=Apache Storm Supervisor
After=network.target zookeeper.service
Wants=zookeeper.service
[Service]
Type=simple
User=root
ExecStart=/opt/storm/bin/storm supervisor
ExecStop=/bin/kill -TERM $MAINPID
Restart=on-failure
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
/etc/systemd/system/storm-ui.service:
[Unit]
Description=Apache Storm UI
After=network.target zookeeper.service
Wants=zookeeper.service
[Service]
Type=simple
User=root
ExecStart=/opt/storm/bin/storm ui
ExecStop=/bin/kill -TERM $MAINPID
Restart=on-failure
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
/etc/systemd/system/storm-logviewer.service:
[Unit]
Description=Apache Storm Logviewer
After=network.target zookeeper.service
Wants=zookeeper.service
[Service]
Type=simple
User=root
ExecStart=/opt/storm/bin/storm logviewer
ExecStop=/bin/kill -TERM $MAINPID
Restart=on-failure
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
逐个启动并设置开机自启:
systemctl daemon-reload
systemctl enable storm-nimbus
systemctl enable storm-supervisor
systemctl enable storm-ui
systemctl enable storm-logviewer
systemctl start storm-nimbus
systemctl start storm-supervisor
systemctl start storm-ui
systemctl start storm-logviewer
逐个确认状态:
systemctl is-active storm-nimbus
systemctl is-active storm-supervisor
systemctl is-active storm-ui
systemctl is-active storm-logviewer
实测回显(依次四行):
active
active
active
active
systemctl status storm-nimbus 实测(节选):
● storm-nimbus.service - Apache Storm Nimbus
Loaded: loaded (/etc/systemd/system/storm-nimbus.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2026-10-12 13:13:11 UTC; 41s ago
Main PID: 7836 (java)
Tasks: 145 (limit: 5753)
Memory: 177.8M
CPU: 14.552s
CGroup: /system.slice/storm-nimbus.service
九、启动验证
9.1 进程验证(jps)
jps -l | grep -E "Nimbus|Supervisor|UIServer|Logviewer|QuorumPeerMain"
实测回显:
7845 org.apache.storm.daemon.supervisor.Supervisor
8341 org.apache.storm.daemon.logviewer.LogviewerServer
7836 org.apache.storm.daemon.nimbus.Nimbus
8335 org.apache.storm.daemon.ui.UIServer
5529 org.apache.zookeeper.server.quorum.QuorumPeerMain
9.2 端口验证(netstat)
netstat -tlnp | grep -E "6627|8080|8081|2181"
实测回显:
tcp6 0 0 :::2181 :::* LISTEN 5529/java
tcp6 0 0 :::8080 :::* LISTEN 8335/java
tcp6 0 0 :::8081 :::* LISTEN 8341/java
tcp6 0 0 :::6627 :::* LISTEN 7836/java
9.3 JVM 堆生效验证(jps -v)
jps -v | grep -E "Nimbus|Supervisor|UIServer|LogviewerServer" | tr ' ' '\n' | grep -E "Nimbus|Supervisor|UIServer|LogviewerServer|Xms|Xmx"
实测回显:
Supervisor -Xms256m -Xmx512m
LogviewerServer -Xms256m -Xmx512m
Nimbus -Xms256m -Xmx512m
UIServer -Xms256m -Xmx512m
(jps -v 会打印完整 classpath 与全部 JVM 参数,此处摘录堆生效的关键参数。)
9.4 UI HTTP 验证(curl)
curl -s http://127.0.0.1:8080/api/v1/cluster/summary
curl -s http://127.0.0.1:8080/api/v1/nimbus/summary
实测回显:
{"stormVersion":"2.8.9","fragmentedCpu":0.0,"executorsTotal":0,"totalMem":4096.0,"availCpu":400.0,"slotsTotal":4,"stormVersionInfo":{"date":"2026-07-18T15:27Z","srcChecksum":"dd8ab586a06db2ced58135f6be47980","version":"2.8.9","branch":"v2.8.9","revision":"bfc02e4b78b708492c6fbbb39be96e5a96cb7da5"},"slotsUsed":0,"bugtracker-url":null,"topologies":0,"totalCpu":400.0,"cpuAssignedPercentUtil":"0.000","availMem":4096.0,"slotsFree":4,"memAssignedPercentUtil":"0.000","availGenerics":"","totalGenerics":"","central-log-url":null,"user":null,"fragmentedMem":0.0,"tasksTotal":0,"schedulerDisplayResource":false,"supervisors":1}
{"nimbuses":[{"port":6627,"host":"99d6ed5a8bdf","nimbusUpTime":"2m 40s","nimbusLogLink":"http://99d6ed5a8bdf:8081/api/v1/daemonlog?file=nimbus.log","nimbusUpTimeSeconds":160,"version":"2.8.9","status":"Leader"}]}
💡
slotsTotal: 4对应supervisor.slots.ports四个端口;supervisors: 1、Nimbusstatus: Leader说明集群协调正常。浏览器访问http://<服务器IP>:8080即为 Storm UI。
十、提交官方示例拓扑验证(WordCount)
Storm 发行版自带 examples/storm-starter 示例(源码形态,需 Maven 构建一次),用其 WordCount 拓扑验证整条提交链路。
10.1 构建 storm-starter 示例 jar
apt-get install -y maven
cd /opt/storm/examples/storm-starter
mvn clean package -DskipTests
构建产物:
-rw-r--r-- 1 root root 101508934 Oct 12 13:09 target/storm-starter-2.8.9.jar
-rw-r--r-- 1 root root 275136 Oct 12 13:09 target/original-storm-starter-2.8.9.jar
(storm-starter-2.8.9.jar 为含全部依赖的 shaded jar,original- 前缀为未打包依赖的原始类。)
10.2 提交 WordCount 拓扑
/opt/storm/bin/storm jar /opt/storm/examples/storm-starter/target/storm-starter-2.8.9.jar \
org.apache.storm.starter.WordCountTopology wordcount
实测回显(节选):
Running: java -client -Ddaemon.name= -Dstorm.options= -Dstorm.home=/opt/storm -Dstorm.log.dir=/opt/storm/logs ... -cp /opt/storm/*:/opt/storm/lib/*:/opt/storm/extlib/*:/opt/storm/examples/storm-starter/target/storm-starter-2.8.9.jar:/opt/storm/conf:/opt/storm/bin: -Dstorm.jar=/opt/storm/examples/storm-starter/target/storm-starter-2.8.9.jar -Dstorm.dependency.jars= -Dstorm.dependency.artifacts={} org.apache.storm.starter.WordCountTopology wordcount
13:11:14.355 [main] INFO o.a.s.u.NimbusClient - Found leader nimbus : 99d6ed5a8bdf:6627:0
13:11:14.445 [main] INFO o.a.s.StormSubmitter - Uploading topology jar /opt/storm/examples/storm-starter/target/storm-starter-2.8.9.jar to assigned location: /data/storm/nimbus/inbox/stormjar-de8838c4-6b7f-4dd5-8a06-f81d13299feb.jar
13:11:15.355 [main] INFO o.a.s.StormSubmitter - Successfully uploaded topology jar to assigned location: /data/storm/nimbus/inbox/stormjar-de8838c4-6b7f-4dd5-8a06-f81d13299feb.jar
13:11:15.355 [main] INFO o.a.s.StormSubmitter - Submitting topology wordcount in distributed mode with conf {"storm.zookeeper.topology.auth.scheme":"digest","storm.zookeeper.topology.auth.payload":"-5386753987929280264:-4889585519887821651","topology.workers":3,"topology.debug":true}
13:11:16.126 [main] INFO o.a.s.StormSubmitter - Finished submitting topology: wordcount
10.3 确认拓扑运行
/opt/storm/bin/storm list
实测回显:
Topology_name Status Num_tasks Num_workers Uptime_secs Topology_Id Owner
----------------------------------------------------------------------------------------
wordcount ACTIVE 28 3 33 wordcount-1-1791810675 root
UI 接口同步可见:
curl -s http://127.0.0.1:8080/api/v1/topology/summary
实测回显:
{"schedulerDisplayResource":false,"topologies":[{"owner":"root","assignedGenericResources":"","requestedCpu":280.0,"topologyVersion":null,"replicationCount":1,"requestedGenericResources":"","stormVersion":"2.8.9","executorsTotal":28,"assignedMemOnHeap":3584.0,"assignedTotalMem":3584.0,"assignedCpu":280.0,"requestedMemOnHeap":3584.0,"encodedId":"wordcount-1-1791810675","uptimeSeconds":40,"uptime":"40s","schedulerInfo":null,"requestedTotalMem":3584.0,"assignedMemOffHeap":0.0,"workersTotal":3,"requestedMemOffHeap":0.0,"name":"wordcount","id":"wordcount-1-1791810675","tasksTotal":28,"status":"ACTIVE"}]}
验证完成后杀掉拓扑(示例拓扑持续吐随机句子,无需长跑):
/opt/storm/bin/storm kill wordcount -w 10
实测回显(节选):
13:12:12.909 [main] INFO o.a.s.c.KillTopology - Killed topology: wordcount
稍候再次 storm list 显示 No topologies running. 即清理完成。
十一、注意事项
- Storm 2.8.9 运行必须 Java 17+;
storm命令行脚本必须 python3,缺一不可。 - ZooKeeper AdminServer 默认占用 8080,与 Storm UI 默认端口冲突,安装期就按第六节关闭
admin.enableServer或改admin.serverPort。 - 多节点部署时:所有节点
/etc/hosts或 DNS 保证主机名互通;每台 Supervisor 的storm.zookeeper.servers与nimbus.seeds指向真实地址;storm.local.dir为本机目录,多节点间不共享。 - Worker 日志在
/opt/storm/logs/workers-artifacts/<拓扑ID>/,Logviewer(8081)提供网页查看,浏览器入口为 UI 拓扑页的每个 Spout/Bolt 链接。 systemctl stop storm-*走ExecStop的 TERM 信号,守护进程正常退出;强制 kill -9 可能遗留 ZooKeeper 心跳过期等待(默认 30 秒内自愈)。
十二、常见问题(FAQ)
12.1:启动报 UnsupportedClassVersionError: ... class file version 61.0
错误回显(Java 11 环境执行 storm version 实测):
Error: LinkageError occurred while loading main class org.apache.storm.utils.VersionInfo
java.lang.UnsupportedClassVersionError: org/apache/storm/utils/VersionInfo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
定位:Storm 2.8.9 由 Java 17 编译(class file 61.0),运行时 JVM 低于 17(55.0 = Java 11)。
解决:安装 openjdk-17-jdk-headless 并确保 java -version 为 17;多 JDK 共存时用 update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 切换,或在 systemd 单元中显式指向 17 的路径。
12.2:storm 命令报 /usr/bin/env: 'python3': No such file or directory
定位:bin/storm 是 Python 脚本包装器,系统无 python3 时先报 operand 语法错误再找不到解释器(实测回显):
/opt/storm/bin/storm: line 42: 10 * 'python3': + 'python3':: syntax error: operand expected (error token is "'python3': + 'python3':")
/usr/bin/env: 'python3': No such file or directory
解决:apt-get install -y python3。
12.3:UI 起不来,ui.log 报 Jetty bind 失败
定位:8080 被 ZooKeeper AdminServer 抢占(ZooKeeper 3.8+ AdminServer 默认监听 8080)。实测 netstat -tlnp 中 8080 的监听进程是 ZooKeeper 的 java 进程,Storm UI 启动即抛 openAcceptChannel 绑定异常后自动退出。
解决:在 zoo.cfg 加 admin.enableServer=false(或 admin.serverPort=8085)并重启 ZooKeeper,再启动 Storm UI。
12.4:storm list 报 Found leader nimbus 后长时间卡住或连接拒绝
定位:Nimbus 未启动或 6627 未监听。用 jps -l 与 netstat -tlnp | grep 6627 排查;systemd 托管时先 systemctl is-active storm-nimbus,再看 /opt/storm/logs/nimbus.log。
解决:修复依赖(ZooKeeper 必须先可用)后 systemctl start storm-nimbus。
12.5:提交拓扑后 Worker 起不来、拓扑有任务无吞吐
定位:/opt/storm/logs/supervisor.log 与 worker 日志(/opt/storm/logs/workers-artifacts/)常见两类原因——supervisor.slots.ports 端口被占用;机器可用内存低于 Worker 堆申请(worker.heap.memory.mb 默认 768,多 Worker 场景下调低或减少端口)。
解决:释放端口或调整 supervisor.slots.ports/worker.heap.memory.mb 后 systemctl restart storm-supervisor。
十三、卸载与清理
systemctl stop storm-logviewer
systemctl stop storm-ui
systemctl stop storm-supervisor
systemctl stop storm-nimbus
systemctl disable storm-logviewer
systemctl disable storm-ui
systemctl disable storm-supervisor
systemctl disable storm-nimbus
rm -f /etc/systemd/system/storm-{nimbus,supervisor,ui,logviewer}.service
systemctl daemon-reload
rm -rf /opt/storm /data/storm
(ZooKeeper 一并卸载时:systemctl stop zookeeper && systemctl disable zookeeper && rm -rf /opt/zookeeper /data/zookeeper /etc/systemd/system/zookeeper.service && systemctl daemon-reload。可选清理构建缓存:apt-get remove -y maven && rm -rf /root/.m2。)
十四、参考链接
- Apache Storm 官方下载(dlcdn,仅最新版):https://dlcdn.apache.org/storm/
- Apache Storm 官方存档(含全部历史版本):https://archive.apache.org/dist/storm/
- Apache Storm 官方文档:https://storm.apache.org/releases/2.8.9/
- Storm 2.8.9 Setup 基础集群部署文档:https://storm.apache.org/releases/2.8.9/Setting-up-a-Storm-cluster.html
- Apache ZooKeeper 下载:https://zookeeper.apache.org/releases.html
- 清华大学开源镜像站(ZooKeeper 等):https://mirrors.tuna.tsinghua.edu.cn/apache/
- 华为云开源镜像站(Storm 全版本):https://mirrors.huaweicloud.com/apache/storm/