一、Storm 目录结构(主要目录)
bin - 启动 Storm 的可执行程序
conf - 配置文件目录
logs - 日志目录
data - Nimbus 和 Supervisor 存储临时文件
二、将 Topology 提交到 Storm 集群
1. 先将单词计数的示例打包成 jar 上传到 Storm 目录下的 data 目录内
2. 确认上传成功
3. 将Topology 提交到集群中
命令:storm jar WordCountTopology.jar topology.WordCountTopology wordcount-topology
4. 查看 Storm UI 界面检查是否上传成功
三、Storm 命令
命令格式:storm [command] [arguments]
守护进程命令
Nimbus
用法:storm nimbus &
作用:启动 nimbus 守护进程
Supervisor
用户:storm Supervisor &
作用:启动 Supervisor 守护进程
UI
用法:storm ui &
作用:启动UI界面的守护进程,提供了一个可访问的 web UI界面,用来监控 Storm 集群
DRPC
用法:storm drpc &
作用:启动DRPC服务守护进程
管理命令
用来发布和管理集群中的 Topology,在 Storm 的主节点执行。
Jar
用法:storm jar [ topology_jar ] [ topology_class ] [ topology_name) ]
作用:向集群提交 Topology,上传 Topology 的 jar 文件到 Nimbus 以分发到整个集群。同时指定 Topology 的 main 方法类的全路径,Topology 的 main 方法需要调用 StormSubmitter.submitTopology() 方法。同时为 Topology 提供集群内唯一的名称,如果集群中一个同名的 Topology,jar 命令会执行失败。提交后 Storm 集群会激活并且开始运行 Topology 。
Kill
用法:storm kill [ topology_name [ - w wait_time ] ]
作用:使用 Topology 的名称关闭已经部署的 Topology。Storm 在 topology.message.timeout.secs 的时间后使 Topology 的 Spout 取消激活,这样已经发射的 Tuple 就可以执行完毕。然后停止 Worker 进行,并且尝试清理所有的状态信息。可以使用 -w 参数设置延时关闭时间,覆盖 topology.message.timeout.secs 参数。
Deactivate
用法:storm deactivate [ topology_name ]
作用:停止特定的 Topology 的 Spout 发射 Tuple。Topology 可以在 UI 上进行取消激活的操作。
Activate
用法:storm activate [ topology_name ]
作用:重新恢复特定 Topology 的 Spout 发射 Tuple。Topology 可以在 UI 上进行重新激活操作。
Rebalance
用法:storm rebalance [ topology_name ] [-w wait_time] [-n worker_count] [ -e component_name = executer_count ]
作用:rebalance 命令指示 Storm 在集群的 Worker 之间重新平均分派任务,不需要关闭或者重新提交现有的 Topology 。例如:一个新的 Supervisor 节点添加到一个集群中,就需要执行这个命令,因为现有的 Topology 是不会将任务分配到新节点的 Worker 上的。
rebalance 命令还可以使用 -n 和 -e 参数来修改为 Topology 分配的 Worker 以及每个 Task 分配的 executor 的个数。
当执行 rebalance 命令时,Storm 会先取消激活 Topology,等待配置的时间使剩余的 Tuple 完成处理,然后在 Supervisor 节点中重新分配 Worker ,然后 Storm 会将 Topology 回复到之前的激活状态。
实例:storm rebalance wordcount-topology -w 15 -n 5 -e sentence-spout=4 -e split-bolt=8
等待 15 秒后重新平衡名字为wordcount-topology的Topology
设置 5 个 Worker
设置 4 个 sentence-spout 线程
设置 8 个 split-bolt 线程
Remoteconfvalue
用法:storm remoteconfvalue conf-name
作用:查看远程集群中的配置参数值。使用这个命令只能看到整个集群的公共配置,不可以查看单独的 Topology 配置。
本地调试/开发命令
REPL
用法:storm repl
作用:使用 Storm 的本地 classpath 打开一个 Clojure REPL会话
Classpath
用法:storm classpath
作用:打印 Storm client 使用的 classpath 值
Localconfvalue
使用:storm localconfvalue conf_name
作用:在整合 storm.yaml 和 Storm 内置默认值后的配置中查找特定配置项的值
四、Storm 配置
必须的配置
storm.zookeeper.servers
配置 Zookeeper 集群的主机名称。如果 Zookeeper 和 Storm 安装在同一台机器上,可以使用 localhost。
nimbus.host
指定 Storm 集群中 nimbus 的节点,Worker 需要从这个配置知道集群的主节点在哪,用来下载 Topology 的 jar 包和配置选项。
supervisor.slots.ports
控制每个 Supervisor 节点运行多少个 Worker 进程。
storm.local.dir
Nimbus 和 Supervisor 守护进程都会存储一些短暂的状态信息,比如 JAR 包和 Worker 需要的配置文件。这个配置决定将信息储存在哪(这个目录必须已经存在,并且启动用户必须有足够的权限,可以读写这个目录)。
全部的配置
# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ########### These all have default values as shown ########### Additional configuration goes into storm.yaml java.library.path: "/usr/local/lib:/opt/local/lib:/usr/lib" ### storm.* configs are general configurations # the local dir is where jars are kept storm.local.dir: "storm-local" storm.zookeeper.servers: - "localhost" storm.zookeeper.port: 2181 storm.zookeeper.root: "/storm" storm.zookeeper.session.timeout: 20000 storm.zookeeper.connection.timeout: 15000 storm.zookeeper.retry.times: 5 storm.zookeeper.retry.interval: 1000 storm.zookeeper.retry.intervalceiling.millis: 30000 storm.cluster.mode: "distributed" # can be distributed or local storm.local.mode.zmq: false storm.thrift.transport: "backtype.storm.security.auth.SimpleTransportPlugin" storm.messaging.transport: "backtype.storm.messaging.netty.Context" ### nimbus.* configs are for the master nimbus.host: "localhost" nimbus.thrift.port: 6627 nimbus.thrift.max_buffer_size: 1048576 nimbus.childopts: "-Xmx1024m" nimbus.task.timeout.secs: 30 nimbus.supervisor.timeout.secs: 60 nimbus.monitor.freq.secs: 10 nimbus.cleanup.inbox.freq.secs: 600 nimbus.inbox.jar.expiration.secs: 3600 nimbus.task.launch.secs: 120 nimbus.reassign: true nimbus.file.copy.expiration.secs: 600 nimbus.topology.validator: "backtype.storm.nimbus.DefaultTopologyValidator" ### ui.* configs are for the master ui.port: 8080 ui.childopts: "-Xmx768m" logviewer.port: 8000 logviewer.childopts: "-Xmx128m" logviewer.appender.name: "A1" drpc.port: 3772 drpc.worker.threads: 64 drpc.queue.size: 128 drpc.invocations.port: 3773 drpc.request.timeout.secs: 600 drpc.childopts: "-Xmx768m" transactional.zookeeper.root: "/transactional" transactional.zookeeper.servers: null transactional.zookeeper.port: null ### supervisor.* configs are for node supervisors # Define the amount of workers that can be run on this machine. Each worker is assigned a port to use for communication supervisor.slots.ports: - 6700 - 6701 - 6702 - 6703 supervisor.childopts: "-Xmx256m" #how long supervisor will wait to ensure that a worker process is started supervisor.worker.start.timeout.secs: 120 #how long between heartbeats until supervisor considers that worker dead and tries to restart it supervisor.worker.timeout.secs: 30 #how frequently the supervisor checks on the status of the processes it's monitoring and restarts if necessary supervisor.monitor.frequency.secs: 3 #how frequently the supervisor heartbeats to the cluster state (for nimbus) supervisor.heartbeat.frequency.secs: 5 supervisor.enable: true ### worker.* configs are for task workers worker.childopts: "-Xmx768m" worker.heartbeat.frequency.secs: 1 task.heartbeat.frequency.secs: 3 task.refresh.poll.secs: 10 zmq.threads: 1 zmq.linger.millis: 5000 zmq.hwm: 0 storm.messaging.netty.server_worker_threads: 1 storm.messaging.netty.client_worker_threads: 1 storm.messaging.netty.buffer_size: 5242880 #5MB buffer storm.messaging.netty.max_retries: 30 storm.messaging.netty.max_wait_ms: 1000 storm.messaging.netty.min_wait_ms: 100 ### topology.* configs are for specific executing storms topology.enable.message.timeouts: true topology.debug: false topology.optimize: true topology.workers: 1 topology.acker.executors: null topology.tasks: null # maximum amount of time a message has to complete before it's considered failed topology.message.timeout.secs: 30 topology.skip.missing.kryo.registrations: false topology.max.task.parallelism: null topology.max.spout.pending: null topology.state.synchronization.timeout.secs: 60 topology.stats.sample.rate: 0.05 topology.builtin.metrics.bucket.size.secs: 60 topology.fall.back.on.java.serialization: true topology.worker.childopts: null topology.executor.receive.buffer.size: 1024 #batched topology.executor.send.buffer.size: 1024 #individual messages topology.receiver.buffer.size: 8 # setting it too high causes a lot of problems (heartbeat thread gets starved, throughput plummets) topology.transfer.buffer.size: 1024 # batched topology.tick.tuple.freq.secs: null topology.worker.shared.thread.pool.size: 4 topology.disruptor.wait.strategy: "com.lmax.disruptor.BlockingWaitStrategy" topology.spout.wait.strategy: "backtype.storm.spout.SleepSpoutWaitStrategy" topology.sleep.spout.wait.strategy.time.ms: 1 topology.error.throttle.interval.secs: 10 topology.max.error.report.per.interval: 5 topology.kryo.factory: "backtype.storm.serialization.DefaultKryoFactory" topology.tuple.serializer: "backtype.storm.serialization.types.ListDelegateSerializer" topology.trident.batch.emit.interval.millis: 500 dev.zookeeper.path: "/tmp/dev-storm-zookeeper"
五、监督模式(待实践)
使用监督模式启动 Storm 的守护进程,好处是程序如果有异常失败,服务就可以重启。
参考 upstart
六、自动化框架(待实践)
参考 Pupper