15hadoopHA——好程序

下面這個就是yarn的高可用,ResourceManager可以有無數個

 


日記的管理方式發生了改變——單個namenode的模式,日記文件是直接寫到namenode裏面就可以了。現在要實現的是高可用的模式,高可用就需要兩臺namenode,而且管理模式是一樣的,引入了兩臺那麼日記文件就必須要實現共享與同步,既然要實現共享,一個是namenode之間點對點的連接,但是namenode的是高併發的模式,本身任務就很多,不可能隨意的增加功能,則就纔有第二個方法:需要新增加一層,以供兩個namenode去獲取日記,這層和zookeeper的功能模式差不多,都能解決單點故障的問題出現,加入journalnode(文件管理機制)這層第三方存儲系統,管理文件日記。文件服務器的架構和zookeeper的架構是一樣的,選舉模式,奇數臺。選舉老大。
數據的同步問題,namenode的日記同樣改變了回滾策略,回滾的文件直接同步到journalnode,一臺是active(可讀寫),一臺是standby(只能讀取),seocendery就不需要了,操作日記記錄的是塊上傳的操作,一個文件一百個塊,就記錄一百次操作,就有一百個edit文件,但在fsimager裏面記錄的是元數據,目錄數,所以日記比鏡像大,鏡像是採用塊照的方式,這樣是爲了避免掛了後再重啓,加載的時間不長,只需要加載這個塊照+這個操作日記,不需要加載所有的操作日記,checkpoint就由standby這臺namenode進行負責。(操作日記記錄的是塊的上傳操作,checkpoint的是這個塊的記錄)

狀態的切換——每一臺namenode都會啓動一個zkfc組件(兩個是一起的),zkfc狀態都會和zookeeper去協調,當active這臺的namenode後掛了,則此臺zkfc就會通知zookeeper將子節點刪除,
此臺namenode的子節點被刪除了,另一臺standby狀態的namenode的zkfc就知道了,就要做準備工作,完成一系列的功能(namenode要管理元數據,元數據在內存裏,在切換前,要加載鏡像和
操作日記得出元數據過來)。但是要預防腦裂的情況(預防腦裂的方式有兩種:1、當出現問題的時候,另一臺zkfc會執行一個kill當前這臺active這臺namenode的命令,2、用戶自定義的腳
本直接殺掉掛的這臺namenode)
 

 

高可用安裝、配置

vi hdfs-site.xml

<configuration>
<!--配置副本數-->
<property>
  <name>dfs.replication</name>
  <value>3</value>
</property>
<!--是否開啓hdfs文件系統的權限-->
<property>
  <name>dfs.permissions.enabled</name>
  <value>false</value>
</property>
<!--元數據存放目錄-->
<property>
  <name>dfs.namenode.name.dir</name>
  <value>/usr/local/hadoopdata/dfs/name</value>
</property>

<!--數據內容存放目錄-->
<property>
  <name>dfs.datanode.data.dir</name>
  <value>/usr/local/hadoopdata/dfs/data</value>
</property>

<!--是否啓用webhdfs (rest api)-->
<property>
  <name>dfs.webhdfs.enabled</name>
  <value>true</value>
</property>

<!--配置虛擬服務名-->
<property>
  <name>dfs.nameservices</name>
  <value>gp1923</value>
</property>
<!--爲虛擬服務名指定namenode別名-->
<property>
  <name>dfs.ha.namenodes.gp1923</name>
  <value>aa1,aa2</value>
</property>
<!--爲namenode別名指定通信地址-->
<property>
  <name>dfs.namenode.rpc-address.gp1923.aa1</name>
  <value>hadoop0001:9000</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.gp1923.aa2</name>
  <value>hadoop0002:9000</value>
</property>
<!--配置aa1、aa2的web ui監控地址-->
<property>
  <name>dfs.namenode.http-address.gp1923.aa1</name>
  <value>hadoop0001:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.gp1923.aa2</name>
  <value>hadoop0002:50070</value>
</property>
<!--配置journalnode通信地址-->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://hadoop0001:8485;hadoop0002:8485;hadoop0003:8485/gp1923</value>
</property>
<!--配置失敗轉移的java類-->
<property>
  <name>dfs.client.failover.proxy.provider.gp1923</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>

    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/root/.ssh/id_rsa</value>
    </property>
<!--設置ssh fencing操作超時時間-->
    <property>
      <name>dfs.ha.fencing.ssh.connect-timeout</name>
      <value>30000</value>
    </property>
<!--存儲journalnode本地路徑-->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/usr/local/hadoopdata/journalnode/data</value>
</property>

<!--是否開啓自動失敗轉移-->
 <property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>
</configuration>

 vi core-site.xml

<configuration>
<!--虛擬服務名-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://gp1923</value>
</property>
<!--指定zk集羣地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop0001:2181,hadoop0002:2181,hadoop0003:2181</value>
</property>

<property>
  <name>io.file.buffer.size</name>
  <value>4096</value>
</property>
</configuration>

vi yarn-site.xml


<configuration>

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

<!--是否啓動yarn的rm的HA功能-->
<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
</property>

<!--是否開啓失敗自動轉移-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

<!--yarn的rm的HA的服務ID-->
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>gp1923yarn</value>
</property>
<!--yarn的rm的HA的服務ids的邏輯rmid的列表-->
<property>
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
</property>
<!--爲邏輯rm1配置所啓動的主機-->
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>hadoop0001</value>
</property>
<!--爲邏輯rm2配置所啓動的主機-->
<property>
  <name>yarn.resourcemanager.hostname.rm2</name>
  <value>hadoop0002</value>
</property>
<!--爲邏輯rm1配置web ui監控端口-->
<property>
  <name>yarn.resourcemanager.webapp.address.rm1</name>
  <value>hadoop0001:8088</value>
</property>
<!--爲邏輯rm2配置web ui監控端口-->
<property>
  <name>yarn.resourcemanager.webapp.address.rm2</name>
  <value>hadoop0002:8088</value>
</property>
<!--配置zk集羣所在主機-->
<property>
  <name>yarn.resourcemanager.zk-address</name>
  <value>hadoop0001:2181,hadoop0002:2181,hadoop0003:2181</value>
</property>
</configuration>

但是需要注意的是hdfs-site.xml的虛擬服務器名和core-site.xml的虛擬服務器名要一致 

 

1、進入到etc二進制文件裏面修改配置

2、將修改完的配置分發到其他節點上

 

當上述操作完成後,以下需要嚴格按照步驟進行

第一步,先啓動zookeeper腳本

(這裏編輯一個批量啓動腳本)

賦予X權限

 直接運行啓動腳本

同時編輯一個批量停止腳本

運行批量停止腳本

但是報錯了

SSH是不會加載配置文件的,所以需要在前加source +環境變量,將Java環境引進來

查看啓動後的狀態,這個hadoop0001是follower

 到此,第一步就已經完成。

 

第二步啓動journalnode

通過jps查看是否啓動起來

到此,第二步完成了

 

第三步初始化NameNode

但是先將以前的路徑刪除

格式化其中一臺老大

 

第四步,先啓動老大這臺NameNode

然後就是先啓動hadoop0001的namenode

用jps查看是否啓動

 

第五步將初始元數據共享給另一個老大hadoop0002,有兩種方法:

方法一:直接拷貝

方法二:通過hdfs命令,把它啓動到standby裏面,就是初始化standby

 

第六步格式化zkfc

打開網頁,輸入連接查看

 

(防火牆與時間同步等都需要提前處理好)

關閉防火牆

時間統一

 

可以先全部停止

 

再重新啓動zookeeper,然後在用全啓動

 

 

嚴格按照步驟操作:
1、啓動zookeeper
2、啓動journalnode
3、格式化hdfs
hdfs namenode -format 
先啓動hadoop0001上的namenode

共享數據
1、拷貝
scp -r /home/hdfsdata/ root@hadoop0002:/home/
2、通過hdfs命令
bin/hdfs namenode -bootstrapStandby


4、格式化zkfc
hdfs zkfc -formatZK

5、啓動
hdfs dfs
     dfsadmin 
     namenode 
     zkfc 
     haadmin -

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