官方參考 配置 地址 :http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
一、
在Hadoop-senior.zuoyan.com 的主機上
首先將Hadoop安裝目錄下 etc下的hadoop的配置文件進行備份 使用命令: cp -r hadoop dist-hadoop
然后在Hadoop安裝目錄下 data 文件夾內 將tmp 文件夾 重命名 使用命令 : mv tmp dits-tmp ,重命名完成后,在創建一個文件夾 mkdir tmp
然后在其余的 兩台主機上也重復這個操作
將hadoop安裝目錄下的etc下的hadoop的所有配置文件復制文件為 dist-hadoop 然后再Hadoop的主安裝目錄中的data 下的 tmp 目錄重命名為 dist-tmp 然后在創建新的數據存放目錄
說明:圖片中使用的命令有錯誤,不應該是重命名hadoop 而應該是重新復制文件,將復制文件的名字設置為 dist-hadoop

二、修改配置文件
打開core-site.xml 和 hdfs-site.xml 文件
在core-site.xml 文件中配置
因為是NameNode 的高可用行,配制兩台機器的NameNode ,需要修改這個,所以需要配置成集群

在hdfs-site.xml 配置文件中配制:
首先去除掉
<!--配置secondary namenode 所在的主機-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop-senior03.zuoyan.com:50090</value>
</property>
在 /opt/app/hadoop2.5.0/data 目錄下創建文件夾 dfs/jn 用來存放NameNode的 日志信息

然后在從hdfs-site.xml 文件中配置
<!--配置Hadoop NameNode 的HA -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- NameNode RPC Adress -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hadoop-senior.zuoyan.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop-senior02.zuoyan.com:8020</value>
</property>
<!-- 配置 WEB 界面的 訪問地址和端口 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop-senior.zuoyan.com:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop-senior02.zuoyan.com:50070</value>
</property>
<!--配置 NameNode Shared EDITS Address 和NameNode 日志文件存放的位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop-senior.zuoyan.com:8485;hadoop-senior02.zuoyan.com:8485;hadoop-senior03.zuoyan.com:8485/ns1</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/app/hadoop-2.5.0/data/dfs/jn</value>
</property>
<!-- 配置 HDFS PROXY Client -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--配置兩個 NameNode的隔離機制 -->
<!-- 使用的方式是 ssh-fence 要求是兩個NameNode 之間能夠無密碼登錄 兩個主機之間能互相ssh無密鑰登錄 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/beifeng/.ssh/id_rsa</value>
</property>
配置好 主機一(hadoop-senior.zuoyan.com) 需要將配置文件進行同步
使用命令 scp -r etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml etc/hadoop/slaves beifeng@hadoop-senior02.zuoyan.com:/opt/app/hadoop-2.5.0/etc/hadoop/

開始啟動QJM HA:
完成后,分別啟動三個節點的journalnode 使用命令: sbin/hadoop-daemon.sh start journalnode 每個節點啟動后 使用jps查看一下進程,看任務是否啟動

可以查看一下啟動日志(這個步驟不是必須要做的 可以看見journalnode 的啟動日志):

在NameNode1節點上 對文件系統進行格式化,產生fsimage 文件 使用命令 : bin/hdfs namenode -format 然后再啟動NameNode


在NameNode1 上啟動namenode 使用命令 : bin/hadoop-daemon.sh start namenode

之后在NameNode2 上同步NameNode1 的元數據信息
使用命令:bin/hdfs namenode -bootstrapStandby


可以看到復制鏡像文件是從Hadoop-senior.zuoyan.com 上拷貝

然后啟動NameNode2 使用命令: sbin/hadoop-daemon.sh start namenode

然后分別訪問這兩個主機的50070 發現如果可以訪問 就初步配置成功

然后啟動所有機器上的DataNode 使用命令:sbin/start-dfs.sh (也可以使用命令 一個個啟動 sbin/hadoop-daemon.sh start datanode 我這里省事,就所有機器的都啟動)
打開WEB界面 發現兩個NameNode 都可以進行管理 這樣就是配置成功!!!

使用命令將第一個節點改變為活躍狀態,使用命令: bin/hdfs haadmin -transitionToActive nn1
(可以看到這個NameNode 節點 已經改變為活躍狀態)

也可以通過命令 來查看節點的狀態 (可以看到這兩個主機 一個是active 一個是 standby)

現在查看一下 HDFS文件系統上的文件 來進行測試NameNode
(下面沒有打印出文件 這個上面說沒有找到ns1 這個原因技就是我們在配置Proxy的時候 沒有改變myclsur)

下面這個內容配置錯誤的原因,我現在已經更改過來了

更改完成后,在執行一下 (就可以看見文件目錄已經循環出來了)

使用命令創建文件目錄

將文件上傳到文件系統上

通過文件管理的web界面進行查看 (就會發現文件已經上傳成功)

然后 在測試HA的讀取功能 使用命令: bin/hdfs dfs -text /user/zuoyan/conf/core-site.xml
文件已經成功 正常的被讀取出來了

然后通過命令 將 nn1 切換稱 standby 將nn2 切換成 active
將節點切換成Standby的命令 :bin/hdfs haadmin -transitionToStandby nn1
將節點切換成Active 的命令 : bin/hdfs haadmin -transitionToActive nn2

切換之后在用NameNode 1 去讀取HDFS上的文件 測試 是否能正常讀取文件
(切換之后已經正常的讀取出來了,證明節點切換 對集群是沒有影響的)

完成到這樣 HDFS的高可用 已經初步搭建好了
