第一步:Zookeeper分布式集群环境的安装与配置
准备环境:
JDK版本:
jdk-7u25-linux-i586.tar.gz
#可以命令下载:
wgethttp://211.149.198.47/data/main/jdk-7u7-linux-i586.tar.gz
kafka版本:kafka_2.9.2-0.8.1.1.tgz
zookeeper版本:zookeeper-3.4.6.tar.gz
#可以命令下载:
wgethttp://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
三个安装文件放在每台服务器的/home/software/下
安装操作系统环境是CentOS6.4 32bit
1. 安装并配置JDK1.7u25-linux-i586
*******************************************************************
1)安装JDK步骤:
创建JDK1.7安装目录:
mkdir /usr/local/java
把JDK安装文件jdk-7u25-linux-i586.tar.gz通过ftp传到该目录下,解压:
tar xzvf ./jdk-7u25-linux-i586.tar.gz-C /usr/local/java
2)配置JDK步骤:
vi /etc/profile
在文件最后添加如下部分:
export JAVA_HOME=/usr/local/java/jdk1.7.0_25
export JAVA_BIN=/usr/local/java/jdk1.7.0_25/bin
exportPATH=$PATH:$JAVA_HOME/bin
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOMEJAVA_BIN PATH CLASSPATH
保存退出后,执行source/etc/profile立即生效
使用java-version确认是否安装成功
*******************************************************************
2. 修改主机名:
1) 修改网络名:
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=T01
修改完成后执行命:
service network restart
使修改生效
2) 修改host name
vi /etc/hosts
[root@slave1 ~]#cat /etc/hosts
#127.0.0.1 localhost localhost.localdomain localhost4localhost4.localdomain4
#::1 localhost localhost.localdomainlocalhost6 localhost6.localdomain6
192.168.2.170 T01
192.168.2.171 T02
192.168.2.172 T03
使修改生效,执行:
service networkrestart
拷贝下面的文件到另外两台机器上:
scp /etc/hostsroot@192.168.2.171:/etc/hosts
scp /etc/hostsroot@192.168.2.172:/etc/hosts
*******************************************************************
出现问题:
scp命令找不到:
# scp
-bash: scp: commandnot found
解决办法:
yum installopenssh-clients
即可
同样的,wget命令找不到,执行:
yum -y install wget
即可
直接删除当前文件夹下所有文件和子文件夹:rm -rf 目录名字
-r 就是向下递归,不管有多少级目录,一并删除
-f 就是直接强行删除,不作任何提示的意思
*******************************************************************
两台Linux主机之间copy文件命令:
scp -r/home/software/ root@192.168.2.171:/home/software/
scp -r root@192.168.2.170:/home/software/ /home/software/
*******************************************************************
3安装zookeeper3.4.6
2.1约定:
将ZooKeeper安装在/home/zookeeper目录,其中/home/zookeeper是指向/home/zookeeper/zookeeper-3.4.6的软链接。
ZooKeeper的数据目录设置为/home/zookeeper/zookeeper-3.4.6/data
mkdir /home/zookeeper/zookeeper-3.4.6/data
2.2设置myid
在dataDir指定的数据目录(/home/zookeeper/zookeeper-3.4.6/data)下,创建文件myid,文件内容为一个正整数值,用来唯一标识当前机器,因此不同机器的数值不能相同,建议从1开始递增标识,以方便记忆和管理。本文约定如下:
可以使用echo命令直接写进去,如:
echo 1 > myid
或:
echo 1 > /home/zookeeper/zookeeper-3.4.6/data/myid
设置完成后,将文件夹zookeeper-3.4.6拷贝到另外两台机器上:
scp -r zookeeper-3.4.6root@192.168.2.171:/home/zookeeper/zookeeper-3.4.6
scp -r zookeeper-3.4.6root@192.168.2.172:/home/zookeeper/zookeeper-3.4.6
2.3创建zookeeper的日志目录
mkdir /home/zookeeper/logs
2.4修改conf/zoo.cfg:
按下述内容,修改ZooKeeper配置文件(3台机器都需要,可以先配置好一台,然后通过scp等命令复制到其它机器上):
*******************************************************************
tickTime=2000
dataDir=/home/zookeeper/zookeeper-3.4.6/data
dataLogDir=/home/zookeeper/logs
clientPort=2181
initLimit=5
syncLimit=2
server.1= T01:2888:3888
server.2= T02:2888:3888
server.3= T03:2888:3888
*******************************************************************
以上内容说明:
以上内容的配置,参照了ZooKeeper的官方文档:zookeeperStarted.html。server.X用来配置ZooKeeper集群中的各节点,并建议X的值和myid保持一致。
端口2181用于监听客户端的连接,端口2888用于Leader监听Follower的连接,而3888则用于Leader选举。
*******************************************************************
配置一台机器后,拷贝到另外两台机器:
scp -r zoo.cfgroot@192.168.2.171:/home/zookeeper/zookeeper-3.4.6/conf
scp -r zoo.cfgroot@192.168.2.172:/home/zookeeper/zookeeper-3.4.6/conf
*******************************************************************
2.5启动ZooKeeper集群:
bin目录下的脚本zkServer.sh用来启动ZooKeeper集群,但需要带一个start参数,命令如下:
cd/home/zookeeper/zookeeper-3.4.6/bin&&./zkServer.shstart
一定注意:
在三台机器上要分别执行上面的启动zookeeper命令
*******************************************************************
说明:
由于启动时,每个节点都会试图去连接其它节点,因此先启动的刚开始会连接不上其它的,导致日志中会包含错误信息,在未全启动之前,这个属正常现象。
*******************************************************************
2.6安装验证:
脚本zkServer.sh不但可以用来启动ZooKeeper,还可以用来查看状态。使用方式为带一个status参数:
cd/home/zookeeper/zookeeper-3.4.6/bin&&./zkServer.shstatus
*******************************************************************
说明:如遇到以下错误,请稍安勿躁,过会再试,可能是因为还未完全起来:
[hadoop@DEVNET-154-77~/zookeeper/bin]$ ./zkServer.sh status
JMX enabled bydefault
Using config:/data/hadoop/zookeeper/bin/../conf/zoo.cfg
Error contactingservice. It is probably not running.
注意:
此时可以直接执行命令【tailf zookeeper.out】查看打印的日志信息,如果有错误如下:
WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@382] - Cannotopen channel to 2 at election address Slave1/192.168.2.171:3888
java.net.NoRouteToHostException:No route to host
可能此时另外两台机器的防火墙未关闭,执行命令查看防火墙状态:
/etc/init.d/iptables status
此时执行命令关闭防火墙:
重启后永久性生效:
开启:chkconfigiptables on
关闭:chkconfigiptables off
然后执行/etc/init.d/iptablesrestart重启
查看防火墙状态:
/etc/init.d/iptables status
暂时关闭防火墙:
/etc/init.d/iptables stop
禁止防火墙在系统启动时启动
/sbin/chkconfig --level 2345 iptables off
重启iptables:
/etc/init.d/iptables restart
1) 重启后生效
开启: chkconfigiptables on
关闭: chkconfig iptables off
2) 即时生效,重启后失效
开启: serviceiptables start
关闭: serviceiptables stop
集群成功启动后,将有且只会有一个成为leader,其它是follower:
[hadoop@Master~/zookeeper/bin]$ ./zkServer.sh status
JMX enabled bydefault
Using config:/data/hadoop/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[hadoop@Slave1~/zookeeper/bin]$ ./zkServer.sh status
JMX enabled bydefault
Using config:/data/hadoop/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[hadoop@Slave2~/zookeeper/bin]$ ./zkServer.sh status
JMX enabled bydefault
Using config:/data/hadoop/zookeeper/bin/../conf/zoo.cfg
Mode: follower
*******************************************************************
查看状态:
cd/home/zookeeper/zookeeper-3.4.6/bin&&./zkServer.shstatus
查看启动日志:
tailf zookeeper.out
*******************************************************************
ZooKeeper参考链接
下面是我整理搜集的有关ZooKeeper相关内容的网址,可以学习参考。
中文链接:
http://agapple.iteye.com/blog/1111377
http://agapple.iteye.com/blog/1112032
http://agapple.iteye.com/blog/1292129
http://agapple.iteye.com/blog/1184023
http://agapple.iteye.com/blog/1184040
http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
http://luzengyi.blog.163.com/blog/static/529188201064113744373/
http://luzengyi.blog.163.com/blog/static/529188201061155444869/
http://rdc.taobao.com/team/jm/archives/tag/zookeeper
http://rdc.taobao.com/team/jm/archives/947
http://rdc.taobao.com/blog/cs/?p=162
http://rdc.taobao.com/blog/cs/?p=261
http://rdc.taobao.com/team/jm/archives/448
英文链接:
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
http://zookeeper.apache.org/doc/r3.3.2/zookeeperOver.html
http://zookeeper.apache.org/doc/r3.3.2/recipes.html
http://zookeeper.apache.org/doc/trunk/
http://wiki.apache.org/hadoop/ZooKeeper/Tutorial
http://wiki.apache.org/hadoop/ZooKeeper/FAQ
http://wiki.apache.org/hadoop/ZooKeeper/Troubleshooting
*******************************************************************
至此,zookeeper分布式集群环境搭建和配置完成,测试通过!
======================================================================
第二步:Kafka分布式集群环境的安装与配置
1. 下载Kafka 2.9.2-0.8.1.1
通过下面命令下载到指定目录下:
wget https://www.apache.org/dyn/closer.cgi?path=/kafka/0.8.1.1/kafka_2.9.2-0.8.1.1.tgz
2. 在home目录下建立kafka目录
mkdir /home/kafka
3. 文件通过ftp上传至目录/home/kafka,或者用wget下载到目录/home/kafka下,然后解压安装包:
tar -xzvf kafka_2.9.2-0.8.1.1.tgz
4. 创建logs目录:
mkdir /home/kafka/logs
5. 修改配置文件server.properties:
vi /home/kafka/kafka_2.9.2-0.8.1.1/config
*********************************************************************
broker.id=1
port=9092
host.name= 192.168.2.170
advertised.host.name=192.168.2.170
num.network.threads=2
num.io.threads=8
log.dirs=/home/kafka/logs
num.partitions=2
zookeeper.connect =192.168.2.171:2181,192.168.2.172:2181, 192.168.2.173:2181
scp -rserver.properties root@192.168.2.171:/home/kafka/kafka_2.9.2-0.8.1.1/config
scp -r server.propertiesroot@192.168.2.172:/home/kafka/kafka_2.9.2-0.8.1.1/config
*********************************************************************
6. 修改配置文件producer.properties:
vi/home/kafka/kafka_2.9.2-0.8.1.1/config/producer.properties
*********************************************************************
metadata.broker.list=192.168.2.170:9092,192.168.2.171:9092,192.168.2.172:9092
producer.type=sync
compression.codec=none
serializer.class=kafka.serializer.DefaultEncoder
*********************************************************************
7. 修改配置文件consumer.properties:
vi/home/kafka/kafka_2.9.2-0.8.1.1/config/consumer.properties
*********************************************************************
zookeeper.connect=192.168.2.170:2181,192.168.2.171:2181,192.168.2.172:2181
zookeeper.connection.timeout.ms=1000000
group.id= consumer-group-01
consumer.timeout.ms=30000
*********************************************************************
8. 配置/etc/profile下的kafka全局目录:
vi /etc/profile
*********************************************************************
# jdk, zookeeper,kafka
exportJAVA_HOME=/usr/local/java/jdk1.7.0_25
export JAVA_BIN=/usr/local/java/jdk1.7.0_25/bin
exportKAFKA_HOME=/home/kafka/kafka_2.9.2-0.8.1.1
exportZK_HOME=/home/zookeeper/zookeeper-3.4.6
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
exportPATH=$JAVA_HOME/bin:$KAFKA_HOME/bin:$ZK_HOME/bin:$PATH
*********************************************************************
执行命令source/etc/profile使修改生效。
9. 启动Kafka
进入目录/home/kafka/kafka_2.9.2-0.8.1.1,执行下面命令,启动kafka:
cd /home/kafka/kafka_2.9.2-0.8.1.1
bin/kafka-server-start.shconfig/server.properties &
或者:
cd/home/kafka/kafka_2.9.2-0.8.1.1/bin&&./kafka-server-start.sh../config/server.properties &
如果报错如下:
**********************************************************************
Unrecognized VMoption 'UseCompressedOops'
Error: Could notcreate the Java Virtual Machine.
Error: A fatalexception has occurred. Program will exit.
**********************************************************************
解决办法:
查看bin/kafka-run-class.sh,找到
if [ -z"$KAFKA_JVM_PERFORMANCE_OPTS" ]; then
KAFKA_JVM_PERFORMANCE_OPTS="-server
-XX:+UseCompressedOops
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSScavengeBeforeRemark
-XX:+DisableExplicitGC-Djava.awt.headless=true"
fi
删除-XX:+UseCompressedOops,重新启动kafka即可。
**********************************************************************
10. 创建一个Topic(replication-factor=num ofbrokers)
进入kafka目录
cd /home/kafka/kafka_2.9.2-0.8.1.1
执行下面命令,创建一个名称为test的topic:
bin/kafka-topics.sh--create --topic jack-topic --replication-factor 3 --partitions 2 --zookeeper 192.168.2.170:2181
11. 查看Topic:
bin/kafka-topics.sh--list --zookeeper 192.168.2.171:2181
12. 查看Topic详细信息:
说明:
Kafka_2.9.2不支持查看Topic详细信息,但Kafka_2.10支持查看详情:
bin/kafktopics.sh--describe --zookeeper 192.168.2.171:2181
13. T02(192.168.2.171)模拟Producer,在上面开一个终端,发送消息至kafka:
bin/kafka-console-producer.sh--broker-list 192.168.2.171:9092 --sync --topic jack-topic
执行此命令时,如果出现下面错误提示,则需要下载SLF4J的jar包:
**********************************************************************
SLF4J: Failed toload class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaultingto no-operation (NOP) logger implementation
SLF4J: Seehttp://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
**********************************************************************
因为我使用的是kafka版本是2.9.2,对应的slf4j-nop jar版本是1.7.2,因此我需要下载jar包slf4j-nop-1.7.2.jar到目录/home/kafka/kafka_2.9.2-0.8.1.1/libs下,
下载jar地址:http://grepcode.com/snapshot/repo1.maven.org/maven2/org.slf4j/slf4j-nop/1.7.2
在发送消息的终端输入:
Hello Kafka
Test kafka
如图:
T03模拟Consumer,接收T02发出的消息:
bin/kafka-console-consumer.sh--zookeeper 192.168.2.172:2181 --topic jack-topic --from-beginning
实时接收Producer发的消息,如图: