前言
有時會需要安裝開源的大數據集群進行測評或者驗證問題,已經裝過很多遍了,所以想系統的總結整理一下各個組件的安裝部署,包括 Zookeeper、Hadoop、Hive、Spark 等。
版本
- Zookeeper 3.5.6 3.8.4 3.9.3
初始化
包括主機名修改、SSH互信、JDK安裝等
SSH互信
# 每個節點
ssh-keygen -t rsa# 從 1節點執行,傳到2
# 從 2節點執行,傳到3
# 從 n-1節點執行,傳到n
# 從 n節點執行,傳到1
# 將 1節點authorized_keys傳到其他所有節點
cd ~/.ssh
cat id_rsa.pub>>authorized_keys
scp authorized_keys 192.168.1.2:~/.ssh/
下載Zookeeper
下載地址:https://archive.apache.org/dist/zookeeper/
解壓
以 3.5.6 為例:
tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz -C /usr/local/
ln -s /usr/local/apache-zookeeper-3.5.6-bin /usr/local/zookeeper
配置環境變量
vi /etc/profile.d/zookeeper.sh
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile.d/zookeeper.sh
配置Zookeeper
zoo.cfg
cd /usr/local/zookeeper/conf/
vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/dataLog
# 事務日志文件數保留的蜀門,默認為3
autopurge.snapRetainCount=3
# 事務日志清理頻率,單位是小時。需要填寫一個1或更大的整數,默認是0,表示不開啟自己清理功能。
autopurge.purgeInterval=1
clientPort=2181
# 這里IP可以改為對應的hostname
server.1=192.168.1.1:2888:3888
server.2=192.168.1.2:2888:3888
server.3=192.168.1.3:2888:3888
創建數據目錄
mkdir -p /usr/local/zookeeper/data
mkdir -p /usr/local/zookeeper/dataLog
echo "1" > /usr/local/zookeeper/data/myid
dataDir
- 核心作用:存儲 ZooKeeper 的快照數據(snapshot) 和事務日志索引。
- 快照數據:ZooKeeper 會定期將內存中的數據狀態(如節點、權限等)持久化到快照文件中,用于快速恢復數據。快照文件通常以 snapshot.xxxx 命名(xxxx 為事務 ID)。
- 其他元數據:包括集群成員信息、myid 文件(用于標識當前節點在集群中的 ID,僅在集群模式下存在)等。
- 特點:
- 快照數據是內存數據的周期性備份,并非實時更新,因此不能單獨作為數據恢復的唯一依據,需要配合事務日志使用。
- 該目錄是 ZooKeeper 運行的必填目錄,必須在配置文件(zoo.cfg)中指定。
dataLogDir
- 核心作用:專門存儲 ZooKeeper 的事務日志(transaction log)。
- 事務日志記錄了 ZooKeeper 處理的所有寫操作(如創建節點、修改數據等),是實時追加的,每一次事務操作都會被立即寫入日志,確保數據的一致性和可恢復性。
- 特點:
- 事務日志是 ZooKeeper 數據一致性的關鍵,恢復數據時需先通過事務日志重演所有操作,再結合快照數據補充最新狀態。
- 該目錄是可選配置(若不指定,事務日志會默認存儲在 dataDir 中),但強烈建議單獨設置,原因是:
- 事務日志的寫入頻率遠高于快照,單獨存儲可減少磁盤 IO 競爭,提升性能。
- 便于日志管理(如單獨備份、清理過期日志)。
配置日志
主要是修改了默認的日志路徑,也可以用默認的日志配置
修改 zkEnv.sh
vi /usr/local/zookeeper/bin/zkEnv.sh
將
if [ "x${ZOO_LOG_DIR}" = "x" ]
thenZOO_LOG_DIR="$ZOOKEEPER_PREFIX/logs"
fiif [ "x${ZOO_LOG4J_PROP}" = "x" ]
thenZOO_LOG4J_PROP="INFO,CONSOLE"
fi
修改為
if [ "x${ZOO_LOG_DIR}" = "x" ]
thenZOO_LOG_DIR="/var/log/zookeeper"
fiif [ "x${ZOO_LOG4J_PROP}" = "x" ]
thenZOO_LOG4J_PROP="INFO,CONSOLE,ROLLINGFILE"
fi
- ZOO_LOG4J_PROP : 可以根據需要選擇是否保留CONSOLE,設置日志級別等, 3.8 和 3.9 版本沒有這個屬性可以忽略
創建日志目錄
每個節點都執行:
mkdir -p /var/log/zookeeper
log4j.properties
3.8 和 3.9 版本默認沒有 log4j.properties ,可以根據需要選擇是否添加:
# DEFAULT: console appender only
log4j.rootLogger=WARN, CONSOLE, ROLLINGFILE# Example with rolling log file and tracing
#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE# Log INFO level and above messages to the console
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=WARN
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n# Add ROLLINGFILE to rootLogger to get log file output
# Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=DEBUG
log4j.appender.ROLLINGFILE.File=/var/log/zookeeper/zookeeper.log
# Max log file size of 10MB
log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# uncomment the next line to limit number of backup files
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n# Add TRACEFILE to rootLogger to get log file output
# Log DEBUG level and above messages to a log file
log4j.appender.TRACEFILE=org.apache.log4j.FileAppender
log4j.appender.TRACEFILE.Threshold=TRACE
log4j.appender.TRACEFILE.File=zookeeper_trace.loglog4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout
### Notice we are including log4j's NDC here (%x)
log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} - %-5p [%t:%C{1}@%L][%x] - %m%n
復制Zookeeper和系統環境變量到其他節點
scp -r /usr/local/apache-zookeeper-3.5.6-bin/ 192.168.1.2:/usr/local/
scp -r /usr/local/apache-zookeeper-3.5.6-bin/ 192.168.1.3:/usr/local/
scp /etc/profile.d/zookeeper.sh 192.168.1.2:/etc/profile.d/
scp /etc/profile.d/zookeeper.sh 192.168.1.3:/etc/profile.d/
創建軟鏈接并使環境變量生效
在其他每個節點上都創建軟鏈接
ln -s /usr/local/apache-zookeeper-3.5.6-bin /usr/local/zookeeper
source /etc/profile.d/zookeeper.sh
修改myid文件內容
將2節點上ZooKeeper的myid文件內容修改為數字2:
echo "2" > /usr/local/zookeeper/data/myid
將3節點上ZooKeeper的myid文件內容修改為數字3:
echo "3" > /usr/local/zookeeper/data/myid
啟動ZooKeeper
在每個節點上執行如下操作啟動ZooKeeper:
zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
在每個節點上執行如下命令查看ZooKeeper狀態:
zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
或
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follow
驗證ZooKeeper
當ZooKeeper服務啟動成功之后,在任意一個節點上執行如下命令進行驗證:
zkCli.shConnecting to localhost:2181
Welcome to ZooKeeper!
JLine support is enabledWATCHER::WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] create /hello world
Created /hello
[zk: localhost:2181(CONNECTED) 2] get /hello
world
[zk: localhost:2181(CONNECTED) 3] ls /
[hello, zookeeper]
[zk: localhost:2181(CONNECTED) 4] set /hello new-world
[zk: localhost:2181(CONNECTED) 5] get /hello
new-world
[zk: localhost:2181(CONNECTED) 6] delete /hello
[zk: localhost:2181(CONNECTED) 7] ls /
[zookeeper]
zkCli.sh 默認連接 localhost:2181 ,也可以連接指定的 server 如:
zkCli.sh -server 192.168.1.2:2181
Connecting to 192.168.1.2:2181
Welcome to ZooKeeper!
JLine support is enabledWATCHER::WatchedEvent state:SyncConnected type:None path:null
[zk: 192.168.1.2:2181(CONNECTED) 0]