HDFS高可用完全分散式搭建
目錄
叢集規劃
關閉防火牆
時間同步
- 安裝ntp
yum install ntp
- 網上查詢最新的時間伺服器,如ntp1.aliyun.com,在所有節點時間同步
ntpdate ntp1.aliyun.com
修改hosts檔案
vim /etc/hosts 192.168.80.131 node01 192.168.80.132 node02 192.168.80.133 node03 192.168.80.134 node04
配置免密登入
所有節點執行 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
node01->node01 node01->node02 node01->node03 node01->node04
node02->node01
在node02節點執行,將node01的公鑰加入到其他節點的白名單中 ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
所有節點配置JDK
- 解除安裝舊有jdk
rpm -qa|grep java rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64 rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64 rpm -e --nodeps tzdata-java-2013g-1.el6.noarch
- 配置新jdk
#vi /etc/profile 加入如下內容:
export JAVA_HOME=/opt/software/jdk/jdk1.8.0_151
export PATH=$PATH:$JAVA_HOME/bin
配置hadoop
- 修改hdfs-site.xml配置檔案
<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配置檔案
<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>
- 修改slaves檔案
node01
node02
node03
- 修改hadoop-env.sh 中的JAVA_HOME=/opt/software/java/jdk1.8.0
- 將配置好的HDFS安裝包拷貝到node02 node03 node04
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/
- 注意傳輸後的位置,我的是/opt/software/hadoop/hadoop-2.6.5
搭建zookeeper叢集
- 解壓zookeeper-3.4.10
以我為例,解壓到了/opt/software/hadoop,跟/opt/software/hadoop/hadoop-2.6.5在同級目錄 - 修改conf目錄下的zoo_sample.cfg
#解壓後,進入conf目錄內,將zoo_sample.cfg重新命名,改為zoo.cfg
mv zoo_sample.cfg zoo.cfg
#修改zoo.cfg
dataDir=/var/zfg/zookeeper
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
-
在dataDir目錄下建立一個myid檔案,在這個檔案中寫上當前節點ID號
比如我這裡在node02節點上是ID號是1
-
將配置好的zookeeper安裝包拷貝到node03 node04
-
拷貝完畢後,在各自節點上建立myid號,ID號要依次遞增
-
新增環境變數
export PATH=$PATH:/opt/software/hadoop/zookeeper-3.4.10/bin
-
啟動node2、node3、node4節點上的zookeeper
./zkServer.sh start
格式化
-
啟動 journalnode
在node01、node02、node03分別執行如下命令在node01、node02、node03分別執行如下命令hadoop-daemon.sh start journalnode
-
隨機選擇一臺NameNode執行,我這裡在node01節點即NameNode1上執行
hdfs namenode -format hadoop-daemon.sh start namenode
-
另外一臺NameNode節點執行
hdfs namenode -bootstrapStandby
-
啟動zkfc服務
hdfs zkfc -formatZK
-
關閉所有節點上的程序
stop-dfs.sh
-
啟動HDFS
start-dfs.sh
驗證HA故障自動切換
可以看到NameNode1和NameNode2現在分別為active和standby狀態
在NameNode1所在的node01節點上,kill掉NameNode1程序
再檢視兩個NameNode2狀態,可以看到已轉為active狀態
需要注意的問題
-
要先啟動zookeeper服務再進行NameNode初始化。
-
如果最後啟動的節點不全或者datanode啟動後馬上自動關閉。需要刪除/tmp目錄下的hadoop-root臨時檔案和dfs.journalnode.edits.dir配置的目錄檔案,比如我這裡是
<property> <name>dfs.journalnode.edits.dir</name> <value>/var/sxt/hadoop/ha/jn</value> </property>
那就刪除var目錄下的指定目錄(以我為例,是sxt目錄)。然後重新搭建格式化NameNode。