大資料(六) --高可用完全分散式搭建
說明
搭建之前, 先根據HDFS三種模式一文將叢集的初始環境配置OK.
高可用完全分散式搭建
叢集規劃
NN(active) | NN(standby) | DN | ZK | ZKFC | JNN | |
---|---|---|---|---|---|---|
node01 | √ | – | – | – | √ | √ |
node02 | – | √ | √ | √ | √ | √ |
node03 | – | – | √ | √ | – | √ |
node04 | – | – | √ | √ | – | – |
- 在node01節點上將上傳的Hadoop壓縮包解壓
這裡我將檔案解壓到/opt/software/hadoop資料夾下.
tar -zxf hadoop-2.6.5.tar.gz -C /opt/software/hadoop
進入配置檔案修改目錄
cd /opt/software/hadoop/hadoop-2.6.5/etc/hadoop/
- 修改hdfs-site.xml配置
vim hdfs-site.xml
編輯檔案, 在configuration標籤對中插入:
<property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>node01:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node02:8020</value> </property> <!-- --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>node01:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>node02:50070</value> </property> <!-- --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value> </property> <!-- --> <property> <name>dfs.journalnode.edits.dir</name> <value>/var/sxt/hadoop/ha/jn</value> </property> <!-- --> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- -->
- 修改core-site.xml配置
vim core-site.xml
編輯檔案, 在configuration標籤對中插入
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>node02:2181,node03:2181,node04:2181</value> </property>
其中fs.defaultFS配置的是hdfs檔案目錄的字首, 此處的mycluster為hdfs-site.xml中配置的叢集服務名.
ha.zookeeper.quorum配置的是叢集協調服務程序zookeeper.
- 修改slaves配置檔案
vim slaves
編輯slaves, 在檔案中寫入:
node02
node03
node04
slaves中配置的是從節點(DataNode)主機名(hostname), 高可用完全分散式, 我們設計的也是三個DN節點.
在編輯檔案時, 要注意縱向寫的格式, 主機名後也不可以帶空格, 否則可能會導致主機解析失敗.
- 安裝包分發
根據上述步驟配置好之後, 需要將配置好的檔案發到其他三個節點上.
cd /opt/software/hadoop 將hadoop下的hadoop-2.6.5包傳送
scp -r hadoop-2.6.5 [email protected]:/opt/software/hadoop/
scp -r hadoop-2.6.5 [email protected]:/opt/software/hadoop/
scp -r hadoop-2.6.5 [email protected]:/opt/software/hadoop/
或使用一種更簡單的指令
scp -r hadoop-2.6.5 node02:`pwd`
scp -r hadoop-2.6.5 node03:`pwd`
scp -r hadoop-2.6.5 node04:`pwd`
傳送時, 如果其他節點上沒有/opt/software/hadoop/目錄, 那麼需要自己建立之後再發送. 傳送完畢之後要保證所有節點的hadoop目錄所在路徑都是一致的.
- 修改hadoop-evn.sh檔案
此步可先跳過, 該檔案可以不修改. 當啟動hdfs出現" JAVA_HOME cannot find or set" 類似的說明java_home沒有配置的提示時, 可再手動配置(前提是執行java -version成功在顯示器列印java版本).
vim hadoop-evn.sh
編輯檔案, 找到export JAVA_HOME=${JAVA_HOME}那一行
將 = 後的內容改為JAVA_HOME的確切路徑, 可使用 echo $JAVA_HOME檢視
export JAVA_HOME=/usr/local/jdk1.8.0_181
修改完成之後還要使用scp命令將修改的檔案傳送到各個節點上:
scp hadoop-evn.sh node02:`pwd`
scp hadoop-evn.sh node03:`pwd`
scp hadoop-evn.sh node04:`pwd`
- 將hadoop配置到使用者環境變數中
此處配置好後, 可以在任意位置使用hdfs的指令.
vim ~/.bashrc
在檔案最後插入
export PATH=$PATH:/opt/software/hadoop/hadoop-2.6.5/bin:/opt/software/hadoop/hadoop-2.6.5/sbin
- 搭建zookeeper叢集
zookeeper節點規劃在node02, node03 ,node04 節點上
首先, 在 node02 上解壓zookeeper的壓縮包
tar -zxf zookeeper-3.4.10.tar.gz -C /opt/software/zookeeper
進入解壓檔案, 修改conf目錄下的zoo_sample.cfg
mv zoo_sample.cfg zoo.cfg 重新命名
修改zoo.cfg檔案
vim zoo.cfg
修改dataDir的值
dataDir=/var/qb/zookeeper 設定zookeeper目錄, 路徑任意, 需自己建立
在檔案最後加入zookeeper節點的服務位置
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
傳送安裝包, 將zookeeper安裝包傳送到node03, node04節點上
cd /opt/software/zookeeper
scp -r zookeeper-3.4.10 node03:`pwd`
scp -r zookeeper-3.4.10 node04:`pwd`
在各個zookeeper節點的dataDir設定的目錄下建立myid檔案, 修改檔案內容
vim /var/qb/zookeeper/myid 在各個節點的myid中寫入相應ID號
1 對應node02節點
2 對應node03節點
3 對應node04節點
最後, 啟動zookeeper程序
cd /opt/software/zookeeper/zookeeper-3.4.10/bin
./zkServer.sh start
- 格式化NameNode
在node01, node02, node03 上分別執行啟動journalnode的命令.
hadoop-daemon.sh start journalnode
隨便選一臺NameNode(node01 || node02)作為active節點進行格式化.
hdfs namenode -format
hadoop-daemon.sh start namenode
另一臺NameNode節點執行
hdfs namenode -bootstrapStandby
格式化ZKFC程序
hdfs zkfc -formatZK
- 啟動HDFS
關閉所有節點上的程序
stop-dfs.sh
啟動HDFS
start-dfs.sh
- 檢視啟動程序
jps
- 操作HDFS檔案系統
建立目錄 hdfs dfs -mkdir -p /abc/cba
上傳檔案 hdfs dfs -D dfs.blocksize=1048576 -put text.txt
...
- 關閉HDFS
stop-dfs.sh
或
killall java
注:下次啟動時, 要先啟動zookeeper程序, 再啟動hdfs