Apache Storm 2.8.9 配置参数详解

详解 Apache Storm 2.8.9 的 storm.yaml 核心参数——ZooKeeper 连接、nimbus.seeds、supervisor.slots.ports、UI/Logviewer 端口、四守护进程与 Worker 的 childopts/堆 256-512MB、资源容量上限,全部默认值经 localconfvalue 实测并给出生产模板

Apache StormApache Storm2026/10/12

Apache Storm 2.8.9 配置参数详解

目标:详解 Apache Storm 2.8.9 的 conf/storm.yaml 核心配置——ZooKeeper 连接、Nimbus 种子、Supervisor 资源槽位、UI/Logviewer 端口、四个守护进程与 Worker 的 JVM 堆(256-512MB)与资源容量参数,并给出生产模板。文中默认值均通过 storm localconfvalue 在真实环境实测。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • Apache Storm:2.8.9(安装目录 /opt/storm)
  • 配置文件:/opt/storm/conf/storm.yaml
  • ZooKeeper:3.8.7(独立部署,/opt/zookeeper)
  • Java:OpenJDK 17.0.20.1
  • 端口:Nimbus 6627、UI 8080、Logviewer 8081、ZooKeeper 2181、Worker slots 6700-6703
  • 本机 storm.yaml:显式配置了 storm.zookeeper.servers、nimbus.seeds、storm.local.dir、supervisor.slots.ports、ui.port、logviewer.port 与四个 *.childopts

二、前置条件

  • 已按《Ubuntu 22.04 安装 Apache Storm 2.8.9 指南》完成 Storm 2.8.9 与 ZooKeeper 3.8.7 安装。
  • 配置修改后需重启对应守护进程生效(systemd:systemctl restart <单元>)。
  • 验证配置用 storm localconfvalue(本地解析值)与 jps -v(JVM 实际生效参数)。

三、参数查看与修改方式

Storm 配置按「内置默认值 → conf/storm.yaml 覆盖 → 拓扑级 conf 覆盖」三级生效。日常改 /opt/storm/conf/storm.yaml(YAML 格式,键值冒号分隔,列表用缩进短横线)。

查看解析值(本地视角,含 storm.yaml 覆盖结果):

/opt/storm/bin/storm localconfvalue ui.port
/opt/storm/bin/storm localconfvalue worker.heap.memory.mb

实测回显:

ui.port: 8080
worker.heap.memory.mb: 768

查看 Nimbus 侧解析值(远程读取主 Nimbus 的生效配置):

/opt/storm/bin/storm remoteconfvalue ui.port

实测回显:

ui.port: 8080

💡 Storm 2.8 发行包不再附带 defaults.yaml 文件,内置默认值已编译进 jar;把 storm.yaml 临时改名后执行 localconfvalue 即可读出某键的出厂默认值(实测:nimbus.childopts 默认 -Xmx1024m、ui.childopts 默认 -Xmx768m、supervisor.childopts 默认 -Xmx256m、logviewer.childopts 默认 -Xmx128m、nimbus.seeds 默认 localhost、storm.local.dir 默认 storm-local 相对路径)。查完记得把 storm.yaml 改回原名。

修改生效路径:

vim /opt/storm/conf/storm.yaml
systemctl restart storm-nimbus
systemctl restart storm-supervisor
systemctl restart storm-ui
systemctl restart storm-logviewer

四、参数总览

参数内置默认值本机配置值说明
storm.zookeeper.servers(无)127.0.0.1ZooKeeper 主机列表
storm.zookeeper.port21812181ZooKeeper 客户端端口
nimbus.seedslocalhost127.0.0.1Nimbus 种子主机列表
nimbus.thrift.port66276627Nimbus Thrift 服务端口
nimbus.childopts-Xmx1024m-Xms256m -Xmx512mNimbus JVM 参数
storm.local.dirstorm-local/data/storm本地状态目录
supervisor.slots.ports6700 6701 6702 67036700-6703Worker 槽位端口
supervisor.childopts-Xmx256m-Xms256m -Xmx512mSupervisor JVM 参数
supervisor.memory.capacity.mb4096.04096.0Supervisor 可分配内存总量(MB)
supervisor.cpu.capacity400.0400.0Supervisor 可分配 CPU 总量(核×100)
worker.heap.memory.mb768768单个 Worker 堆内存(MB)
worker.childopts-Xmx%HEAP-MEM%m ...(见 5.3.4)同默认Worker JVM 参数模板
ui.port80808080UI 端口
ui.host0.0.0.00.0.0.0UI 监听地址
ui.childopts-Xmx768m-Xms256m -Xmx512mUI JVM 参数
logviewer.port80818081Logviewer 端口
logviewer.childopts-Xmx128m-Xms256m -Xmx512mLogviewer JVM 参数
topology.workers11拓扑默认 Worker 数(提交时可覆盖)
topology.message.timeout.secs3030消息处理超时(秒)
topology.debugfalsefalse拓扑调试日志开关

实测取值方式均为 /opt/storm/bin/storm localconfvalue <键>;「本机配置值」与默认值相同的键表示未覆盖或显式写成默认。

五、核心参数分类详解

5.1 ZooKeeper 连接参数

5.1.1 storm.zookeeper.servers

ZooKeeper 主机列表。单机写本机,集群逐行列出所有主机:

storm.zookeeper.servers:
    - "10.0.0.11"
    - "10.0.0.12"
    - "10.0.0.13"

本机单机实测值:

storm.zookeeper.servers:
    - "127.0.0.1"

5.1.2 storm.zookeeper.port

ZooKeeper 客户端端口,默认 2181。非标准端口部署时才需覆盖:

storm.zookeeper.port: 2181

⚠️ ZooKeeper 3.8+ 的 AdminServer 默认也监听 8080,与 ui.port 冲突(实测 UI 因此起不来)。在 ZooKeeper 侧 zoo.cfg 加 admin.enableServer=false 或改 admin.serverPort,与 Storm 配置无关但属于最常见的联合配置坑。

5.2 Nimbus 参数

5.2.1 nimbus.seeds

Nimbus 种子地址列表,客户端与 Supervisor 由此发现主 Nimbus。HA 部署列出所有候选 Nimbus 主机:

nimbus.seeds: ["127.0.0.1"]

💡 2.x 已废弃 nimbus.host(实测 localconfvalue nimbus.host 返回 null),统一用 nimbus.seeds。

5.2.2 nimbus.thrift.port

Nimbus Thrift RPC 端口(storm 客户端、UI 都连它),默认 6627:

nimbus.thrift.port: 6627

5.2.3 nimbus.childopts(JVM 堆 256-512MB)

Nimbus JVM 参数。内置默认 -Xmx1024m 对小内存服务器偏大,实测改为:

nimbus.childopts: "-Xms256m -Xmx512m"

重启后核对生效值:

jps -v | grep Nimbus | tr ' ' '\n' | grep -E "Xms|Xmx"

实测回显:

-Xms256m
-Xmx512m

5.3 Supervisor 与 Worker 资源参数

5.3.1 supervisor.slots.ports

Worker 槽位:每个端口对应一个 Worker 进程,决定单 Supervisor 最多并发 Worker 数。默认 6700-6703 共 4 个:

supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703

扩容即追加端口(如 6704、6705)并重启 supervisor。

5.3.2 supervisor.childopts

Supervisor 自身 JVM 参数(不含 Worker),实测限 256-512MB:

supervisor.childopts: "-Xms256m -Xmx512m"

5.3.3 supervisor.memory.capacity.mb 与 supervisor.cpu.capacity

调度器视角的 Supervisor 资源总量上限(默认实测值):

supervisor.memory.capacity.mb: 4096.0
supervisor.cpu.capacity: 400.0

💡 localconfvalue ui.port 等常规验证之外,这两个值也与 UI 集群摘要一致:实测 curl http://127.0.0.1:8080/api/v1/cluster/summary 返回 "totalMem":4096.0,"totalCpu":400.0,"slotsTotal":4。小内存机器部署时把 supervisor.memory.capacity.mb 调到物理内存可承受的值,避免调度器超卖。

5.3.4 worker.heap.memory.mb 与 worker.childopts

单 Worker 堆内存默认 768MB;worker.childopts 中的 %HEAP-MEM% 占位符在 Worker 启动时被替换为该值(实测解析值):

worker.childopts: -Xmx%HEAP-MEM%m -XX:+IgnoreUnrecognizedVMOptions -XX:+PrintGCDetails -Xloggc:artifacts/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=artifacts/heapdump

压缩 Worker 堆到 256MB(小机器多 Worker 场景):

worker.heap.memory.mb: 256

Worker 堆也可按拓扑覆盖:提交时在 storm jar <jar路径> <主类> <拓扑名> 后追加 -c topology.worker.heap.memory.mb=512。

5.3.5 storm.local.dir

Nimbus/Supervisor 本地状态目录(jar 上传暂存、心跳、worker-ids)。默认 storm-local(相对安装目录),生产显式落到数据盘:

storm.local.dir: "/data/storm"

⚠️ 多节点部署时这是各节点本地目录,禁止挂同一共享盘;Nimbus 与 Supervisor 在同一台机器时可用同一目录(实测单机用 /data/storm)。

5.4 UI 与 Logviewer 参数

5.4.1 ui.port 与 ui.host

UI 端口默认 8080,监听地址默认 0.0.0.0(实测值):

ui.port: 8080
ui.host: 0.0.0.0

5.4.2 logviewer.port

Logviewer(Worker/守护进程日志网页查看)端口,默认 8081:

logviewer.port: 8081

5.4.3 ui.childopts 与 logviewer.childopts

两个 Web 类守护进程的 JVM 参数,实测限 256-512MB(默认分别为 -Xmx768m、-Xmx128m):

ui.childopts: "-Xms256m -Xmx512m"
logviewer.childopts: "-Xms256m -Xmx512m"

5.5 拓扑级参数(defaults,提交时可覆盖)

5.5.1 topology.workers

拓扑默认 Worker 数(默认 1)。WordCount 示例自带 topology.workers=3(实测提交回显 Submitting topology wordcount in distributed mode with conf {...,"topology.workers":3,...}),运行中改用 rebalance(实测 workers 3→2):

/opt/storm/bin/storm rebalance wordcount -w 5 -n 2

5.5.2 topology.message.timeout.secs

Tuple 处理超时(默认 30 秒),超时触发重放。要求低延迟可调小,业务可能长阻塞时调大:

topology.message.timeout.secs: 30

5.5.3 topology.debug

调试日志开关(默认 false)。排障时提交拓扑带 -c topology.debug=true,会显著增加日志量,用完关闭。

六、生产配置模板

适用场景:8-16GB 内存服务器、SSD、单机伪集群或作为 3 节点 Storm 集群中每台 Supervisor 的基准模板;守护进程堆统一 256-512MB,资源容量按物理内存对齐。

storm.zookeeper.servers:
    - "10.0.0.11"
    - "10.0.0.12"
    - "10.0.0.13"
nimbus.seeds: ["10.0.0.11", "10.0.0.12"]
storm.local.dir: "/data/storm"
supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703
    - 6704
    - 6705
ui.port: 8080
logviewer.port: 8081
nimbus.childopts: "-Xms256m -Xmx512m"
supervisor.childopts: "-Xms256m -Xmx512m"
ui.childopts: "-Xms256m -Xmx512m"
logviewer.childopts: "-Xms256m -Xmx512m"
supervisor.memory.capacity.mb: 8192.0
supervisor.cpu.capacity: 800.0
worker.heap.memory.mb: 512

内存说明:四个守护进程合计堆上限约 2GB(各 512MB);Worker 按 worker.heap.memory.mb: 512 × 6 槽位上限约 3GB,supervisor.memory.capacity.mb: 8192 需与物理内存留出系统与 ZooKeeper 余量后对齐;16GB 内存机器建议 Worker 槽位与容量按 6 Worker × 512MB 上量并压测后调整。磁盘需为 /data/storm(拓扑 jar 暂存)与 /opt/storm/logs 预留 20GB+。

七、常见问题

7.1:改了 storm.yaml 不生效

定位:配置只在守护进程启动时读取。 解决:逐个重启对应单元(systemctl restart storm-nimbus 等)后,用 localconfvalue 与 jps -v 复核(JVM 类参数必须看 jps -v 实际回显,文件值≠生效值)。

7.2:UI 端口 8080 被占,UI 起不来

定位:ZooKeeper 3.8+ AdminServer 默认监听 8080(实测 netstat -tlnp 中 8080 归属 ZooKeeper 进程)。 解决:ZooKeeper zoo.cfg 加 admin.enableServer=false 重启;或 Storm 侧改 ui.port: 8082。

7.3:YAML 缩进错误导致启动失败

定位:supervisor.slots.ports 这类列表必须用短横线缩进逐行书写;写成行内 [6700,6701] 虽合法但与官方模板不一致,手改缩进时最常见混用 TAB 导致解析失败。 解决:统一空格缩进,改完先 localconfvalue 验证解析,再重启服务。

7.4:Worker 起不来,报内存不足

定位:Worker 申请堆 = worker.heap.memory.mb(默认 768),多 Worker 同时启动时超过机器可用内存。 解决:调低 worker.heap.memory.mb(如 256/512)、减少 supervisor.slots.ports,或提高 supervisor.memory.capacity.mb 与物理内存对齐后重启 supervisor。

7.5:localconfvalue 显示的默认值与文档不同

定位:Storm 各小版本默认值有差异(如 2.8.x 的守护进程默认堆与 2.4 不同)。 解决:以本机 storm localconfvalue <键> 实测值为准(本文全部默认值均按此法实测自 2.8.9)。

八、参考链接