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 设置,命令与回显均实测

Apache StormApache Storm2026/10/12

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 Storm2.8.92.x 系列最新稳定版;官方最新大版本 3.1.0 已发布但生态组件兼容性仍在演进,生产推荐 2.8.9
OpenJDK17Storm 2.8.9 编译目标为 Java 17(class file 61.0),Java 8/11 无法运行
ZooKeeper3.8.7Storm 官方推荐 ZooKeeper 3.5+,3.8 LTS 稳定
Python3.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.92.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/zookeeperZooKeeper 数据与快照目录
server.1127.0.0.1:2888:3888单节点集群成员定义(2888 同步端口、3888 选举端口)
admin.enableServerfalse关闭 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.servers127.0.0.1ZooKeeper 主机列表,多节点逗号分隔逐行列出
nimbus.seeds127.0.0.1Nimbus 种子主机列表,客户端与 Supervisor 由此发现主 Nimbus
storm.local.dir/data/stormNimbus/Supervisor 本地状态目录(jar 上传暂存、心跳等)
supervisor.slots.ports6700-6703每个 Worker 占用一个端口,4 端口 = 最多 4 个 Worker 进程
ui.port8080Storm UI 端口
logviewer.port8081日志查看服务端口
*.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、Nimbus status: 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。)

十四、参考链接