第一步: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/[email protected]:/etc/hosts
scp /etc/[email protected]:/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/ [email protected]:/home/software/
scp -r [email protected]:/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 [email protected]:/home/zookeeper/zookeeper-3.4.6
scp -r [email protected]:/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 [email protected]:/home/zookeeper/zookeeper-3.4.6/conf
scp -r [email protected]:/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 [email protected]:/home/kafka/kafka_2.9.2-0.8.1.1/config
scp -r [email protected]:/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發的消息,如圖: