本节书摘来自华章计算机《Storm企业级应用:实战、运维和调优》一书中的第2章,第2.1节,作者:马延辉 陈书美 雷葆华著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.1 环境准备
在安装Storm的之前要做一些准备工作,这涉及操作系统设置、ZooKeeper集群的管理以及Storm安装之前的一些依赖库。下面将介绍Storm的系统配置、协调器ZooKeeper等。
2.1.1 系统配置
在Linux上安装Storm之前,需要先做如下准备:
安装JDK 1.6。
安装SSH服务。
安装Python 2.6.6解释器。
1.?安装JDK 1.6
与Hadoop、HBase相同,Storm也需要JDK 1.6或者更高的版本。下面介绍安装JDK 1.6的具体步骤。
(1)下载JDK 1.6
从Java的官网,目前是Oracle公司的产品下载JDK,本书使用JDK的SE版本,从http://www.oracle.com/technetwork/java/javase/downloads/
中下载JDK 1.6的安装包,注意要下载适应当前系统的JDK版本,一般是64位版本的JDK。
JDK 1.6版本的u18以及旧版本,不要下载,这些版本的垃圾回收操作容易遇到JVM碰撞问题。
(2)手动安装JDK 1.6
进入JDK安装目录(假设安装在/usr/lib/jvm/jdk)后,开始安装JDK,具体操作代码如下:
#修改权限
sudo chmod u+x jdk-***-linux-i586.bin
#安装
sudo -s ./jdk-***-linux-i586.bin
(3)配置环境变量
安装结束后,开始配置环境变量JAVA_HOME和CLASSPATH,修改指令如下:
vi /etc/prof?ile
进入prof?ile文件后,在文件下面输入如下内容:
#set JAVA Environment
export JAVA_HOME=/usr/lib/jvm/jdk
export ClASSPATH=".:$JAVA_HOME/lib:$CASSPATH"
export PATH="$JAVA_HOME:$PATH"
修改完环境变量后,验证JDK是否安装成功,输入如下命令:
java -version
如果出现Java版本信息,则说明安装成功。
2.?安装SSH服务
Storm集群模式的启动、关闭以及ZooKeeper集群需要SSH服务,所以使用的操作系统要安装此服务。
(1)安装SSH
确认节点可以连接Internet,执行如下命令检查SSH服务。
sudo ps –ef |grep ssh
如果没有ssh进程,则执行如下命令安装SSH服务。
sudo yum install openssh
(2)查看安装情况
执行下面命令查看SSH安装的版本。
ssh -version
执行之后如果出现如下信息,则表明安装已经成功。
OpenSSH_4.3p2, OpenSSL 0.9.8e-f?ips-rhel5 01 Jul 2008
Bad escape character 'sion'.
查看服务状态命令如下:
service sshd status
3.?安装Python 2.6.6
在安装Python之前,Linux系统中其实已经有了Python解释器,但如果版本太低,需要重新安装Python。
Python是Storm最底层的依赖,需要使用下面的命令下载并安装Python 2.6.6。
wget http:// www.python.org/ftp/python/2.6.6/Python-2.6.6.tar.bz2
tar –jxvf Python-2.6.6.tar.bz2
cd Python-2.6.6
./conf?igure
make
make install
安装完成后,需要使用命令测试Python 2.6.6是否安装成功。如果安装成功,则命令和结果如下:
python -V
Python 2.6.6
2.1.2 安装ZooKeeper集群
由于HBase、Kafka和Storm都使用ZooKeeper集群,大多数情况下,单个节点的ZooKeeper集群可以单独胜任这些应用,但是为了确保故障恢复或者部署大规模集群,可能需要更大规模节点的ZooKeeper集群,官方推荐的最小节点数为3。所以,本案例使用test1、test2和test3三台节点部署ZooKeeper,每个节点上都需要安装,下面介绍具体的安装部署过程。
1.?下载官方源码
从镜像网站下载ZooKeeper包,并将其解压安装,具体操作代码如下:
#下载、解压
wget http:// mirror.bjtu.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
mkdir -p /opt/modules
mv zookeeper-3.4.6.tar.gz /opt/modules/
tar -zxvf zookeeper-3.4.6.tar.gz
ln -s /opt/modules/zookeeper-3.4.6 /opt/modules/zookeeper
#日志路径,配置文件用
mkdir -p /var/log/zookeeper
mkdir /tmp/zookeeper
2.?配置ZooKeeper属性文件
根据ZooKeeper集群节点情况,创建ZooKeeper配置文件conf/zoo.cfg后,将基本配置添加到配置文件中。
(1)配置服务器核心属性
使用复制命令生成配置文件,代码如下:
cd conf
cp zoo_sample.cfg zoo.cfg
然后将下面的代码追加到配置文件zoo.cfg中:
tickTime=2000
clientPort=2181
initLimit=5
syncLimit=2
server.1=test1:2888:3888
server.2=test2:2888:3888
server.3=test3:2888:3888
其中,每项参数的含义如下:
tickTime:这个时间是作为ZooKeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每隔tickTime时间发送一个心跳。
clientPort:这个端口就是客户端连接ZooKeeper服务器的端口,ZooKeeper会监听这个端口,接受客户端的访问请求。
initLimit:这个配置项用来配置ZooKeeper接受客户端(这里所说的客户端不是用户连接ZooKeeper服务器的客户端,而是ZooKeeper服务器集群中连接到Leader的Follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过5个心跳的时间(也就是tickTime)长度后,ZooKeeper服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是5×2000ms=10s。
syncLimit:这个配置项标识Leader与Follower之间发送消息、请求和应答时间,最长不能超过多少个tickTime的时间长度,总的时间长度就是2×2000ms=4s。
server.A=B:C:D:其中A是一个数字,表示这个是第几号服务器;B是这个服务器的IP地址;C表示这个服务器与集群中的Leader服务器交换信息的端口;D表示万一集群中的Leader服务器挂了,需要一个端口来重新选举出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于B都是相同的,所以不同的ZooKeeper实例通信端口号不能相同,要给它们分配不同的端口号。
接下来,添加myid文件,在dataDir目录(默认是/tmp/zookeeper)下创建myid文件,此文件中只包含一行,且内容为ZooKeeper部署节点对应的server.id中的ID编号。例如,test1、test2和test3分别对应的myid文件中的值是1、2和3。节点test1的myid文件的操作代码如下:
#创建文件myid
vi /tmp/zookeeper/myid
#将下面的数字添加到文件中
1
(2)配置日志打印属性
在默认情况下,日志放到当前目录下的zookeeper.out文件中,而在一般情况下需要将日志输出到指定的文件路径下,以便于查看收集和日志。下面的操作都是在ZooKeeper的安装主目录下进行。
首先,修改bin/zkEnv.sh,将下面代码添加到脚本主体的开头部分:
ZOO_LOG_DIR=/var/log/zookeeper
在默认情况下,日志输出到CONSOLE,关闭ROLLINGFILE。在生产环境中,需要将日志输出到ROLLINGFILE,并修改日志级别为INFO。这些配置项通过修改conf/log4j.properties实现,具体代码如下:
.log.dir=.
zookeeper.tracelog.dir=.
将上面对应的代码修改为下面的内容:
zookeeper.log.dir=/var/log/zookeeper
zookeeper.tracelog.dir=/var/log/zookeeper
将下面的代码使用#注释掉:
log4j.rootLogger=${zookeeper.root.logger}
将下面代码最前面的#去掉:
#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE
同时修改文件的权限,因为需要用hadoop用户启动,将所有ZooKeeper相关的文件目录的所有者和组都修改为hadoop:hadoop,代码如下:
chown -R hadoop:hadoop /opt/modules/zookeeper*
chown -R hadoop:hadoop /var/log/zookeeper
chown -R hadoop:hadoop /tmp/zookeeper
3.?启动ZooKeeper集群
登录test1、test2和test3三个节点,进入ZooKeeper安装主目录,执行下面的命令:
su hadoop
bin/zkServer.sh start
使用下面的ZooKeeper客户端命令可以测试服务是否可用。
bin/zkCli.sh -server 127.0.0.1:2181
如果安装并启动成功,则执行上面的命令进入交互终端后,输入help命令会得到如下的打印信息:
[zk: 127.0.0.1:2181(CONNECTED) 1] help
ZooKeeper -server host:port cmd args
connect host:port
get path [watch]
ls path [watch]
set path data [version]
rmr path
delquota [-n|-b] path
quit
printwatches on|off
create [-s] [-e] path data acl
stat path [watch]
close
ls2 path [watch]
history
listquota path
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version]
setquota -n|-b val path
[zk: 127.0.0.1:2181(CONNECTED) 2] ls /
[kafkastorm, consumers, storm, hbase, brokers, zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 3]
其中,[zk: 127.0.0.1:2181 (CONNECTED) 2]前缀表示已经成功连接ZooKeeper,help命令表示查看当前交互客户端支持的命令,ls /命令表示查看当前ZooKeeper的根目录结构。
在ZooKeeper运行过程中,会在dataDir目录下生成很多日志和快照文件,而ZooKeeper运行进程并不负责定期清理合并这些文件,导致占用大量磁盘空间。因此,需要通过Cronjob等方式定期清除过期的日志和快照文件。