1. 程式人生 > >大資料入門(14)hadoop+yarn+zookeeper叢集搭建

大資料入門(14)hadoop+yarn+zookeeper叢集搭建

1、右鍵clone虛擬機器,進入圖形介面,修改虛擬機器ip即可,相關環境變數配置都存在

2、叢集規劃:(必須設定主機名,配置主機名和ip的對映關係,每個檔案都需要配置對映關係)

    主機名        IP            安裝的軟體                    執行的程序
    weekend01    192.168.1.113        jdk、hadoop                NameNode、DFSZKFailoverController(zkfc)
    weekend02    192.168.1.114        jdk、hadoop                NameNode、DFSZKFailoverController(zkfc)
    weekend03    192.168.1.115        jdk、hadoop                ResourceManager
    weekend04    192.168.1.116        jdk、hadoop                ResourceManager
    weekend05    192.168.1.181        jdk、hadoop、zookeeper     DataNode、NodeManager、JournalNode、QuorumPeerMain
    weekend06    192.168.1.182        jdk、hadoop、zookeeper     DataNode、NodeManager、JournalNode、QuorumPeerMain
    weekend07    192.168.1.183        jdk、hadoop、zookeeper     DataNode、NodeManager、JournalNode、QuorumPeerMain


3、安裝步驟:
    1.安裝配置zooekeeper叢集(在weekend05上)    
        1.1上傳解壓檔案
            tar -zxvf zookeeper-3.4.6.tar.gz -C /app
        1.1新增一個zoo.cfg配置檔案(/home/admin/app/zookeeper-3.4.6/conf)
            $ZOOKEEPER/conf
            修改名字:mv zoo_sample.cfg zoo.cfg    
        1.2修改配置檔案(zoo.cfg)
            dataDir=/home/admin/app/zookeeper-3.4.6/data        
            server.1=192.168.1.181:2888:3888
            server.2=192.168.1.182:2888:3888
            server.3=192.168.1.183:2888:3888    
        1.3(dataDir=/home/admin/app/zookeeper-3.4.6/data)在zookeeper-3.4.6/下建立一個data檔案
            mkdir data
            cd data 
            echo 1 > myid        
            cat myid        

            裡面內容是server.N中的N(server.2裡面內容為2)    echo 1 > myid    
        1.4將配置好的zk拷貝到其他節點(app下)配置zookeeper叢集
             scp -r zookeeper-3.4.6 192.168.1.182:/home/admin/app
             scp -r zookeeper-3.4.6 192.168.1.182:/home/admin/app    
        1.5注意:在其他節點上一定要修改myid的內容
            在192.168.1.182應該講myid的內容改為2 (echo 2 > myid)
            在192.168.1.183應該講myid的內容改為3 (echo 3 > myid)
    2.安裝配置hadoop叢集(在weekend01上操作)
        2.1解壓
            tar -zxvf hadoop-2.4.1.tar.gz -C /app
        2.2配置HDFS(hadoop所有的配置檔案都在$HADOOP_HOME/etc/hadoop目錄下)
            #將hadoop新增到環境變數中
            vim /etc/profile
            export JAVA_HOME=/home/admin/app/java/jdk1.7.0_65
            export HADOOP_HOME=/home/admin/app/hadoop-2.4.1
            export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
            
            #hadoop2.0的配置檔案全部在$HADOOP_HOME/etc/hadoop下
            cd /home/admin/app/hadoop-2.4.1/etc/hadoop
            
            2.2.1修改hadoo-env.sh
                export JAVA_HOME=/home/admin/app/java/jdk1.7.0_65
                
            2.2.2修改core-site.xml(配置檔案中不要加註釋,容易亂碼)
                <configuration>
                    <!-- 指定hdfs的nameservice為ns1 -->
                    <property>
                        <name>fs.defaultFS</name>
                        <value>hdfs://ns1/</value>
                    </property>
                    <!-- 指定hadoop臨時目錄 -->
                    <property>
                        <name>hadoop.tmp.dir</name>
                        <value>/home/admin/app/hadoop-2.4.1/tmpdata</value>
                    </property>
                    
                    <!-- 指定zookeeper地址 -->
                    <property>
                        <name>ha.zookeeper.quorum</name>
                        <value>192.168.21.181:2181,192.168.21.182:2181,192.168.21.183:2181</value>
                    </property>
                </configuration>
                
            2.2.3修改hdfs-site.xml
                <configuration>
                    <!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 -->
                    <property>
                        <name>dfs.nameservices</name>
                        <value>ns1</value>
                    </property>
                    <!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
                    <property>
                        <name>dfs.ha.namenodes.ns1</name>
                        <value>nn1,nn2</value>
                    </property>
                    <!-- nn1的RPC通訊地址 -->
                    <property>
                        <name>dfs.namenode.rpc-address.ns1.nn1</name>
                        <value>weekend01:9000</value>
                    </property>
                    <!-- nn1的http通訊地址 -->
                    <property>
                        <name>dfs.namenode.http-address.ns1.nn1</name>
                        <value>weekend01:50070</value>
                    </property>
                    <!-- nn2的RPC通訊地址 -->
                    <property>
                        <name>dfs.namenode.rpc-address.ns1.nn2</name>
                        <value>weekend02:9000</value>
                    </property>
                    <!-- nn2的http通訊地址 -->
                    <property>
                        <name>dfs.namenode.http-address.ns1.nn2</name>
                        <value>weekend02:50070</value>
                    </property>
                    <!-- 指定NameNode的元資料在JournalNode上的存放位置 -->
                    <property>
                        <name>dfs.namenode.shared.edits.dir</name>
                        <value>qjournal://weekend05:8485;weekend06:8485;weekend07:8485/ns1</value>
                    </property>
                    <!-- 指定JournalNode在本地磁碟存放資料的位置 -->
                    <property>
                        <name>dfs.journalnode.edits.dir</name>
                        <value>/home/admin/app/hadoop-2.4.1/journaldata</value>
                    </property>
                    <!-- 開啟NameNode失敗自動切換 -->
                    <property>
                        <name>dfs.ha.automatic-failover.enabled</name>
                        <value>true</value>
                    </property>
                    <!-- 配置失敗自動切換實現方式 -->
                    <property>
                        <name>dfs.client.failover.proxy.provider.ns1</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/admin/.ssh/id_rsa</value>
                    </property>
                    <!-- 配置sshfence隔離機制超時時間 -->
                    <property>
                        <name>dfs.ha.fencing.ssh.connect-timeout</name>
                        <value>30000</value>
                    </property>
                </configuration>
            
            2.2.4修改mapred-site.xml
                <configuration>
                    <!-- 指定mr框架為yarn方式 -->
                    <property>
                        <name>mapreduce.framework.name</name>
                        <value>yarn</value>
                    </property>
                </configuration>    
            
            2.2.5修改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>weekend03</value>
                        </property>
                        <property>
                           <name>yarn.resourcemanager.hostname.rm2</name>
                           <value>weekend04</value>
                        </property>
                        <!-- 指定zk叢集地址 -->
                        <property>
                           <name>yarn.resourcemanager.zk-address</name>
                           <value>weekend05:2181,weekend06:2181,weekend07:2181</value>
                        </property>
                        <property>
                           <name>yarn.nodemanager.aux-services</name>
                           <value>mapreduce_shuffle</value>
                        </property>
                </configuration>
            
                
            2.2.6修改slaves(slaves是指定子節點的位置,因為要在weekend01上啟動HDFS、在weekend03啟動yarn,所以weekend01上的slaves檔案指定的是datanode的位置,
                    weekend03上的slaves檔案指定的是nodemanager的位置)
                weekend05
                weekend06
                weekend07
                2.2.7配置免密碼登陸


        2.4將配置好的hadoop拷貝到其他節點(app目錄)
            scp -r  hadoop2.4.1  weekend02:/app
            scp -r  hadoop2.4.1 weekend03:/app
            scp -r  hadoop-2.4.1/ weekend04:/app/
            scp -r  hadoop-2.4.1/ weekend05:/app/
            scp -r  hadoop-2.4.1/ weekend06:/app/
            scp -r  hadoop-2.4.1/ weekend07:/app/


4、啟動(嚴格按照一下步驟)

     4.1啟動zookeeper叢集(分別在weekend05、weekend06、tcast07上啟動zk)
            cd /app/zookeeper-3.4.5/bin/
            ./zkServer.sh start
            #檢視狀態:一個leader,兩個follower
            ./zkServer.sh status            
    4.2啟動journalnode(分別在在weekend05、weekend06、tcast07上執行)
            cd /app/hadoop-2.4.1
            sbin/hadoop-daemon.sh start journalnode
            #執行jps命令檢驗,weekend05、weekend06、weekend07上多了JournalNode程序        
    4.3格式化HDFS(重啟後不用執行此命令,此處只能格式化一次,否則上傳檔案報錯)
            #在weekend01上執行命令:
            hdfs namenode -format
            #格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡我配置的是/weekend/hadoop-2.4.1/tmp,
            #然後將/weekend/hadoop-2.4.1/tmp拷貝到weekend02的/weekend/hadoop-2.4.1/下。
            scp -r tmp/ weekend02:/home/hadoop/app/hadoop-2.4.1/
            ##也可以這樣,建議hdfs namenode -bootstrapStandby        
    4.4格式化ZKFC(在weekend01上執行即可)(重啟需要執行此命令強制啟動zkfc)
            hdfs zkfc -formatZK        
    4.5啟動HDFS(在weekend01上執行)
            sbin/start-dfs.sh
    4.6啟動YARN(#####注意#####:是在weekend03上執行start-yarn.sh,把namenode和resourcemanager分開是因為效能問題,
            #因為他們都要佔用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動)
            sbin/start-yarn.sh
5、瀏覽器訪問
        http://192.168.21.113:50070
        NameNode 'weekend01:9000' (active)
        http://192.168.21.114:50070
        NameNode 'weekend02:9000' (standby)

        手動啟動zkfc
        hdfs hadoop-daemon.sh start zkfc
6、驗證HDFS HA
    首先向hdfs上傳一個檔案
        hadoop fs -put a.txt
        hadoop fs -ls /
    然後再kill掉active的NameNode
        kill -9 <pid of NN>
    通過瀏覽器訪問:http://192.168.21.114:50070
        NameNode 'weekend02:9000' (active)
    這個時候weekend02上的NameNode變成了active
    在執行命令:
        hadoop fs -ls /
        -rw-r--r--   3 root supergroup       1926 2014-02-06 15:36 /profile
    剛才上傳的檔案依然存在!!!
    手動啟動那個掛掉的NameNode
        sbin/hadoop-daemon.sh start namenode
    通過瀏覽器訪問:http://192.168.21.113:50070
        NameNode 'weekend01:9000' (standby)
7、驗證YARN:(在115上執行)
    執行一下hadoop提供的demo中的WordCount程式:
        hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out
        
        
        
檢視上傳的檔案塊:
/home/admin/app/hadoop-2.4.1/tmpdata/dfs/data/current/BP-1107823742-192.168.21.113-1540886411460/current/finalized