centos7 搭建hadoop集羣 zookeeper Hbase集羣

集羣規劃:
    主機名        IP                安裝的軟件
    master        192.168.1.201            jdk、hadoop、zookeeper
    slave1        192.168.1.202            jdk、hadoop、zookeeper
    slave2        192.168.1.203            jdk、hadoop、zookeeper

虛擬機安裝技巧快速法: 先裝master鏡像,先操作後面先在master上安裝jdk(建議非openjdk)“這一節中的教程,安裝ntp同步時間,接着按下面常用命令分別修改master主機名,ip地址和綁定hostname與ip,ip和主機名均按上面集羣規劃修改, 然後將master鏡像克隆兩個,分別爲slave1、slave2,當然可以更多,接着按下面常用命令分別修改克隆的主機名,ip地址,再開啓所有虛擬機並在master節點配置ssh免密登錄到slave節點,接着按後面教程搭建hadoop集羣 zookeeper Hbase集羣

注意版本兼容問題

本博客:

jdk1.7
zookeeper3.4.14
hbase 1.5.0
hadoop 2.8.5

 

下面爲版本兼容列表: 

jdk與hbase兼容問題

在這裏插入圖片描述

安集羣常用命令

 

root@master

即當前用戶@主機名(hostname)

在master鏡像中最好創建一個用戶叫hadoop,解壓什麼的所有操作都用hadoop來操作

修改主機名

vim /etc/hostname

立即生效: hostname 主機名

修改ip地址

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

重啓服務:

service network restart

綁定hostname與ip

vim /etc/hosts

 

ntp同步時間

sudo yum install ntp.x86_64

systemctl start ntpd

ntpdate time1.aliyun.com

date

#重啓命令
systemctl restart ntpd

配置ssh免密登錄

1.客戶端生成公私鑰

本地客戶端生成公私鑰:(一路回車默認即可)

ssh-keygen

上面這個命令會在用戶目錄.ssh文件夾下創建公私鑰

cd ~/.ssh
  •  
ls
  •  

下創建兩個密鑰:

  1. id_rsa (私鑰)
  2. id_rsa.pub (公鑰)

2 免密登錄集羣其他服務器salve2 slave1

還有 ssh-copy-id master@master

測試成功

 

同理分別在slave1 slave2上執行同樣的免密操作

先在master上安裝jdk(建議非openjdk)

先下載jdk for linux,本文後綴爲.zip其實是一樣的,下載鏈接:https://download.csdn.net/download/Justdoforever/12527560

tar.gz後綴格式JDK安裝方式

安裝jdk-7u79-linux-x64.tar.gz。

在/usr目錄下新建java文件夾,命令行:

 

 

[root@localhost Desktop]# mkdir /usr/java

 

進入JDK壓縮包所在目錄,將壓縮包複製到java文件夾中。複製文件用cp xxx命令,複製文件夾用cp -r xxx,命令行:

 

 

[root@localhost Desktop]# cp jdk-7u79-linux-x64.gz /usr/java

 

然後返回到根目錄,再進入java目錄,命令行:

 

 

[root@localhost Desktop]# cd /

[root@localhost Desktop]# cd /usr/java

 

壓縮包解壓,命令行:

 

 

[root@localhost Desktop]# tar xvf jdk-7u79-linux-x64.gz

或者 [root@localhost Desktop]# unzip  jdk-7u79-linux-x64.zip

刪除壓縮包,輸入yes確認刪除。命令行:

 

[root@localhost java]# rm jdk-7u79-linux-x64.gz

rm: remove regular file `jdk-7u79-linux-x64.gz'? yes

 

設置對所有用戶有效方式:修改/etc/profile文件設置系統變量,設置jdk環境變量,該方式對所有用戶有效。

使用VI編輯,輸入命令,回車確認。命令行:

 

[root@localhost Desktop]# vi /etc/profile

 

打開之後在文件末尾添加下面配置。通過鼠標滑輪滾動到文件末尾,上下左右方向鍵控制光標輸入位置。

 

export JAVA_HOME=/usr/java/jdk1.7.0_79

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 

配置好後,按Esc退出,按Shift加英文冒號shift + :  然後輸入wq,按Enter回車鍵確認。取消編輯按Ctrl+z。

使profile配置生效。命令行:

[root@localhost Desktop]# source /etc/profile

 

安裝步驟:
    1.安裝配置zooekeeper集羣(在master上操作)3.4.14版本鏈接https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.4.14/  用什麼版本下面替換一下就好了
        1.1解壓
            tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local
        1.2修改配置
            cd /usr/local/zookeeper-3.4.6/conf/
            cp zoo_sample.cfg zoo.cfg
            vim zoo.cfg
 

server.id=host:port1:port2
其中id爲一個數字,表示zk進程的id,這個id也是dataDir目錄下myid文件的內容。
host是該zk進程所在的IP地址,port1表示follower和leader交換消息所使用的端口,port2表示選舉leader所使用的端口。
dataDir
其配置的含義跟單機模式下的含義類似,不同的是集羣模式下還有一個myid文件。myid文件的內容只有一行,且內容只能爲1 - 255之間的數字,這個數字亦即上面介紹server.id中的id,表示zk進程的id。



            修改:dataDir=/usr/local/zookeeper-3.4.6/tmp
            在最後添加:
            server.1=master:2888:3888
            server.2=slave1:2888:3888
            server.3=slave2:2888:3888
            保存退出
            然後創建一個tmp文件夾
            mkdir /usr/local/zookeeper-3.4.6/tmp
            再創建一個空文件
            touch /usr/local/zookeeper-3.4.6/tmp/myid
            最後向該文件寫入ID
            echo 1 > /usr/local/zookeeper-3.4.6/tmp/myid
        1.3將配置好的zookeeper拷貝到其他節點(首先分別在slave1、slave2創建相應目錄:mkdir /usr/local)
            scp -r /usr/local/zookeeper-3.4.6/ slave1:/usr/local/
            scp -r /usr/local/zookeeper-3.4.6/ slave2:/usr/local/
            
            注意:修改slave1、slave2對應/usr/local/zookeeper-3.4.6/tmp/myid內容
            slave1:
                echo 2 > /usr/local/zookeeper-3.4.6/tmp/myid
            slave2:
                echo 3 > /usr/local/zookeeper-3.4.6/tmp/myid
    
    2.安裝配置hadoop集羣(在master上操作)下載鏈接爲zip,解壓命令換爲unzip,具體命令百度,可能要安裝該命令:https://download.csdn.net/download/Justdoforever/12487962
        2.1解壓
            tar -zxvf hadoop-2.4.0.tar.gz -C /usr/local/
        2.2配置HDFS(hadoop2.0以上所有的配置文件都在$HADOOP_HOME/etc/hadoop目錄下)
            #將hadoop添加到環境變量中
            vim /etc/profile
            export JAVA_HOME=/usr/java/jdk1.7.0_55
            export HADOOP_HOME=/usr/local/hadoop-2.4.0
            export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin


            #使變量生效

            source /etc/profile


            #hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下
            cd /usr/local/hadoop-2.4.0/etc/hadoop
            
            2.2.1修改hadoo-env.sh
                export JAVA_HOME=/usr/java/jdk1.7.0_55
                
            2.2.2修改core-site.xml
                <configuration>
                    <!-- 指定hdfs的nameservice爲master -->
                    <property>
                        <name>fs.defaultFS</name>
                        <value>hdfs://master:9000</value>
                    </property>

                   <property>
                      <name>dfs.nameservices</name>
                     <value>master</value>
                   </property>
                  <!--zookeeper配置-->

                  <property>

                           <name>ha.zookeeper.quorum</name>

                           <value>master:2181,slave1:2181,slave2:2181</value>

                    </property>

                    <!-- 指定緩存大小 -->
                    <property>
                                <name>io.file.buffer.size</name>
                                <value>131072</value>
                        </property>
                    <!-- 指定hadoop臨時目錄 -->
                    <property>
                        <name>hadoop.tmp.dir</name>
                        <value>/usr/local/hadoop-2.8.5/tmp</value>
                    </property>
                </configuration>
                

hadoop中有3個核心組件:

分佈式文件系統:HDFS —— 實現將文件分佈式存儲在很多的服務器上

分佈式運算編程框架:MAPREDUCE —— 實現在很多機器上分佈式並行運算

分佈式資源調度平臺:YARN —— 幫用戶調度大量的mapreduce程序,併合理分配運算資源


            2.2.3修改hdfs-site.xml
                <configuration>
                    <!--指定hdfs的nameservice爲master,需要和core-site.xml中的保持一致 -->
                    <property>
                        <name>dfs.nameservices</name>
                        <value>master</value>
                    </property>
                    <!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
                    <property>
                        <name>dfs.ha.namenodes.master</name>
                        <value>nn1,nn2</value>
                    </property>
                    <!-- nn1的RPC通信地址 -->
                    <property>
                        <name>dfs.namenode.rpc-address.master.nn1</name>
                        <value>192.168.1.201:9000</value>
                    </property>
                    <!-- nn1的http通信地址 -->
                    <property>
                        <name>dfs.namenode.http-address.master.nn1</name>
                        <value>192.168.1.201:50070</value>
                    </property>
                    <!-- nn2的RPC通信地址 -->
                    <property>
                        <name>dfs.namenode.rpc-address.master.nn2</name>
                        <value>192.168.1.202:9000</value>
                    </property>
                    <!-- nn2的http通信地址 -->
                    <property>
                        <name>dfs.namenode.http-address.master.nn2</name>
                        <value>192.168.1.202:50070</value>
                    </property>
                    <!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
                    <property>
                        <name>dfs.namenode.shared.edits.dir</name>
                        <value>qjournal://192.168.1.201:8485;192.168.1.202:8485;192.168.1.203:8485/master</value>
                    </property>
                    <!-- 指定JournalNode在本地磁盤存放數據的位置 -->
                    <property>
                        <name>dfs.journalnode.edits.dir</name>
                        <value>/usr/local/hadoop-2.8.5/journal</value>
                    </property>
                    <!-- 開啓NameNode失敗自動切換 -->
                    <property>
                        <name>dfs.ha.automatic-failover.enabled</name>
                        <value>true</value>
                    </property>
                    <!-- 配置失敗自動切換實現方式 -->
                    <property>
                        <name>dfs.client.failover.proxy.provider.master</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免登陸 注意一下標紅的路徑名,爲master登錄用戶的名字,不是hostname-->
                    <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>
            
            2.2.4修改mapred-site.xml
                <configuration>
                    <!-- 指定mr框架爲yarn方式 -->
                    <property>
                        <name>mapreduce.framework.name</name>
                        <value>yarn</value>
                    </property>
                </configuration>    
            

Yarn 框架相對於老的 MapReduce 框架什麼優勢呢?我們可以看到:

1. 這個設計大大減小了 JobTracker(也就是現在的 ResourceManager)的資源消耗,並且讓監測每一個 Job 子任務 (tasks) 狀態的程序分佈式化了,更安全、更優美。

2. 在新的 Yarn 中,ApplicationMaster 是一個可變更的部分,用戶可以對不同的編程模型寫自己的 AppMst,讓更多類型的編程模型能夠跑在 Hadoop 集羣中,可以參考 hadoop Yarn 官方配置模板中的 mapred-site.xml 配置。


3. 對於資源的表示以內存爲單位 ( 在目前版本的 Yarn 中,沒有考慮 cpu 的佔用 ),比之前以剩餘 slot 數目更合理。

4. 老的框架中,JobTracker 一個很大的負擔就是監控 job 下的 tasks 的運行狀況,現在,這個部分就扔給 ApplicationMaster 做了,而 ResourceManager 中有一個模塊叫做 ApplicationsMasters( 注意不是 ApplicationMaster),它是監測 ApplicationMaster 的運行狀況,如果出問題,會將其在其他機器上重啓。


5. Container 是 Yarn 爲了將來作資源隔離而提出的一個框架。這一點應該借鑑了 Mesos 的工作,目前是一個框架,僅僅提供 java 虛擬機內存的隔離 ,hadoop 團隊的設計思路應該後續能支持更多的資源調度和控制 , 既然資源表示成內存量,那就沒有了之前的 map slot/reduce slot 分開造成集羣資源閒置的尷尬情況。


            2.2.5修改yarn-site.xml
                <configuration>
                    <!-- 指定resourcemanager地址 -->
                    <property>
                        <name>yarn.resourcemanager.hostname</name>
                        <value>master</value>
                    </property>
                    <!-- 指定nodemanager啓動時加載server的方式爲shuffle server -->
                    <property>
                        <name>yarn.nodemanager.aux-services</name>
                        <value>mapreduce_shuffle</value>
                    </property>
                </configuration>
            
                
            2.2.6修改slaves(slaves是指定子節點的位置,因爲要在itcast01上啓動HDFS、在itcast03啓動yarn,所以itcast01上的slaves文件指定的是datanode的位置,itcast03上的slaves文件指定的是nodemanager的位置)
                slave1
                slave2
              
        
        2.4將配置好的hadoop拷貝到其他節點
            scp -r /usr/local/hadoop-2.4.0/ slave1:/usr/local/
            scp -r /usr/local/hadoop-2.4.0/ slave2:/usr/local/

       拷貝完要配置環境,slave1 slave2        

           #將hadoop添加到環境變量中
            vim /etc/profile
            export JAVA_HOME=/usr/java/jdk1.7.0_55
            export HADOOP_HOME=/usr/local/hadoop-2.4.0
            export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin


            #使變量生效

            source /etc/profile

        ###注意:嚴格按照下面的步驟
        2.5啓動zookeeper集羣(分別在master、slave1、slave2上啓動zk)
            cd /usr/local/zookeeper-3.4.5/bin/
            ./zkServer.sh start
            #查看狀態:一個leader,兩個follower
            ./zkServer.sh status
            
        2.6啓動journalnode(分別在在master、slave1、slave2上執行)
            cd /usr/local/hadoop-2.4.0
            sbin/hadoop-daemon.sh start journalnode
            #運行jps命令檢驗,master、slave1、slave2上多了JournalNode進程


     

1〉上面在Active Namenode與StandBy Namenode之間的綠色區域就是JournalNode,當然數量不一定只有1個,作用相當於NFS共享文件系統.Active Namenode往裏寫editlog數據,StandBy再從裏面讀取數據進行同步.


2〉 NameNode之間共享數據(NFS 、Quorum Journal Node(用得多))


3〉兩個NameNode爲了數據同步,會通過一組稱作JournalNodes的獨立進程進行相互通信。當active狀態的NameNode的命名空間有任何修改時,會告知大部分的JournalNodes進程。standby狀態的NameNode有能力讀取JNs中的變更信息,並且一直監控edit log的變化,把變化應用於自己的命名空間。standby可以確保在集羣出錯時,命名空間狀態已經完全同步了。


4〉 Hadoop中的NameNode好比是人的心臟,非常重要,絕對不可以停止工作

 

   
        2.7格式化HDFS
            #在master上執行命令: hdfs namenode -format
            #格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這裏我配置的是/usr/local/hadoop-2.4.0/tmp,然後將/usr/local/hadoop-2.4.0/tmp拷貝到slave1的/usr/local/hadoop-2.4.0/下。
            scp -r tmp/ slave1:/usr/local/hadoop-2.4.0/
        
        2.8格式化ZK(在master上執行即可)
            hdfs zkfc -formatZK
        
        2.9啓動HDFS(在master上執行)
            sbin/start-dfs.sh

        2.10啓動YARN(在master上操作)
            sbin/start-yarn.sh

        
    到此,hadoop-2.8.5配置完畢,可以統計瀏覽器訪問:
        http://192.168.1.201:50070
        NameNode 'itcast01:9000' (active)
        http://192.168.1.202:50070
        NameNode 'itcast02:9000' (standby)

至此搞定hadoop~恭喜你也完成了。

最開始hbase用的1.1.5後面查資料,發現不兼容,後選1.5.0

wget http://archive.apache.org/dist/hbase/1.5.0/hbase-1.5.0-bin.tar.gz

一定記得同步三臺機器時間 

1.上傳hbase安裝包

2.解壓

3.配置hbase集羣,要修改3個文件(首先zk集羣已經安裝好了)
    注意:要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下
    
    3.1修改hbase-env.sh
    export JAVA_HOME=/usr/java/jdk1.7.0_80
    //告訴hbase使用外部的zk 
    export HBASE_MANAGES_ZK=false
    
    3.1修改hbase-site.xml
        vim hbase-site.xml

    <configuration>
        <!-- 指定hbase在HDFS上存儲的路徑 -->
               <property>
                       <name>hbase.rootdir</name>
                    <value>hdfs://192.168.1.201:9000/hbase</value>
            </property>
        <!-- 指定hbase是分佈式的 -->
            <property>
                    <name>hbase.cluster.distributed</name>
                    <value>true</value>
            </property>
        <!-- 指定zk的地址,多個用“,”分割 -->
            <property>
                    <name>hbase.zookeeper.quorum</name>
                    <value>master:2181,slave1:2181,slave2:2181</value>
            </property>
    </configuration>
    
    vim regionservers
    master
    slave1
    slave2
    
    3.2拷貝hbase到其他節點
        scp -r /usr/local/hbase-0.96.2-hadoop2/ slave1:/usr/local/
        scp -r /usr/local/hbase-0.96.2-hadoop2/ slave2:/usr/local/

4.將配置好的HBase拷貝到每一個節點並同步時間。

5.啓動所有的hbase
    分別啓動zk
        ./zkServer.sh start
    啓動hbase集羣
        start-dfs.sh
    啓動hbase,在主節點上運行:
        start-hbase.sh
6.通過瀏覽器訪問hbase管理頁面
    192.168.1.201:16010
7.爲保證集羣的可靠性,要啓動多個HMaster
    hbase-daemon.sh start master
    

 

自此大功告成,花費了我5天時間, 太難了,以後裝軟件之間一定要考慮版本兼容性問題。共勉!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章