Storm配置类型
Storm有大量的配置,可以调整Nimbus、Supervisor、拓扑运行的参数,大部分是可以进行调节的,但是也有少部分配置是不能修改的系统配置。每个配置会有一个默认值,该值定义在Storm代码库的defaults.yaml文件中。在Nimbus和Supervisor的类路径中定义一个storm.yaml文件,可以覆盖这些配置值。使用StormSubmitter提交拓扑的时候,可以定义一个指定拓扑的配置,但是只能覆盖前缀为TOPOLOGY的配置项。
Storm0.7.0以后的版本开始允许在Spout/Bolt中覆盖配置,可以修改的配置主要有:
"topology.debug"
"topology.max.spout.pending"
"topology.max.task.parallelism"
"topology.kryo.register"
注:topology.kryo.register与其他的配置有所不同,它的序列化会应用到拓扑上的所有组件。
Storm的Java API也提供了两种方式指定组件的配置:
1.内部的(Internally)配置
在Spout或者Bolt类中,覆盖getComponentConfiguration方法,返回组件配置的Map对象,getComponentConfiguration方法定义如下:
@Override
public Map getComponentConfiguration() {
// TODO Auto-generated method stub
return null;
}
注:我们只要以Map的形式返回我们所要配置的参数即可。
2.外部的(Externally)配置
使用TopologyBuilder类的setSpout方法返回SpoutDeclarer对象,使用setBolt方法返回BoltDeclarer对象。SpoutDeclarer与BoltDeclarer实现了ComponentConfigurationDeclarer接口,该接口有addConfiguration方法和addConfigurations方法,可以通过调用这两个方法来覆盖组件的配置。
SpoutDeclarer接口的定义代码如下:
public interface SpoutDeclarer extends ComponentConfigurationDeclarer{
}
public interface BoltDeclarer extends InputDeclarer, ComponentConfigurationDeclarer{
}
public interface ComponentConfigurationDeclarer
{
public abstract ComponentConfigurationDeclarer addConfigurations(Map map);
public abstract ComponentConfigurationDeclarer addConfiguration(String s, Object obj);
public abstract ComponentConfigurationDeclarer setDebug(boolean flag);
public abstract ComponentConfigurationDeclarer setMaxTaskParallelism(Number number);
public abstract ComponentConfigurationDeclarer setMaxSpoutPending(Number number);
public abstract ComponentConfigurationDeclarer setNumTasks(Number number);
}
注:我们可以在它的直接口中进行实现相关方法达到设置属性的目的。
既然在那么多个地方的可以配置参数,显然是有个优先级的,优先顺序如下(这个非常重要):
defaults.yaml < storm.yaml < 特定拓扑的配置 < 内部特定组件的配置 < 外部特定组件的配置
在storm的源代码中,文件夹conf下有一个名为defaults.yaml的文件,即conf/defaults.yaml,这个文件记录着所有配置的默认值,详细清单如下:
########### defaults.yaml文件存储的是默认值
###########可以在storm.yaml文件中写入额外的配置
java.library.path: "/usr/local/lib:/opt/local/lib:/usr/lib"
### storm.* 配置是普通的配置
# storm.local.dir是保存jar包的目录
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.* 配置应用于主节点
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.* 配置应用于主节点
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.* 配置应用于Supervisor节点
# 定义可以在本机上运行的工作进程的数量,每个工作进程分配一个通信端口
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
supervisor.childopts: "-Xmx256m"
# Supervisor等待多长时间确保工作进程已经启动
supervisor.worker.start.timeout.secs: 120
# Supervisor认为工作进程死亡并试图进行重启的心跳时间的大小
supervisor.worker.timeout.secs: 30
# Supervisor检查工作进程的状态的频率,Supervisor会在必要时重启工作进程
supervisor.monitor.frequency.secs: 3
# Supervisor到Nimbus的心跳的频率
supervisor.heartbeat.frequency.secs: 5
supervisor.enable: true
### worker.* 配置应用于工作进程的任务
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缓存
storm.messaging.netty.max_retries: 30
storm.messaging.netty.max_wait_ms: 1000
storm.messaging.netty.min_wait_ms: 100
### topology.* 配置应用于具体执行的Storm
topology.enable.message.timeouts: true
topology.debug: false
topology.optimize: true
topology.workers: 1
topology.acker.executors: null
topology.tasks: null
# 消息超时时间,如果超时,消息被认为是失败的
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
topology.executor.send.buffer.size: 1024
topology.receiver.buffer.size: 8 #设置过高会导致很多问题,如心跳线程饿死、吞吐量大幅下跌
topology.transfer.buffer.size: 1024
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_HOME目录下的conf/storm.yaml文件,可以覆盖Storm配置的默认值。Storm.yaml会覆盖defaults.yaml中的任何内容。以下是几个配置是必须要设置的。
1.storm.zookeeper.servers
这是一个为Storm集群服务的Zookeeper集群的主机列表,它的配置应该类似于:
storm.zookeeper.servers:
"liaozhongmin1"
"liaozhongmin2"
"liaozhongmin3"
注:如果你的Zookeeper集群使用的端口和默认的端口不相同,应该也设置"storm.zookeeper.port"的值。
2.storm.local.dir
Nimbus和Supervisor守护进程需要在本地硬盘的一个目录存储少量的状态(如jars、confs等),你应该在每台主机上创建该目录,赋予它适当的权限,然后使用该配置填写目录位置,如下:
storm.local.dir:"/mnt/storm"
这个配置是加载Storm使用的本地库的路径,例如ZeroMQ库和JZMQ库。默认的/usr/local/lib:/opt/local/lib:/usr/lib使用与大多数安装,一般不需要设置此配置。
4.nimbus.host
工作节点为了下载拓扑的jar和confs文件,需要知道哪些主机是主控节点,例如:
nimbus.host:"liaozhongmin1"
对于每个工作节点,可以通过该配置项来设置该节点上运行多少个worker。每个worker使用一个端口接收消息,此设置定义为使用哪些端口是打开的。如果在这里定义5个端口,然后Storm将分配5个Worker在这台主机上运行。如果定义3个端口,Storm只会分配3个worker。此设置默认为在端口6700、6701、6702和6703上配置运行4个worker,如下:
supervisor.slots.ports:
-6700
-6701
-6702
-6703
注:关于storm的属性配置,开头都要保留一个空格,不要用tab键。
Config类
Config类,即backtype.storm.Config,是一个所有配置的清单,一个创建拓扑特定配置的helper类。我们可以通过这个类来设置相关的属性,Config类的setter方法如下:
public void setDebug(boolean isOn)
public void setNumWorkers(int workers)
public void setNumAckers(int numExecutors)
public void setMessageTimeoutSecs(int secs)
public void setKryoFactory(Class klass)
public void setSkipMissingKryoRegistrations(boolean skip)
public void setMaxTaskParallelism(int max)
public void setMaxSpoutPending(int max)
public void setStatsSampleRate(double rate)
public void setFallBackOnJavaSerialization(boolean fallback)