Hadoop2.6.0 + zookeeper集羣環境搭建

前提:已安裝好centos6.5操作系統

                                            hadoop HA(QJM)集羣配置規劃

IP

Hostname

備註

192.168.100.101

h1m1

NN(active)、RM、ZKFC

192.168.100.102

h1m2

NN(standby)、RM、ZKFC

192.168.100.103

h1s1

DN、NM、JN、QPM

192.168.100.104

h1s2

DN、NM、JN、QPM

192.168.100.105

h1s3

DN、NM、JN、QPM

192.168.100.106

h1s4

DN、NM、JN、QPM

192.168.100.107

h1s5

DN、NM、JN、QPM


說明:
        NN: NameNode
        RM: ResourceManager
        ZKFC: DFSZKFailoverController
        DN: DataNode
        NM: NodeManager
        JN: JournalNode
        QPM: QuorumPeerMain


1. 系統環境設置(先配置master節點h1m1)

1.1修改主機名
# vim /etc/sysconfig/network
    1 NETWORKING=yes
    2 HOSTNAME=h1m1
    3 NTPSERVERARGS=iburst


1.2 修改IP地址
進入Linux圖形界面 -> 右鍵點擊右上方的網絡連接->點擊“編輯連接…” ->添加一個新網絡“主機連接” ->選擇IPv4 ->方法選擇爲手動 ->點擊添加按鈕 ->添加IP:192.168.100.101子網掩碼:255.255.255.0網關:192.168.100.254 ->應用

 
1.3修改主機名和IP的映射關係(hosts)
# vim/etc/hosts
添加:192.168.100.100 h1m1~192.168.100.107 h1s5

1.4關閉防火牆

# service iptables status        //查看防火牆狀態
# service iptables stop           //關閉防火牆
# chkconfig iptables --list       //查看防火牆開機啓動狀態
# chkconfig iptables off          //關閉防火牆開機啓動

1.5重啓系統
# reboot


2.安裝jdk
下載地址:http://pan.baidu.com/s/1i34B3JB

2.1上傳
 
2.2解壓jdk

# mkdir /usr/lib/jdk        //創建目錄
# tar -zxvf jdk-8u40-linux-x64.tar.gz           //解壓
# mv jdk1.8.0_40 /usr/lib/jdk
                 
2.3將java添加到環境變量中
# vim /etc/profile
//在文件最後添加
export JAVA_HOME=/usr/java/jdk1.8.0_40
export PATH=.:$JAVA_HOME/bin:$PATH

# source /etc/profile           //刷新配置
# java -version


3. 配置ssh免登陸
# cd ~      //進入到我的home目錄
# ssh-keygen -t rsa -P ''(四個回車)
執行完這個命令後,會生成兩個文件id_rsa(私鑰)、id_rsa.pub(公鑰)
將公鑰拷貝到要免登陸的機器上

# ssh-copy-id h1m1 (或# cat ~/.ssh/id_rsa.pub>> ~/.ssh/ authorized_keys)
# cat ~/.ssh/authorized_keys       //查看rsa



注:爲方便在集羣中針對多節點執行命令,在此提供一個簡單腳本供大家使用:

#!/usr/bin/env bash

doCommand() {
    hosts=`sed -n '/^[^#]/p' hostlist`
    for host in $hosts
    do
        echo ""
        echo HOST $host
        ssh $host "$@"
    done
    return 0
} 

if [ $# -lt 1 ]; then
    echo "$0 cmd"
    exit
fi 

doCommand "$@"
echo "return from doCommand"


用法:將本腳本保存並修改權限(chmod 775 doCommand.sh). 在腳本目錄下創建一個hostlist文件,其中保存要執行命令的host主機列表.
使用命令:./doCommand.sh “<command>”
e.g. ./doCommand.sh “ls”



4.在h1m1上安裝hadoop2.6.0(注:爲方便操作,使用xshell遠程登錄到linux)
按安裝java方式把hadoop解壓到/usr/lib/hadoop

4.1配置hadoop
將hadoop添加到環境變量中
# vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_40
export HADOOP_HOME=/usr/lib/hadoop
export PATH=.:$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH

4.1.1 配置hadoop-env.sh
# cd /usr/lib/hadoop
# vim etc/hadoop/hadoop-env.sh(注意,此處不是系統的etc目錄)
將JAVA_HOME修改爲剛纔配置的位置

 
4.1.2配置core-site.xml
# vim etc/hadoop/core-site.xml
添加以下內容:

<configuration>
    <!-- 指定hdfs的nameservice爲ns1 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>

    <!-- 指定hadoop臨時目錄 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/lib/hadoop/tmp</value>
    </property>

    <!-- 指定zookeeper地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>h1s1:2181,h1s2:2181,h1s3:2181,h1s4:2181,h1s5:2181</value>
    </property>
</configuration>


4.1.3 配置hdfs-site.xml
HA主要配置是在本文件中,參考官網:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
# vim etc/hadoop/hdfs-site.xml
添加以下內容:

<configuration>
    <!--指定hdfs的nameservice爲mycluster,需要和core-site.xml中的保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
    
    <!-- mycluster下面有兩個NameNode,分別是nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>
    
    <!-- nn1的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>h1m1:9000</value>
    </property>
    
    <!-- nn1的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>h1m1:50070</value>
    </property>
    
    <!-- nn2的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>h1m2:9000</value>
    </property>
    
    <!-- nn2的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>h1m2:50070</value>
    </property>
    
    <!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://h1s1:8485;h1s2:8485;h1s3:8485;h1s4:8485;h1s5:8485/mycluster</value>
    </property>
    
    <!-- 指定JournalNode在本地磁盤存放數據的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/usr/lib/hadoop/journal</value>
    </property>
    
    <!-- 開啓NameNode失敗自動切換 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</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
            shell(/bin/true)
        </value>
    </property>
    
    <!-- 使用sshfence隔離機制時需要ssh免登陸 -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
    
    <!-- 配置sshfence隔離機制超時時間 -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
</configuration>


4.1.4配置mapred-site.xml
# cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
# vim etc/hadoop/mapred-site.xml
添加以下內容:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        <final>true</final>
     </property>
</configuration>


4.1.5配置yarn-site.xml
# vim etc/hadoop/yarn-site.xml
添加以下內容:

<configuration>
    <!-- 開啓RM高可靠 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <!-- 指定RM的cluster id -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yrc</value>
    </property>

    <!-- 指定RM的名字 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <!-- 分別指定RM的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>h1m1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>h1m2</value>
    </property>

    <!-- 指定zk集羣地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>h1s1:2181,h1s2:2181,h1s3:2181,h1s4:2181,h1s5:2181</value>
    </property>

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>


4.2 修改slaves
slaves是指定子節點的位置,因爲要在h1m1上啓動HDFS、yarn,所以h1m1上的slaves文件指定的是datanode的位置和nodemanager的位置
# vim /usr/lib/hadoop/etc/hadoop/slaves
h1s1
h1s2
h1s3
h1s4
h1s5

4.3 配置免密碼登陸
#配置h1m1到h1m2、h1s1、h1s2、h1s3、h1s4、h1s5的免密碼登陸
#在h1m1上生產一對鑰匙
ssh-keygen -t rsa -P ''
#將公鑰拷貝到其他節點,包括自己
ssh-coyp-id h1m1
ssh-coyp-id h1m2
ssh-coyp-id h1s1
ssh-coyp-id h1s2
ssh-coyp-id h1s3
ssh-coyp-id h1s4
ssh-coyp-id h1s5


5. 安裝zookeeper


5.1 下載安裝zookeeper
下載地址:http://pan.baidu.com/s/1hq2BEBi
安裝過程參考hadoop

5.2 配置zookeeper
添加一個zoo.cfg配置文件
# cd /usr/lib/zookeeper/conf
# mv zoo_sample.cfg zoo.cfg

修改配置文件(zoo.cfg)
dataDir=/usr/lib/zookeeper/data
server.3=h1s1:2888:3888
server.4=h1s2:2888:3888
server.5=h1s3:2888:3888
server.6=h1s4:2888:3888
server.7=h1s5:2888:3888

在(/usr/lib/zookeeper/data)創建一個myid文件,裏面內容是server.N中的N(server.3裏面內容爲3)
# echo "3" > myid

將配置好的zk拷貝到其他節點
# scp -r /usr/lib/zookeeper/ h1s2:/usr/lib/
# scp -r /usr/lib/zookeeper/ h1s3:/usr/lib/
# scp -r /usr/lib/zookeeper/ h1s4:/usr/lib/
# scp -r /usr/lib/zookeeper/ h1s5:/usr/lib/

注意:在其他節點上一定要修改myid的內容
在h1s2應該講myid的內容改爲4 (# echo "4" > myid)
在h1s3應該講myid的內容改爲5 (# echo "5" > myid)
在h1s4應該講myid的內容改爲6 (# echo "6" > myid)
在h1s5應該講myid的內容改爲7 (# echo "7" > myid)


6. 啓動集羣


6.1 啓動zookeeper集羣(分別在h1s1、h1s2、h1s3、h1s4、h1s5上啓動zk)
# cd /usr/lib/zookeeper/bin/
# ./zkServer.sh start
# ./zkServer.sh status #查看狀態:一個leader,四個follower

6.2 啓動journalnode(分別在h1s1、h1s2、h1s3、h1s4、h1s5上執行)
# cd /usr/lib/hadoop
# sbin/hadoop-daemon.sh start journalnode #運行jps命令檢驗,h1s1、h1s2、h1s3、h1s4、h1s5上多了JournalNode進程

6.3 格式化HDFS
# hdfs namenode -format #在h1m1上執行命令:
# scp -r tmp/ h1m2:/usr/lib/hadoop/ #格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這裏我配置的是/usr/lib/hadoop/tmp,然後將/usr/lib/hadoop/tmp拷貝到h1m2的/usr/lib/hadoop/下。

6.4 格式化ZK(在h1m1上執行即可)
# hdfs zkfc -formatZK

6.5 啓動HDFS(在h1m1上執行)
# sbin/start-dfs.sh


6.6 啓動YARN
在此我們是在h1m1上配置RM,所以在h1m1執行
# sbin/start-yarn.sh

 
到此,hadoop-2.6.0配置完畢,可以統計瀏覽器訪問:
http://h1m1:50070
NameNode 'h1m1:9000' (active)
http://h1m2:50070
NameNode 'h1m2:9000' (standby)


驗證HDFS HA
首先向hdfs上傳一個文件
hadoop fs -put /etc/profile /profile
hadoop fs -ls /


 然後再kill掉active的NameNode
kill -9 <pid of NN>
通過瀏覽器訪問:http://h1m2:50070
NameNode 'h1m2:9000' (active)
這個時候h1m2上的NameNode變成了active


 在執行命令:
hadoop fs -ls /
-rw-r--r-- 3 root supergroup 1926 2015-05-14 15:36 /profile
剛纔上傳的文件依然存在!!!


 手動啓動那個掛掉的NameNode
sbin/hadoop-daemon.sh start namenode
通過瀏覽器訪問:http://h1m1:50070
NameNode 'h1m1:9000' (standby)

驗證YARN:
運行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /profile /out

OK,大功告成!!!



發佈了41 篇原創文章 · 獲贊 84 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章