即上篇文章Hadoop基礎(chǔ)之HA(高可用)之后民褂,本文將介紹HDFS HA的搭建與配置。參考官方文檔:http://hadoop.apache.org/docs/r2.7.4/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html#Configuration_details
1.主要步驟
- 時間同步(ntp時間同步) 網(wǎng)絡(luò) hosts 防火墻關(guān)閉等
時間同步命令:
yum install ntp
ntpdate -u s1a.time.edu.cn
ntp時間服務(wù)器列表:http://www.ntp.org.cn/
關(guān)于網(wǎng)絡(luò)配置請參考:Virtualbox配置centos7網(wǎng)絡(luò)
- 安裝jdk1.7以上
- 上傳 解壓
- 需要做免密鑰璧尸,兩天NameNode之間一定要做免密鑰。
node1到node1-4
node2到node1-4
關(guān)于免密鑰熬拒,參考文章:centos7設(shè)置SSH免密碼登錄教程
- 修改配置文件(需要先停止hdfs集群)
如果是1.x中的爷光,需要手動刪除masters文件(一定要保證每臺服務(wù)器都刪除)
etc/profile: HADOOP_HOME
hadoop-env.sh 中的JAVA_HOME
core-site.xml:hadoop.tmp.dir配置,需要保證每臺服務(wù)器的該目錄不存在或者為空目錄
hdfs-site.xml: HA不需要SNN
slaves 指定datanode
同步配置文件到各個節(jié)點
格式化之前必須先啟動journalnode:
hadoop-daemon.sh start journalnode
8.格式化namenode:在一臺NameNode上執(zhí)行格式化命令
hdfs namenode -format
格式化完成后澎粟,需要啟動當(dāng)前服務(wù)器的NameNode (node1):
hadoop-daemon.sh start namenode
- 同步fsimage,其他沒有格式化的NameNode上執(zhí)行命令(node2):
hdfs namenode -bootstrapStandby
- 安裝ZK蛀序,啟動Zookeeper集群(node1 node2 node3)
Zookeeper集群安裝請參考:Zookeeper 安裝、配置活烙、使用
zkServer.sh start
- 格式化ZK:
hdfs zkfc -formatZK(在其中一臺NameNode上)
- 啟動hdfs:
start-dfs.sh
- 第二次啟動集群的時候只需要以下命令:
1.啟動ZK集群
2.start-dfs.sh
2.HA節(jié)點分布
需要注意的是:ZKFC無需配置徐裸,只需要確定了NameNode節(jié)點位置,ZKFC就自動確定了啸盏。建議:DN與JN在相同的節(jié)點上重贺。
3.配置hdfs-site.xml
<!--定義NameServices邏輯名稱,此處為lyx -->
<property>
<name>dfs.nameservices</name>
<value>lyx</value>
</property>
<!--映射nameservices邏輯名稱到namnode邏輯名稱 -->
<property>
<name>dfs.ha.namenodes.lyx</name>
<value>nn1,nn2</value>
</property>
<!--映射namenode邏輯名稱到真實主機名稱(RPC) -->
<property>
<name>dfs.namenode.rpc-address.lyx.nn1</name>
<value>master:8020</value>
</property>
<!--映射namenode邏輯名稱到真實主機名稱(RPC) -->
<property>
<name>dfs.namenode.rpc-address.lyx.nn2</name>
<value>slave1:8020</value>
</property>
<!--映射namenode邏輯名稱到真實主機名稱(HTTP) -->
<property>
<name>dfs.namenode.http-address.lyx.nn1</name>
<value>master:50070</value>
</property>
<!--映射namenode邏輯名稱到真實主機名稱(HTTP) -->
<property>
<name>dfs.namenode.http-address.lyx.nn2</name>
<value>slave1:50070</value>
</property>
<!--配置JN集群位置信息及目錄 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://slave1:8485;slave2:8485;slave3:8485/lyx</value>
</property>
<!--配置故障遷移實現(xiàn)類 -->
<property>
<name>dfs.client.failover.proxy.provider.lyx</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--指定切換方式為SSH免密鑰方式 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--設(shè)置自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--配置journalnode edits文件位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/current/journal/data</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.superusergroup</name>
<value>staff</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
4.配置core-site.xml
<!--設(shè)置fs.defaultFS為Nameservices的邏輯主機名 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://lyx</value>
</property>
<!--設(shè)置數(shù)據(jù)存放目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/current/tmp</value>
</property>
<!--設(shè)置Zookeeper位置信息 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
5.同步配置文件
scp hdfs-site.xml slave1://usr/local/hadoop/etc/hadoop
scp hdfs-site.xml slave2://usr/local/hadoop/etc/hadoop
scp hdfs-site.xml slave3://usr/local/hadoop/etc/hadoop
scp core-site.xml slave1://usr/local/hadoop/etc/hadoop
scp core-site.xml slave2://usr/local/hadoop/etc/hadoop
scp core-site.xml slave3://usr/local/hadoop/etc/hadoop
6.啟動journalnode(node2-4)
hadoop-daemon.sh start journalnode
7.格式化namenode
在一臺NameNode(node1)上執(zhí)行格式化命令:
hdfs namenode -format
格式化完成后,需要啟動當(dāng)前服務(wù)器的NameNode :hadoop-daemon.sh start namenode
8.同步fsimage
其他沒有格式化的NameNode上執(zhí)行命令(node2):
hdfs namenode -bootstrapStandby
此時若沒有先執(zhí)行上面的啟動Namenode操作(在node1上)气笙,則會報以下錯誤:
所以必須在格式化后先啟動NameNode(node1):hadoop-daemon.sh start namenode
啟動完成后次企,再在node2上執(zhí)行同步命令就正常了
9.啟動zk
hdfs zkfc -formatZK(在其中一臺NameNode上)
10.啟動hdfs
start-dfs.sh
以上,因為在之前啟動了JN和NN潜圃,故出現(xiàn)stop it first,下一次啟動就不會出現(xiàn)了缸棵。
啟動完成。在node1和node2節(jié)點谭期,有如下進(jìn)程:
node1含有NN,ZK,ZKFC:
node2含有NN,ZK,ZKFC,DN,JN:
node3含有DN,JN,ZK:
node4含有DN,JN,ZK:
符合最初設(shè)定的節(jié)點設(shè)置堵第。
11.網(wǎng)頁查看情況
查看node1(master)節(jié)點,目前是active狀態(tài)
node2(slave1)是standby狀態(tài):
處于standby狀態(tài)隧出,HDFS文件系統(tǒng)也是進(jìn)不去的:
12.發(fā)現(xiàn)問題
12.1 問題
把node1中的namenode進(jìn)程關(guān)掉:hadoop-daemon.sh stop namenode踏志,此時,發(fā)現(xiàn)node2狀態(tài)還是standby胀瞪,不會自動切換狰贯,然后重新啟動namenode1,則恢復(fù)正常赏廓,namenode1變?yōu)閟tandby涵紊,namenode2變?yōu)閍ctive。
查看node1中的hadoop-root-zkfc-master.log日志文件發(fā)現(xiàn):
查看node2中的hadoop-root-zkfc-slave1.log日子文件發(fā)現(xiàn):
12.2 原因查找
由slave1上的錯誤日志信息可以看出幔摸,fuser: 未找到命令摸柄,在做主備切換時執(zhí)行fuser命令失敗了。
查看hdfs-site.xml配置文件既忆,
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
hdfs-site.xml通過參數(shù)dfs.ha.fencing.methods來實現(xiàn)驱负,在出現(xiàn)故障時通過哪種方式登錄到另一個namenode上進(jìn)行接管工作。
12.3 dfs.ha.fencing.methods參數(shù)解釋
系統(tǒng)在任何時候只有一個namenode節(jié)點處于active狀態(tài)患雇。在主備切換的時候跃脊,standby namenode會變成active狀態(tài),原來的active namenode就不能再處于active狀態(tài)了苛吱,否則兩個namenode同時處于active狀態(tài)會有問題酪术。所以在failover的時候要設(shè)置防止2個namenode都處于active狀態(tài)的方法,可以是Java類或者腳本翠储。
fencing的方法目前有兩種绘雁,sshfence和shell,sshfence方法是指通過ssh登陸到active namenode節(jié)點殺掉namenode進(jìn)程援所,所以你需要設(shè)置ssh無密碼登陸庐舟,還要保證有殺掉namenode進(jìn)程的權(quán)限。
12.4 解決方案
- 查找fuser
[root@master .ssh]# yum provides "*/fuser"
- 在namenode主住拭、備節(jié)點上安裝fuser(datanode節(jié)點不用安裝)
[root@master .ssh]# yum -y install psmisc
[root@slave1 logs]# yum -y install psmisc
13.故障遷移測試
通過以上修正挪略,則可以順利的進(jìn)行NameNode的自動切換历帚。
把node1中的namenode進(jìn)程關(guān)掉:hadoop-daemon.sh stop namenode
node1(master)不能訪問了,而node2(slave1)就自動切換為了active狀態(tài)杠娱。
重新啟動node1挽牢,hadoop-daemon.sh start namenode ,此時墨辛,master變?yōu)榱藄tandby狀態(tài)
此時再次停止node2(slave1)的話,node1(master)節(jié)點就自動切換為active狀態(tài)趴俘。
由上面的測試可知睹簇,hdfs ha集群環(huán)境已經(jīng)搭建成功!
14.寫在后面
一開始故障遷移zkfc不會實行自動切換寥闪,找了很久太惠,一開始懷疑SSH免密登錄無效,可是我是配置了四臺了主機都互通的疲憋,這條已經(jīng)否定凿渊。后面懷疑,是不是必須要datanode和journalNode在一起缚柳,(一開始埃脏,我配置的journalnode是node1-node3節(jié)點),后面經(jīng)證實秋忙,也非必須彩掐。到后面,竟然還懷疑灰追,是不是我的hostname配置的有問題堵幽,(因為我配置了好幾組的/etc/hosts),當(dāng)時懷疑/etc/hostname中的配置的需要跟/etc/hosts中配置的一致,后面發(fā)現(xiàn)非必須弹澎。我的配置如下:
node1為例:
倒騰了半天后朴下,從日志文件中找出錯誤信息,從而在網(wǎng)上找到類似的問題苦蒿,進(jìn)而找到解決方案殴胧。故,大數(shù)據(jù)環(huán)境出現(xiàn)問題佩迟,必須要看日志溃肪,必須得認(rèn)真看日志。