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<String, Object> 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{
}



BoltDeclarer接口的定义代码如下:

public interface BoltDeclarer extends InputDeclarer, ComponentConfigurationDeclarer{
}



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 < 特定拓扑的配置 < 内部特定组件的配置 < 外部特定组件的配置



defaults.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.yaml文件

修改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"



3.java.library.path

这个配置是加载Storm使用的本地库的路径,例如ZeroMQ库和JZMQ库。默认的/usr/local/lib:/opt/local/lib:/usr/lib使用与大多数安装,一般不需要设置此配置。


4.nimbus.host

工作节点为了下载拓扑的jar和confs文件,需要知道哪些主机是主控节点,例如:

nimbus.host:"liaozhongmin1"



5.supervisor.slots.ports

对于每个工作节点,可以通过该配置项来设置该节点上运行多少个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)