配置Hadoop的高可用
阿新 • • 發佈:2018-11-01
配置Hadoop的高可用
一、準備
-
1、配置好Hadoop、JDK,兩臺namenode機器可以ssh免密登陸其他機器等
-
2、規劃三臺虛擬機器(hadoop01,hadoop02, hadoop03)
active/standby namenode 與zkfc :hadoop01和hadoop02
JN叢集:三臺虛擬機器都參與
zk叢集:三臺虛擬機器都參與
datanode與nodemanager:三臺虛擬機器都參與
resourcemanager:hadoop03
二、配置
-
1、修改core-site.xml檔案
vi core-site.xml #新增
-
2、修改hdfs-site.xml檔案
#新建目錄 用來儲存namenode資訊(路徑自定義)
mkdir -p /opt/data/hadoop/hdfs/namenode
#新建目錄 用來儲存datanode資訊(路徑自定義)
mkdir -p /opt/data/hadoop/hdfs/datanode
#新建目錄 用來儲存journalnode資訊(路徑自定義)
mkdir -p /opt/data/hadoop/jn/data
vi hdfs-site.xml
#新增
<!-- ~~~~~~~~~~~~~~~~~~~ HDFS常規配置 ~~~~~~~~~~~~~~~~~~~ -->
<!-- HDFS中Namenode元資料儲存在本地檔案系統的位置 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/data/hadoop/hdfs/namenode</value>
</property>
<!-- HDFS中Datanode資料塊儲存在本地檔案系統的位置 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/data/hadoop/hdfs/datanode</value>
</property>
<!-- HDFS中資料塊的副本數量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- ~~~~~~~~~~~~~~~~~~~ HDFS HA配置 ~~~~~~~~~~~~~~~~~~~ -->
<!-- 此新名稱服務的邏輯名稱
HDFS的名稱服務的邏輯名稱 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- dfs.ha.namenodes.[nameservice ID] - nameservice中每個NameNode的唯一識別符號
配置逗號分隔的NameNode ID列表。DataNodes將使用它來確定叢集中的所有NameNode -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- dfs.namenode.rpc-address.[nameservice ID].[name node ID] - 要監聽的每個NameNode的完全限定RPC地址
對於兩個先前配置的NameNode ID,請設定NameNode程序的完整地址和IPC埠 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop02:8020</value>
</property>
<!-- dfs.namenode.http-address.[nameservice ID].[name node ID] - 要監聽的每個NameNode的完全限定HTTP地址
與上面的rpc-address類似,設定兩個NameNodes的HTTP伺服器的地址以進行監聽 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop02:50070</value>
</property>
<!-- dfs.namenode.shared.edits.dir - 標識NameNodes將寫入/讀取編輯的JN組的URI
這是一個配置JournalNodes地址的地方,它提供共享編輯儲存,由Active nameNode寫入並由Standby NameNode讀取,以保持Active NameNode所做的所有檔案系統更改的最新狀態。雖然您必須指定多個JournalNode地址,但您應該只配置其中一個URI。URI的格式應為:qjournal://host1:port1;host2:port2;host3:port3/journalId。JournalID是此nameservice的唯一識別符號,它允許一組JournalNode為多個聯合名稱系統提供儲存。 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
</property>
<!-- dfs.journalnode.edits.dir - JournalNode守護程式將儲存其本地狀態的路徑
這是JournalNode計算機上的絕對路徑,其中將儲存JN使用的編輯和其他本地狀態。 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/data/hadoop/jn/data</value>
</property>
<!-- 啟用自動失敗轉移機制 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- dfs.client.failover.proxy.provider.[nameservice ID] - HDFS客戶端用於聯絡Active NameNode的Java類
配置Java類的名稱,DFS客戶端將使用該名稱來確定哪個NameNode是當前的Active,以及哪個NameNode當前正在為客戶端請求提供服務。目前Hadoop附帶的兩個實現是ConfiguredFailoverProxyProvider和RequestHedgingProxyProvider(對於第一次呼叫,它同時呼叫所有名稱節點以確定活動的名稱,並在後續請求中呼叫活動的名稱節點,直到發生故障轉移) -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 指令碼或Java類的列表,用於在故障轉移期間遮蔽 Active NameNode
對於系統的正確性,期望在任何給定時間只有一個NameNode處於活動狀態。重要的是,在使用Quorum Journal Manager時,只允許一個NameNode寫入JournalNodes,因此不存在從裂腦情況中破壞檔案系統元資料的可能性。但是,當發生故障轉移時,以前的Active NameNode仍可能向客戶端提供讀取請求,這可能已過期,直到NameNode在嘗試寫入JournalNode時關閉。因此,即使使用Quorum Journal Manager,仍然需要配置一些防護方法。但是,為了在防護機制失敗的情況下提高系統的可用性,建議配置防護方法,該方法可保證作為列表中的最後一個防護方法返回成功。請注意,如果您選擇不使用實際的防護方法,則仍必須為此設定配置某些內容,例如“ shell(/ bin / true) ”。
故障轉移期間使用的防護方法配置為回車分隔列表,將按順序嘗試,直到指示防護成功為止 -->
<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>
<!-- fs.defaultFS - Hadoop FS客戶端在沒有給出時使用的預設路徑字首
可選)您現在可以配置Hadoop客戶端的預設路徑以使用新的啟用HA的邏輯URI。 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
-
3、修改slave檔案
為什麼要修改呢?這裡更改了要求,要求有三臺datanode,用來投票,滿足奇數臺
vi /etc/slave #可以都改為 localhost #或者是改為 hadoop01 hadoop02 hadoop03
三、啟動
- 0.首先停止叢集
stop-all.sh
- 1.在ZooKeeper中初始化所需的狀態。可以從任意一個NameNode主機執行以下命令來執行此操作。
hdfs zkfc -formatZK
#這將在zookeeper中建立一個znode,其中儲存的是自動故障轉移相關的資料
#不管過程中顯示的資訊如何,只要能看到如下資訊即可:
#$Successful created /hadoop-ha/mycluster in ZK
- 啟動journalnode,在每個配置了JN主機上啟動JN
hadoop-daemon.sh start journalnode
#啟動完JN程序後稍等2分鐘左右再進行下述操作
3.格式化HDFS 在第一個namenode上執行
hdfs namenode -format
4.在第一個namenode上啟動hdfs叢集
start-dfs.sh #注意:這時候第二個namenode程序可能會起不來
5.去第二個namenode上同步第一個namenode上的資料
hdfs namenode -bootstrapStandby
6.單獨在第二個namenode上啟動或在第一個namenode所在的機器上執行HDFS叢集啟動命令
建議第二種方式:
start-dfs.sh //注意在這裡會有很多程序已經啟動了,忽略之
四、測試
開啟hadoop01:50070
主動殺死處於active狀態的namenode程序,檢視另一個namenode的狀態是否變為active狀態。