1. 程式人生 > >利用hadoop-2.5.0-cdh5.3.6版本,搭建完全分散式HA詳細記錄(怕忘)

利用hadoop-2.5.0-cdh5.3.6版本,搭建完全分散式HA詳細記錄(怕忘)

我就按照自己的思路寫,可能步驟不一定正確

1、在搭建完全 分散式叢集時,首先要保證我們的三臺機子的時間同步,所以我們需要同步一臺時間伺服器,我的三臺虛擬機器分別為如下hostname

-->make.hadoop.com        第一臺

-->make.hadoop2.com      第二臺

-->make.hadoop3.com      第三臺

1、首先我們把第一臺機器當做我們的同步時間的伺服器,按步驟操作,即Hadoop2跟Hadoop3同步hadoop機器上的時間

開啟我們第一臺機器的ntpd時間服務,其他的兩臺機器不用開

1.1-->sudo service ntpd status  

1.2-->sudo service ntpd start  

1.3-->開機自動啟動設定(在第一臺設定,其他不要設定)

        -->sudo chkconfig ntpd on

1.4修改配置檔案   vi /etc/ntp.conf,其中只有三處需要做修改,如下圖


箭頭1處,將前面的註釋去掉,並把網段修改為自己的網段,2處,因為這裡為內網環境不用開啟服務,這裡的三個server直接 註釋掉,3處,開啟本地服務,直接將前面的#號去掉,到此處 第一臺機器的配置就寫好了,我們重啟服務,sudo service ntpd restart,

1.5我們試著去其他兩臺機器,同步一下時間,並設定自動同步的任務 ,

-->在其他兩臺機器上執行同步命令    sudo /usr/sbin/ntpdate make.hadoop.com     誤差基本能保持在1s之內

-->設定定時任務crontab  -e   進入任務編輯介面,這裡直接將我的貼出來    0-59/10 * * * * /usr/sbin/ntpdate make.hadoop.com    這裡不知道指令碼的位置 ,可以用which檢視一下位置,到這三臺機器的時間同步就設定好了。

2、下面的圖為我的伺服器節點的叢集規劃,我的叢集是按照這個節點進行搭建的


2.1、HA的完全搭建,我們首先要安裝Zookeeper,下載Zookeeper的tar.gz壓縮包,並對其解壓,解壓後我們來看看它的目錄結構,並對配置檔案做一定的修改。(單節點)


我們先對conf下的zooxxx.cfg重新命名為coo.cfg,對coo.cfg檔案進行修改配置(此處為單節點的配置,為了初始化datadir)


dataDir=/opt/module/distribute/HA/zookeeper-3.4.5-cdh5.3.6/data/zkdata這個是zk的本地資料存放目錄,自己隨意指定,能記住就是OK的。然後我們啟動zk節點,因為我已經配置了分散式,這裡就不演示了。

-->bin/zkServer.sh start  節點的名稱為    QuorumPeerMain    現在可以啟動zk的客戶端看一下他的目錄,可以看到只有一個檔案,因為這個時候我們hadoop節點還沒有配置上去,不過我們在啟動的時候已經生成了我們剛剛自己配置好的路徑。

2.2、接下來我們配置分散式的zookeeper,還是對coo.cfg檔案進行修改,只不過這裡會新增一點東西


2181表示客戶端埠號、2888表示ZK節點內部通訊埠號、3888表示ZK內部選舉埠號,這裡的server.1、server.2、server.3對應的是每臺機器,現在我們需要在剛剛配置的路徑下面,新建一個名叫myid的檔案,,裡面的內容就是對應機器的server後面的id,我這裡就是1、2、3,你們也可以是a、b、c。現在我們將配置好的zookeeper分發到其他機器

-->scp -r zookeeper-3.4.5-cdh5.3.6/ make.hadoop2.com:/opt/moudle/distribute/HA

-->scp -r zookeeper-3.4.5-cdh5.3.6/ make.hadoop3.com:/opt/moudle/distribute/HA

分發完成之後,將對應的myid檔案改成自己機器對應 的id.

2.3、啟動所有的zk節點,每臺機器都要啟動,三臺全部啟動後,檢視每臺機器的狀態

-->bin/zkServer.sh start

-->bin/zkServer.sh status  這裡應該有一個leader,兩個follower,如圖,我的第二臺機器就是leader,關於zk的內部選舉機制,可以自己去了解,我也要去了解的,到這裡zookeeper的部分就配置完了



                                                                                                        


3、對hadoop的檔案配置,因為對hadoop配置檔案的修改,我們在偽分散式的搭建下就已經說過,這裡就簡單說一下

3.1、對hadoop-env,mapred-env,yarn-env.sh檔案,指定你自己的JAVA_HOME

-->修改slaves,新增你自己叢集裡的所有機器的hostname

make.hadoop.com
make.hadoop2.com

make.hadoop3.com

接下來把四個配置檔案的內容貼出來

core-cite.xml
<configuration>  
<property>  
    <name>fs.defaultFS</name>  
    <value>hdfs://ns1</value>  
<!--這裡為叢集的通用入口-->
</property>  
<property>  
    <name>hadoop.tmp.dir</name>  
    <value>/opt/module/distribute/HA/hadoop-2.5.0-cdh5.3.6/data/tmp</value>  
</property>  
<property>  
    <name>hadoop.http.staticuser.user</name>  
    <value>make</value>  
</property>  
<property>  
    <name>ha.zookeeper.quorum</name>  
    <value>make.hadoop.com:2181,make.hadoop2.com:2181,make.hadoop3.com:2181</value>  
</property>  
</configuration> 

hdfs-site.xml 
<configuration>  
<property>  
    <name>dfs.replication</name>  
    <value>3</value>  
</property>  
<property>  
    <name>dfs.permissions.enabled</name>  
    <value>false</value>  
</property>  
<property>  
    <name>dfs.nameservices</name>  
    <value>ns1</value>  
</property>  
<property>  
    <name>dfs.blocksize</name>  
    <value>134217728</value>  
</property>  
<property>  
    <name>dfs.ha.namenodes.ns1</name>  
    <value>nn1,nn2</value>  
</property>  
<!-- nn1的RPC通訊地址,nn1所在地址  -->  
<property>  
    <name>dfs.namenode.rpc-address.ns1.nn1</name>  
    <value>make.hadoop.com:8020</value>  
</property>  
<!-- nn1的http通訊地址,外部訪問地址 -->  
<property>  
    <name>dfs.namenode.http-address.ns1.nn1</name>  
    <value>make.hadoop.com:50070</value>  
</property>  
<!-- nn2的RPC通訊地址,nn2所在地址 -->  
<property>  
    <name>dfs.namenode.rpc-address.ns1.nn2</name>  
    <value>make.hadoop2.com:8020</value>  
</property>  
<!-- nn2的http通訊地址,外部訪問地址 -->  
<property>  
    <name>dfs.namenode.http-address.ns1.nn2</name>  
    <value>make.hadoop2.com:50070</value>  
</property>  
<!-- 指定NameNode的元資料在JournalNode日誌上的存放位置(一般和zookeeper部署在一起) -->  
<property>  
    <name>dfs.namenode.shared.edits.dir</name>  
    <value>qjournal://make.hadoop.com:8485;make.hadoop2.com:8485;make.hadoop3.com:8485/ns1</value>  
</property>  
<!-- 指定JournalNode在本地磁碟存放資料的位置 -->  
<property>  
    <name>dfs.journalnode.edits.dir</name>  
    <value>/opt/module/distribute/HA/hadoop-2.5.0-cdh5.3.6/data/journal</value>  
</property>  
<!--客戶端通過代理訪問namenode,訪問檔案系統,HDFS 客戶端與Active 節點通訊的Java 類,使用其確定Active 節點是否活躍  -->  
<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</value>     ----這個引數的值可以有多種,你也可以換成shell(/bin/true)試試,也是可以的,這個指令碼do nothing 返回0  
</property>  
<!-- 這個是使用sshfence隔離機制時才需要配置ssh免登陸 -->  
<property>  
    <name>dfs.ha.fencing.ssh.private-key-files</name>  
    <value>/home/make/.ssh/id_rsa</value>  
</property>  
<!-- 配置sshfence隔離機制超時時間,這個屬性同上,如果你是用指令碼的方法切換,這個應該是可以不配置的 -->  
<property>  
    <name>dfs.ha.fencing.ssh.connect-timeout</name>  
    <value>30000</value>  
</property>  
<!-- 這個是開啟自動故障轉移,如果你沒有自動故障轉移,這個可以先不配,在切換時必須使用手動切換 -->  
<property>  
    <name>dfs.ha.automatic-failover.enabled</name>  
    <value>true</value>  
</property>  


</configuration>  
mapered-site.xml
<configuration>  
<property>  
        <name>mapreduce.framework.name</name>  
        <value>yarn</value>  
</property>  
<property>  
    <name>mapreduce.jobhistory.address</name>  
    <value>make.hadoop.com:10020</value>  
</property>  
<property>  
    <name>mapreduce.jobhistory.webapp.address</name>  
    <value>make.hadoop.com:19888</value>  
</property>  
</configuration>  
yarn-site.xml
<configuration>  
    <property>  
        <name>yarn.nodemanager.aux-services</name>  
        <value>mapreduce_shuffle</value>  
    </property>  
    <property>  
        <name>yarn.resourcemanager.hostname</name>  
        <value>make.hadoop3.com</value>  
    </property>  
    <property>  
        <name>yarn.log-aggregation-enable</name>  
        <value>true</value>  
    </property>  
        <property>  
        <name>yarn.log-aggregation.retain-seconds</name>  
        <value>106800</value>  
    </property>  
</configuration> 

到這裡我們的配置檔案就都配置好了,然後一樣的把這個分發出去,然後把 share/doc的檔案刪掉,因為太大,佔資源

-->scp -r hadoop-2.5.0-cdh5.3.6/ make.hadoop2.com:/opt/moudle/distribute/HA

-->scp -r hadoop-2.5.0-cdh5.3.6/ make.hadoop3.com:/opt/moudle/distribute/HA

3.2、這裡我們已經啟動了zookeeper服務,然後啟動三臺journalnode(這個是用來同步兩臺namenode的資料的)

-->sbin/hadoop-daemon.sh start journalnode

3.3、操作namenode(只要格式化一臺,另一臺進行同步,不能兩臺都格式化,那樣是錯的!)
-->格式化第一臺:bin/hdfs namenode -format
-->啟動剛格式化好的namenode:sbin/hadoop-deamon.sh start namenode

-->在第二臺機器上同步namenode的資料:bin/hdfs namenode -bootstrapStandby                                                            -->啟動第二臺的namenode:sbin/hadoop-deamon.sh start namenode

3.4、這裡其實可以直接開啟你的hdfs的web 端看一看,應該有一臺是active,一臺standby,如圖



3.5、其實到這裡,我們的namenode的一個HA就做完了,可以進行故障自動轉移,可以做一個測試,把目前處於active的機器的namenode程序殺掉,那麼另一個standby的機器會立刻切換過來active,負責對外提供服務,到此你的HA自動故障轉移已經完成了。

4、留一個思考,如果我們的namenode、zk這臺機器,發生一種很少見的情況,比如直接關機,直接斷網(網絡卡壞掉),那麼我們的自動故障轉移,還能不能發揮作用,這個答案我們後面來補充(其實也是老師給我們講的啦,買個關子,順便自己也思考一下),我們另一個namenode能不能切換過來呢?