1. 程式人生 > >配置Hadoop的高可用

配置Hadoop的高可用

配置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
    #新增
    <!-- 指定在Hadoop中要使用的檔案系統 --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- zookeeper叢集地址資訊 --> <property> <name>ha.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181<
    /value> </property> <!-- HDFS中sequenceFiles中使用的讀/寫緩衝區的大小 --> <property> <name>io.file.buffer.size</name> <value>131072</value> </property>
  • 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
  1. 啟動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狀態。