1. 程式人生 > >centos7 hadoop HA高可用叢集搭建( hadoop2.7 zookeeper3.4 )

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無法啟用,拒絕連線,的問題