centos7 hadoop HA高可用叢集搭建( hadoop2.7 zookeeper3.4 )
目錄
上篇文章寫了如何用ssh免密登入,當然這些操作都是在hadoop賬號上的操作,包括這篇文章也是一樣 三臺主機
一、伺服器環境
主機名 | IP | 使用者名稱 | 密碼 | 安裝目錄 |
---|---|---|---|---|
node1 | 192.168.31.106 | hadoop | 123456 | /home/hadoop/ |
node2 | 192.168.31.175 | hadoop | 123456 | /home/hadoop/ |
node3 | 192.168.31.36 | hadoop | 123456 | /home/hadoop/ |
二、叢集規劃
master188 | master189 | slave190 |
---|---|---|
NameNode | NameNode | |
DataNode | DataNode | DataNode |
Zookeeper | Zookeeper | Zookeeper |
ResourceManager | ResourceManager | |
NodeManager | NodeManager |
NodeManager |
注:在此之前把防火牆啥的全都關閉,並且設定為開機不啟動
$systemctl stop firewalld.service $systemctl disable firewalld.service $systemctl status firewalld.service not running
三、安裝配置Zookeeper
1、下載及安裝
在master188機器上,下載後解壓到/home/hadoop/目錄下:
tar -zxvf zookeeper-3.4.11.tar.gz /home/hadoop/
2、拷貝 zoo_sample.cfg
進入zookeeper的conf目錄,拷貝zoo_sample.cfg
並重命名為zoo.cfg
:
cd zookeeper-3.4.11/conf/
cp zoo_sample.cfg zoo.cfg
3、修改 zoo.cfg
vi zoo.cfg
修改如下,若原檔案沒有dataDir則直接新增:
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/home/hadoop/zookeeper/data/zkData dataLogDir=/home/hadoop/zookeeper/data/zkDataLog clientPort=2181 server.1=node1:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888
4、建立並編輯myid
//在zookeeper根目錄下建立zoo.cfg中配置的目錄
mkdir data/zkData/ -p
//建立並編輯檔案
vi myid
//輸入1,即表示當前機器為在zoo.cfg中指定的server.1
1
//儲存退出
:wq
5、拷貝zookeeper到其他機器
上述操作是在master188機器上進行的,要將zookeeper拷貝到其他zookeeper叢集機器上:
cd /home/hadoop
scp -r zookeeper/ [email protected]:/home/hadoop/
scp -r zookeeper/ [email protected]:/home/hadoop/
叢集中各元件的安裝目錄最好保持一致。
6、修改其他機器的myid
檔案
myid
檔案是作為當前機器在zookeeper叢集的標識,這些標識在zoo.cfg
檔案中已經配置好了,但是之前在master188這臺機器上配置的myid
為1,所以還需要修改其他機器的myid
檔案:
//在master189機器上
echo 2 > /home/hadoop/zookeeper/data/zkData/myid
//在slave190機器上
echo 3 > /home/hadoop/zookeeper/data/zkData/myid
7、啟動zookeeper叢集
cd zookeeper-3.4.11/bin/
//分別在master188、master189、slave190上啟動
./zkServer.sh start
//檢視狀態
./zkServer.sh status
三臺機器的zookeeper狀態必須只有一個leader
,其他都是follower
。
//檢視程序,若有QuorumpeerMain,則啟動成功
jps
四、安裝配置Hadoop
1、下載及安裝
在master88機器上,解壓到/home/hadoop/目錄下:
tar -zxcf hadoop-2.7.1.tar.gz -C /home/hadoop/
2、配置
進入配置檔案目錄,修改配置檔案
cd hadoop-2.7.1/etc/hadoop/
1)vi hadoop-env.sh
配置JDK安裝路徑:
JAVA_HOME=/usr/local/soft/java
2)vi core-site.xml
<configuration>
<!-- hdfs地址,ha模式中是連線到nameservice -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 這裡的路徑預設是NameNode、DataNode、JournalNode等存放資料的公共目錄,也可以單獨指定 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop/tmp</value>
</property>
<!-- 指定ZooKeeper叢集的地址和埠。注意,數量一定是奇數,且不少於三個節點-->
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,nod2:2181,nod3:2181</value>
</property>
</configuration>
3)vi hdfs-site.xml
<configuration>
<!-- 指定副本數,不能超過機器節點數 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 為namenode叢集定義一個services name -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- nameservice 包含哪些namenode,為各個namenode起名 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>node1,node2</value>
</property>
<!-- 名為master188的namenode的rpc地址和埠號,rpc用來和datanode通訊 -->
<property>
<name>dfs.namenode.rpc-address.ns1.node1</name>
<value>node1:9000</value>
</property>
<!-- 名為master189的namenode的rpc地址和埠號,rpc用來和datanode通訊 -->
<property>
<name>dfs.namenode.rpc-address.ns1.node2</name>
<value>node2:9000</value>
</property>
<!--名為master188的namenode的http地址和埠號,用來和web客戶端通訊 -->
<property>
<name>dfs.namenode.http-address.ns1.node1</name>
<value>node1:50070</value>
</property>
<!-- 名為master189的namenode的http地址和埠號,用來和web客戶端通訊 -->
<property>
<name>dfs.namenode.http-address.ns1.node2</name>
<value>node2:50070</value>
</property>
<!-- namenode間用於共享編輯日誌的journal節點列表 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/ns1</value>
</property>
<!-- 指定該叢集出現故障時,是否自動切換到另一臺namenode -->
<property>
<name>dfs.ha.automatic-failover.enabled.ns1</name>
<value>true</value>
</property>
<!-- journalnode 上用於存放edits日誌的目錄 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/hadoop/data/dfs/journalnode</value>
</property>
<!-- 客戶端連線可用狀態的NameNode所用的代理類 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 一旦需要NameNode切換,使用ssh方式進行操作 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 如果使用ssh進行故障切換,使用ssh通訊時用的金鑰儲存的位置 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- connect-timeout超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
4)vi mapred-site.xml
<!-- 採用yarn作為mapreduce的資源排程框架 -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
5)vi yarn-site.xml
<configuration>
<!-- 啟用HA高可用性 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定resourcemanager的名字 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 使用了2個resourcemanager,分別指定Resourcemanager的地址 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定rm1的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node1</value>
</property>
<!-- 指定rm2的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node2</value>
</property>
<!-- 指定當前機器master188作為rm1 -->
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
</property>
<!-- 指定zookeeper叢集機器 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
<!-- NodeManager上執行的附屬服務,預設是mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
6)vi slaves
node1
node2
node3
3、拷貝hadoop到其他機器
1)拷貝
scp -r hadoop [email protected]:/home/hadoop/
scp -r hadoop [email protected]:/home/hadoop/
2)修改yarn-site.xml
在master189機器,即ResourceManager備用主節點上修改如下屬性,表示當前機器作為rm2::
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm2</value>
</property>
同時刪除slave190機器上的該屬性對,因為slave190機器並不作為ResourceManager。
3、啟動Hadoop
1)啟動Journalnode
cd hadoop/sbin/
./hadoop-daemon.sh start journalnode
//檢視程序JouralNode是否啟動
jps
2)格式化 NameNode和ZKFC
在master188機器上,執行格式化操作:
cd hadoop-2.6.5/bin
./hdfs namenode -format
./hdfs zkfc -formatZK
3)備用主節點同步主節點元資料
在master189(備用主節點)機器上,執行同步操作:
cd hadoop/bin
./hdfs namenode -bootstrapStanby
4)啟動HDFS、YARN、ZookeeperFailoverController
在master188機器上:(注意,在操作之前,要保證zookeeper是正常啟動的)
cd hadoop-2.6.5/sbin
./start-dfs.sh
//驗證,顯示NameNode和DataNode
jps
./start-yarn.sh
//驗證,顯示ResourceManager和NodeManager
jps
./hadoop-daemon.sh start zkfc
//驗證,顯示ZookeeperFailoverController
jps
在master189機器上,啟動ResourceManager,備用主節點的ResourceManager需要手動啟動:
cd hadoop-2.6.5/sbin
yarn-daemon.sh start resourcemanager
6)檢視Namenode、ResourceManager狀態
在master188機器上執行:
hdfs haadmin -getServiceState master188
yarn rmadmin -getServiceState rm1
hdfs haadmin -getServiceState master189
yarn rmadmin -getServiceState rm2
也可以通過Web介面來檢視,瀏覽器中輸入 ip:50070 檢視HDFS,輸入 ip:8088/cluster/cluster 檢視YARN。
7)測試高可用
a.主節點--->備用主節點
kill掉主節點的namenode,檢視備用主節點的namenode狀態是否切換為active;
kill掉主節點的ResourceManager,檢視備用主節點的ResourceManager是否切換為active;
b.備用主節點--->主節點
若上述操作執行成功,那麼再測試反向故障自動轉移
先啟動被殺死的原主節點的namenode和ResourceManager
hadoop-daemon.sh start namenode
yarn-daemon.sh start resourcemanager
再kill備用主節點的namenode和ResourceManager,檢視主節點的狀態,若能切換為active,那麼Hadoop HA高可用叢集搭建完成。
七、總結
需要注意的地方:
1)備用節點上的NameNode、ResourceManager、HMaster均需單獨啟動;
hadoop-daemon.sh start namenode
yarn-daemon.sh start resourcemanager
3)在備用主節點同步主節點的元資料時,主節點的HDFS必須已經啟動;4)無法檢視standby狀態的節點上的hdfs;
5)格式化namenode時要先啟動各個JournalNode機器上的journalnode程序:
hadoop-daemon.sh start journalnode
;6)若遇到問題,可以先考慮是哪個元件出現問題,然後檢視該元件或與該元件相關的元件的日誌資訊;若各元件web頁面無法訪問,或存在其他連線問題,可以從「防火牆是否關閉」、「埠是否被佔用」、「SSH」、「叢集機器是否處於同一網段」內等角度考慮;
7)個人在操作的時候出現過ssh無法啟用,拒絕連線,的問題