1. 程式人生 > >超詳細Hadoop HA高可用叢集搭建及常見問題處理

超詳細Hadoop HA高可用叢集搭建及常見問題處理

       最近研究了下公司的hadoop叢集並模仿搭建了一個在本地測試使用的hadoop叢集。本文介紹下詳細的搭建過程以及各種常見問題的處理解決。

 1 ,  前期準備

    1.0  ,  準備Linux環境。

        安裝vmware linux虛擬機器,因為Centos 7 和Centos 6版本部分命令差別還挺多了,所以我本次用的Centos 6版本,用什麼你隨意,高興就好。 叢集中虛擬機器需要幾步必須的配置(本次叢集的搭建我搞了7臺虛擬機器,原因下面有介紹),這裡我們先配置好一臺虛擬機器的公共配置,然後其餘的克隆出來即可,配置如下 :

              配置虛擬機器網路環境

              開啟你的vmware, 點選編輯->虛擬網路編輯器 -> VMnet8 ,注意ip地址以及閘道器和你windows本地vmnet8 的對映關係,閘道器保持一直,並且ip地址要在統一網段內,實在不懂的模仿這如下截圖來就行,具體原因文章底部有詳細講解,如圖我本地配置截圖。

                合理設定每臺虛擬機器記憶體,處理器,硬碟等資訊

                如下是我電腦配置截圖。根據自己電腦配置酌情設定每臺的硬體資訊。

                

  1.2 , 修改虛擬機器IP地址(最好使用第一種配置,簡單且不容易出錯)

        注意,修改之前建議使用 root 管理員許可權登陸,這樣會避免特別多問題,等叢集搭建好之後在用普通使用者登陸。

        7 臺虛擬機器ip地址最好整個連號,比如我本地是 192.168.2.201 到 192.168.2.207

        第一種:通過Linux圖形介面進行修改。
進入Linux圖形介面 -> 右鍵點選右上方的兩個小電腦 -> 點選Edit connections -> 選中當前網路System eth0 -> 點選edit按鈕 -> 選擇IPv4 -> method選擇為manual -> 點選add按鈕 -> 新增IP:192.168.2.201 子網掩碼:255.255.255.0 閘道器:192.168.2.1 -> apply
第二種:修改配置檔案方式
vi /etc/sysconfig/network-scripts/ifcfg-eth0

 1.3  ,  修改主機名和ip的對映關係

           

            儲存退出 (鍵盤 Shift + :  , 輸入小寫 wq ,然後 enter ) 

            關閉防火牆 service iptables stop  

            關閉開機自啟 chkconfig iptables off

   1.4 ,  完成上述配置操作後重啟虛擬機器

                reboot 

    注 : 將另外6臺虛擬機器複製出來需注意的問題

   1 ,IP地址配置問題。

                我們第一臺虛擬機器配置好後用的是 eth0 網絡卡,但是克隆出來的的其他虛擬機器會自動多處自己的新網絡卡(eth1,eth2....),實際起作用的是eth1,eth0是從之前克隆過來的,eth1才是我們需要的。克隆系統會重新生成一個mac地址,因此係統會在eth0加1變成eth1, 這裡我們需要將每臺虛擬機器網絡卡都配置成使用eth0, 這樣一會會避免一些可能發生的網路問題。

                vi /etc/udev/rules.d/70-persistent-net.rules

        將該檔案中第一個etho注掉, 並將第二個eth1 改為 ehto , 複製他的mac地址(ATTR{address})。

        修改完成後儲存退出。

        輸入命令 進入這個檔案,將其中的HWADDR 改為剛才複製的mac地址。    

        vi /etc/sysconfig/network-scripts/ifcfg-eth0

           

        儲存退出。

        最後重啟網路服務 service network restart

        檢視etho 網絡卡資訊 ifconfig

        執行 ping www.baidu.com , 如果可以ping通的話,標識配置成功。

2,  叢集規劃

主機名 IP 安裝的軟體 執行的程序
weekend01 192.168.2.201     jdk hadoop NameNode、DFSZKFailoverController(zkfc)
weekend02 192.168.2.202     jdk hadoop NameNode、DFSZKFailoverController(zkfc)
weekend03 192.168.2.203 jdk hadoop ResourceManager
weekend04 192.168.2.204 jdk hadoop ResourceManager
weekend05 192.168.2.205 jdk hadoop zookeeperDataNode、NodeManager、JournalNode、QuorumPeerMain
weekend06 192.168.2.206 jdk hadoop zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain

weekend07 192.168.2.207 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain

3 ,  安裝叢集所需要的各個軟體

2.1 安裝JDK (在第weekend01上安裝)

        上傳jdk壓縮包,我用的是jdk7 ,

        建立資料夾 mkdir /usr/app

        解壓 tar -zxvf jdk-7u55-linux-i586.tar.gz -C /usr/app

       新增環境變數

        vi /etc/profile

        在檔案最後新增
export JAVA_HOME=/usr/app/jdk-7u_65-i585

export PATH=$PATH:$JAVA_HOME/bin

        重新整理配置

source /etc/profile

    2.2 安裝配置 zookeeper (在第weekend05上安裝)

        上傳zookeeper壓縮包並解壓到 /usr/app資料夾下

修改配置
        cd /usr/app/zookeeper-3.4.5/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改:dataDir=/usr/app/zookeeper-3.4.5/tmp
在最後新增:
server.1=weekend05:2888:3888
server.2=weekend06:2888:3888
server.3=weekend07:2888:3888
儲存退出
建立一個tmp資料夾
mkdir /usr/app/zookeeper-3.4.5/tmp
再建立一個空檔案
touch /usr/app/zookeeper-3.4.5/tmp/myid
最後向該檔案寫入ID

echo 1 > /usr/app/zookeeper-3.4.5/tmp/myid

    配置好的zookeeper拷貝到其他節點(首先分別在weekend06、weekend07根目錄下建立一個目錄:mkdir /usr/app)
scp -r /usr/app/zookeeper-3.4.5/ weekend06:/usr/app/
scp -r /usr/app/zookeeper-3.4.5/ weekend07:/usr/app/
注意:修改weekend06、weekend07對應/usr/app/zookeeper-3.4.5/tmp/myid內容
weekend06:
echo 2 > /usr/app/zookeeper-3.4.5/tmp/myid
        weekend07:
echo 3 > /usr/app/zookeeper-3.4.5/tmp/myid

  2.3 安裝hadoop (在第weekend01上安裝)

        上傳hadoop壓縮包,我用的是2.4版本    

        同樣解壓到 /usr/app資料夾下面

        將hadoop新增到環境變數中
vi /etc/profile
export JAVA_HOME=/usr/app/jdk-7u_65-i585
export HADOOP_HOME=/usr/app/hadoop-2.4.1

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

        配置修改 /usr/app/hadoop-2.4.1/etc/hadoop 路徑下如下5個檔案

        hadoo-env.sh ,core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml

 2.4 修改slaves

(slaves是指定子節點的位置,因為要在weekend01上啟動HDFS、在weekend03啟動yarn,所以weekend01上的slaves檔案指定的是datanode的位置,weekend03上的slaves檔案指定的是nodemanager的位置)

分別修改 weekend01 和 weekend03上的配置檔案

  vi  /usr/app/hadoop-2.4.1/etc/hadoop

    將slavles中資訊改為如下所示

    

配置weekend01到weekend02、weekend03、weekend04、weekend05、weekend06、weekend07的免密碼登陸

配置weekend03到weekend04、weekend05、weekend06、weekend07的免密碼登陸

兩個namenode之間要配置ssh免密碼登陸,別忘了配置weekend02到weekend01的免登陸

2.6 將配置好的hadoop及zookeeper拷貝到其他節點

在weekend01上執行 如下 : 

scp -r /usr/app/hadoop-2.4.1/ weekend01:/usr/app
scp -r /usr/app/hadoop-2.4.1/ weekend02:/usr/app
........
scp -r /usr/app/hadoop-2.4.1/ weekend07:/usr/app

在weekend05上執行如下 :

scp -r /usr/app/zookeeper-3.4.5/ weekend06:/usr/app

scp -r /usr/app/zookeeper-3.4.5/ weekend07:/usr/app

按照下面的步驟啟動叢集
2.7 啟動zookeeper叢集(分別在weekend05、weekend06、weekend07上啟動zk)

cd /usr/app/zookeeper-3.4.5/bin/
./zkServer.sh start
#檢視狀態:一個leader,兩個follower
./zkServer.sh status


2.8啟動journalnode(分別在在weekend05、weekend06、weekend07上執行)最下方有關係圖解

注: journalnode為qjournal分散式應用(可用來管理)的管理edit.log檔案,依賴於zk管理,所以將三個node節點放到zk上啟動。hadoop1.x中還是用secondynode管理edit.log檔案,而hadoop2.x使用qjournal管理edit.log檔案。
cd /usr/app/hadoop-2.4.1
sbin/hadoop-daemon.sh start journalnode
#執行jps命令檢驗,weekend05、weekend06、weekend07上多了JournalNode程序


2.9格式化HDFS(僅第一次啟動執行)
#在weekend01上執行命令:
hdfs namenode -format
#格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡我配置的是/weekend/hadoop-2.4.1/tmp,然後將/usr/app/hadoop-2.4.1/tmp拷貝到weekend02的/usr/app/hadoop-2.4.1/下。
scp -r tmp/ weekend02:/usr/app/hadoop-2.4.1/
##也可以這樣,建議hdfs namenode -bootstrapStandby


3.1格式化ZKFC(在weekend01上執行即可)(僅第一次啟動執行)

注:zkfc是用來管理兩臺namenode切換狀態的程序。同樣是依賴zk實現。當active namenode狀態不正常了,該namenode上的zkfc會制一個狀態發動到 zk上,standby namenode上的zkfc會檢視到該不正常狀態,並向active namenode通過ssh傳送一條指令,kill -9 程序號,殺死該程序,並將自己重置成active,放置active假死發生腦裂事件,萬一ssh傳送失敗,也可以啟動自定義的.sh指令碼檔案,強制殺死active namenode程序。

在hadoop2.x中將這也的一對namenode管理關係叫做 federation(聯邦)最下方有圖解。

並且支援多個federation,  比如配置檔案中起名為ns1, 則該ns1中包括 (active namenode)nn1, (standby namenode)nn2 。
hdfs zkfc -formatZK


3.2啟動HDFS(在weekend01上執行)
sbin/start-dfs.sh


3.3 啟動YARN(在weekend03上執行start-yarn.sh,把namenode和resourcemanager分開是因為效能問題,因為他們都要佔用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動)

sbin/start-yarn.sh

weekend04上面的resourcemanager 需要自己手動去啟動下,

yarn-daemon.sh start resourcemanager

到這裡hadoop HA叢集配置完畢,檢視各個叢集節點上的程序驗證是否成功啟動

搭建成功情況下 weekend01 , weekend02 含有的程序

weekend03 , weekend04 含有的程序

weekend05 , weekend06,weekend07 含有的程序

可以在網頁檢視各個服務執行狀態 : 

HDFS  :  http://weekend01:50070    

ResourceManager :  http://weekend03:8088

下圖為常見預設埠號: 

附 : 配置虛擬機器網路環境配置分析

首先vmware 會產生一個虛擬閘道器,同時vmware 上面的虛擬機器上面也有閘道器。

而我們的實際windows上有一塊實際的閘道器,同事vmware 也會給我們windows生成一個虛擬網絡卡,快捷鍵 win + R 可以看到該網絡卡,名字叫做 VMware NetWork Adapter VMnet8 ,這個網絡卡當然就會與vmware 進行連線。 這樣的話通過 vmware軟體,就把你的centos虛擬機器和本地windows主機組成一個虛擬的網路。 

這樣 vmware虛擬閘道器為 192.168.2.1 的話,那麼centos虛擬機器閘道器為192.168.2.1,網絡卡ip可以配置為 192.168.2.100(1-->255),而本地vmnet8 虛擬機器網關同樣為192.168.2.1,網絡卡ip可以配置為 192.168.2.101(1--255),保證兩個網絡卡不衝突並且在同一個網段即可。