系统环境
-
安装环境为GNU/Linux 2.6.32 x64。
-
需要为每台设置好hostname,并在/etc/hosts配置好集群中每台机器的hostname与ip的关系。
-
确认集群里每台机器互相之间都是可以访问的,取消端口的限制。
注:以下命令行输入的命令没有加sudo,可自己酌情添加。
Storm集群包含以下组件
-
zookeeper
-
kafka
-
storm
三者都运行在JVM里,所以需要先安装Java环境。
Java环境
官方推荐使用Java6,安装过程略,需在~/.bashrc中配置好JAVA_HOME,并在PATH中追加JAVA_HOME/bin。
Python环境
Storm需要Python2.6.6以上的环境,一般都有预装,如果没有可以使用yum安装或者通过源码进行安装。
Zookeeper环境
kafka和storm都高度依赖Zookeeper,所以先部署他。
版本
官方建议配一个3台机器的集群,使用的是3.3.6稳定版。
准备
下载后解压,假设解压到/usr/local/zookeeper,设置一个环境变量$ZK_HOME指向这个目录。
配置
进入$ZK_HOME/conf目录,创建配置文件zoo.cfg,如下所示:
tickTime=2000
dataDir=your path
clientPort=2181
initLimit=5
syncLimit=2
server.1=机器1的hostname:2888:3888
server.2=机器2的hostname:2888:3888
server.3=机器3的hostname:2888:3888
本文后续章节会对这些参数进行详细的介绍,这里只是简单说几点:集群中的每台机器都需要感知整个集群是由哪几台机器组成的,在配置文件中,可以按照这样的格式,每行写一个机器配置: server.id=host:port:port. 关于这个id,我们称之为Server ID,用来标识该host在集群中的机器序号。在每个ZooKeeper机器上,我们都需要在数据目录(数据目录就是dataDir参数指定的那个目录)下创建一个myid文件,该文件只有一行内容,并且是一个数字——对应这个 Server ID数字。
在ZooKeeper的设计中,集群中所有机器上的zoo.cfg文件的内容都是一致的。
关于myid文件。myid文件中只有一个数字,即一个Server ID。例如,server.1 的myid 文件内容就是”1“。注意,请确保每个server的myid文件中id数字不同,并且和s erver.id=host:port:port中的id一致。另外,id的范围是1~255。
在其他2台机器也进行上述的操作,唯一的不同是myid中的数字。
如果要设置JVM参数,可以在$ZK_HOME/conf/java.env进行配置,例如:
export JVMFLAGS="-Xms2048m -Xmx2048m $JVMFLAGS"
zk使用log4j输出日志,默认输出到控制台上,可以到 $ZK_HOME/conf/log4j.properties中进行修改。
启动集群
分别执行$ZK_HOME/bin/zkServer.sh start启动。其中还有许多其他命令可具体参考其他文档。使用echo stat|nc ip port命令可验证集群的状态。
其他说明
有一些配置需要特别提一下:
maxClientCnxns单个客户端与单台服务器之间的连接数的限制,是ip级别的,这个值设置太小集群无法正常工作。设置为0代表无限制,其实就差不多了。其他配置在运维篇中会详细描述。
Kafka环境
一开始其实只需要配置一台kafka就可以了,因为kafka是无中心结构的,每个节点的地位都是一样的,节点之间通过zk进行互相发现和交互。加入一个新节点只需要启动节点进程,会自动向 zk报告自己的存在,这样集群中的其他节点也会知道了。不过这里假设配置的是多节点的集群。
版本
kafka_2.9.2-0.8.1版本
准备
下载后解压,假设解压到/usr/local/kafka,设置一个环境变量$KAFKA_HOME指向这个目录。
配置
修改$KAFKA_HOME/conf/server.properties配置文件,里面已有一些配置,下面选一个些重点的来说:
broker.id表示集群的一个节点的唯一表示,用一个数字表示。
log.dirs代表数据的持久化的目录,kafka不使用内存,而是直接持久化到硬盘,利用的是操作系统本身的缓存机制进行缓存,所以这个目录很重要。
log.retention.hours代表数据要保留多少个小时,超过这个时间会被自动删除。消费者即使从 kafka中取走了数据,但kafka也不会马上删除,而是过期了再删除。
zookeeper.connect表示与kafka进行通讯的zk集群,这个也很重要。
其他命令请参考官方文档。
kafka也是使用了log4j打日志,到$KAFKA_HOME/conf/log4j.properties修改即可。
修改kafka的JVM参数可以在$KAFKA_HOME/bin/kafka-server-start.sh中修改:
export KAFKA_HEAP_OPTS="-Xmx4G -Xms4G 等等"
启动集群
$KAFKA_HOME/bin/kafka-server-start.sh为启动命令,其他命令请参考官方文档。
如果有多个节点请分别在节点上启动。
启动后进程工作在前台,如果要设成daemon请使用nohup命令并在命令最后加上&。
在任意一个节点中输入命令来创建一个topic(队列)进行验证。
$/KAFKA_HOME/bin/kafka-topics.sh --create --topic first_topic --zookeeper 你的ZK集群IP:PORT --partitions 1 --replication-factor 1
如果输出Created topic "first_topic".则表示OK。
Storm环境
storm集群中的节点角色分为nimbus(监控和分派任务)和supervisor(任务具体调度)两种,一般一台主机只扮演其中的一种角色,要都在一起也可以,不过最好是要保持nimbus的安全,因为nimbus有单点故障的危险。这里假设都在一台机器上,分开的话过程也是一样的。
版本
apache-storm-0.9.1-incubating版本
准备
下载后解压,假设解压到/usr/local/storm,设置一个环境变量$STORM_HOME指向这个目录。
配置
修改$STORM_HOME/conf/storm.yaml,不管是nimbus还是supervisor都是一样的配置。对其中一些重要的配置进行说明:
storm.local.dir: "your path",这是storm的各个节点存储一些本地数据的路径,比如说上传的topology和它的JAR文件等等。
storm.zookeeper.servers:
-
"zk1 ip : port"
-
"zk2 ip : port"
-
…
代表zk集群的地址。
nimbus.host: "nimbus ip",代表nimbus节点的ip。
supervisor.slots.ports:
- 46700
- 46701
- 46702
…
代表supervisor节点可以启动的worker子进程的个数,其中的数字代表worker节点用来通信的本地端口号。默认是4个。
各个节点和worker的JVM参数可以分别配置,例如:
nimbus.childopts: "-Xmx2048m"
supervisor.childopts: "-Xmx2048m"
worker.childopts: "-Xmx2024m"
更多配置默认参数请参见官方文档,在这里可以看到默认配置:
https://github.com/apache/incubator-storm/blob/master/conf/defaults.yaml
启动集群
在nimbus节点中启动:
$STORM_HOME/bin/storm nimbus
在supervisor节点中启动:
$STORM_HOME/bin/storm supervisor
随意一个节点可以启动一个web后台程序,可以监控集群和拓扑的性能:
$STORM_HOME/bin/storm ui
上述启动的所有进程工作在前台,如果要设成daemon请使用nohup命令并在命令最后加上&。
最后在浏览器中输入地址:
http://{运行ui后台程序的进程ip}:8080
如果可以看到类似下面的页面就表示部署成功了: