翻譯: https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_hag_hdfs_ha_enabling.html
HDFS高可用性(HA)群集使用兩個(gè)NameNode(活動(dòng)NameNode和備用NameNode)千劈。在任意時(shí)刻只有一個(gè)NameNode處于活動(dòng)狀態(tài)。HDFS HA維護(hù)一份名稱空間修改日志牌捷,兩個(gè)NameNode 都可以訪問(wèn)得到墙牌,在發(fā)生故障時(shí),備用NameNode可以獲取最新的名稱空間修改日志和集群中塊的位置信息暗甥。
重要提示:?jiǎn)⒂煤徒肏A會(huì)導(dǎo)致HDFS服務(wù)和依賴于HDFS的所有服務(wù)中斷服務(wù)喜滨。在啟用或禁用HA之前,請(qǐng)確保群集上沒(méi)有運(yùn)行作業(yè)撤防。
閱讀:
使用Cloudera Manager啟用HDFS HA
最低要求的角色: 群集管理員(也由完全管理員提供)
您可以使用Cloudera Manager為CDH 5群集配置HDFS HA的自動(dòng)進(jìn)行故障轉(zhuǎn)移虽风。在Cloudera Manager 5中,HA使用Quorum-based的存儲(chǔ)實(shí)施寄月。Quorum-based的存儲(chǔ)依賴于一組JournalNodes辜膝,每個(gè)JournalNode都維護(hù)一個(gè)本地目錄,用來(lái)記錄對(duì)名稱空間元數(shù)據(jù)的修改漾肮。啟用高可用性啟用自動(dòng)故障轉(zhuǎn)移作為同一命令的一部分厂抖。
重要:
- 啟用或禁用HA會(huì)導(dǎo)致先前的監(jiān)控歷史記錄變得不可用。
- 一旦啟用JobTracker HA初橘,一些參數(shù)將被自動(dòng)設(shè)置验游。如果您想要更改這些參數(shù)的默認(rèn)值充岛,請(qǐng)使用高級(jí)配置。
- mapred.jobtracker.restart.recover:true
- mapred.job.tracker.persist.jobstatus.active:true
- mapred.ha.automatic-failover.enabled:true
- mapred.ha.fencing.methods:shell(true)
啟用高可用性和自動(dòng)故障轉(zhuǎn)移
啟用高可用性的工作流程將引導(dǎo)您完成添加第二個(gè)(備用)NameNode和配置JournalNodes耕蝉。
- 執(zhí)行HDFS HA硬件配置下描述的所有配置和設(shè)置任務(wù)崔梗。
- 確保你有一個(gè)ZooKeeper服務(wù)。
- 轉(zhuǎn)到HDFS服務(wù)垒在。
- 選擇Actions > Enable High Availability蒜魄。顯示有資格運(yùn)行備用NameNode和JournalNodes的主機(jī)的頁(yè)面。
a. 為名稱服務(wù)指定一個(gè)名稱场躯,然后單擊繼續(xù)谈为。注意:為名稱服務(wù)使用唯一名稱。
b. 在NameNode主機(jī)字段中踢关,單擊選擇主機(jī)伞鲫。顯示主機(jī)選擇對(duì)話框。
c. 選中要設(shè)置備用NameNode的主機(jī)旁邊的復(fù)選框签舞,然后單擊OK秕脓。備用NameNode不能與活動(dòng)NameNode位于同一主機(jī)上,并且所選主機(jī)應(yīng)具有與活動(dòng)NameNode相同的硬件配置(RAM儒搭,磁盤空間吠架,內(nèi)核數(shù)量等)。
d. 在JournalNode主機(jī)字段中搂鲫,單擊選擇主機(jī)傍药。顯示主機(jī)選擇對(duì)話框。
e. 選中奇數(shù)個(gè)主機(jī)旁邊的復(fù)選框(至少三個(gè))作為JournalNodes魂仍,然后單擊確定拐辽。JournalNodes應(yīng)托管在與NameNodes具有相似硬件規(guī)格的主機(jī)上。Cloudera建議您將JournalNode分別放置在與活動(dòng)和備用NameNode相同的主機(jī)上蓄诽,以及類似硬件上的第三個(gè)JournalNode薛训,例如JobTracker。
f. 點(diǎn)擊繼續(xù)仑氛。
g. 在JournalNode的編輯目錄屬性中乙埃,將JournalNode編輯目錄的目錄位置輸入到每個(gè)JournalNode主機(jī)的字段中。
* 每個(gè)JournalNode只能輸入一個(gè)目錄锯岖。每個(gè)JournalNode上的路徑不需要相同介袜。
* 您指定的目錄應(yīng)該是空的。
* 目錄所有者應(yīng)該是hdfs:hadoop出吹,并且必須具有讀取遇伞,寫入和執(zhí)行權(quán)限(drwx ------)。
h. 額外選項(xiàng):決定Cloudera Manager是否應(yīng)清除ZooKeeper捶牢,備用NameNode和JournalNodes中的現(xiàn)有數(shù)據(jù)鸠珠。如果目錄不為空(例如巍耗,您重新啟用先前的HA配置),則Cloudera Manager不會(huì)自動(dòng)刪除內(nèi)容 - 您可以通過(guò)保持默認(rèn)復(fù)選框選擇來(lái)選擇刪除內(nèi)容渐排。建議的默認(rèn)值是清除目錄炬太。如果您選擇不這樣做,數(shù)據(jù)應(yīng)該在JournalNodes的編輯目錄中同步驯耻,并且應(yīng)該具有與NameNodes相同的版本數(shù)據(jù)亲族。
i. 點(diǎn)擊繼續(xù)。
Cloudera Manager執(zhí)行一組命令來(lái)停止相關(guān)服務(wù)可缚,根據(jù)需要?jiǎng)h除霎迫,創(chuàng)建和配置角色和目錄,創(chuàng)建名稱服務(wù)和故障轉(zhuǎn)移控制器帘靡,重新啟動(dòng)相關(guān)服務(wù)以及部署新的客戶端配置知给。
重要 :如果操作已完成,某些步驟(如格式化NameNode)可能會(huì)報(bào)告失敗描姚。但是炼鞠,配置步驟可以繼續(xù)執(zhí)行。
- 如果要配置群集中的其他服務(wù)使用HA轰胁,請(qǐng)按照配置其他CDH組件使用HDFS HA。
重要提示:如果更改NameNode服務(wù)RPC端口(dfs.namenode.servicerpc-address)朝扼,同時(shí)啟用自動(dòng)故障轉(zhuǎn)移赃阀,這會(huì)導(dǎo)致保存在ZooKeeper中的NameNode地址不匹配/hadoop-ha znode和故障切換控制器配置的NameNode地址。這將阻止故障切換控制器重新啟動(dòng)擎颖。如果您需要在啟用自動(dòng)故障切換后更改NameNode Service RPC端口榛斯,則必須執(zhí)行以下操作重新初始化znode:
停止HDFS服務(wù)。
配置服務(wù)RPC端口:
a. 轉(zhuǎn)到HDFS服務(wù)搂捧。
b. 單擊Configuration 選項(xiàng)卡驮俗。
c. 選擇Scope > NameNode。
d. 選擇 Category > Ports and Addresses.允跑。
e. 找到NameNode Service RPC端口屬性或通過(guò)在搜索框中輸入名稱來(lái)搜索它王凑。
f. 根據(jù)需要更改端口值。
要根據(jù)需要將此配置屬性應(yīng)用于其他角色組聋丝,請(qǐng)編輯相應(yīng)角色組的值索烹。請(qǐng)參閱使用Cloudera Manager修改配置屬性。在ZooKeeper服務(wù)器主機(jī)上運(yùn)行zookeeper-client.弱睦。
a. 執(zhí)行以下操作刪除配置的名稱服務(wù)百姓。這個(gè)例子假設(shè)nameservice的名字是nameservice1。您可以在HDFS Instances 選項(xiàng)卡上的 Federation and High Availability 標(biāo)識(shí)名稱服務(wù):rmr /hadoop-ha/nameservice1單擊Instances 選項(xiàng)卡况木。
選擇 Actions > Initialize High Availability State in ZooKeeper.
啟動(dòng)HDFS服務(wù)垒拢。
隔離方法Fencing Methods
為確保一次只有一個(gè)NameNode處于活動(dòng)狀態(tài)旬迹,共享編輯目錄需要使用fencing methods 。在故障轉(zhuǎn)移期間求类,fencing methods負(fù)責(zé)確保先前活動(dòng)的NameNode不再有權(quán)訪問(wèn)共享編輯目錄奔垦,以便新的活動(dòng)NameNode可以安全地繼續(xù)寫入。
默認(rèn)情況下仑嗅,Cloudera Manager將HDFS配置為使用 fencing method (shell(true)))宴倍。
fencing 參數(shù)位于 HDFS服務(wù)配置屬性下的 Service-Wide > High Availability 類別中。
有關(guān)CDH 5提供的fencing方法以及如何配置fencing的詳細(xì)信息仓技,請(qǐng)參閱fencing配置鸵贬。
使用命令行啟用HDFS HA
重要:
- 在不使用Cloudera Manager配置時(shí),遵循這些命令行指示信息脖捻。
- 此信息特別適用于CDH 5.14.x阔逼。有關(guān)其他版本的信息,請(qǐng)參閱Cloudera文檔地沮。
本節(jié)介紹CDH 5中HDFS HA所需的軟件配置嗜浮,并介紹如何設(shè)置配置屬性并使用命令行來(lái)部署HDFS HA。
為HDFS HA配置文件
配置概述
HA配置向后兼容摩疑,并允許現(xiàn)有的單一NameNode配置在無(wú)需更改情況下即可工作危融。新配置的設(shè)計(jì)使群集中的所有節(jié)點(diǎn)都可以具有相同的配置,而無(wú)需根據(jù)節(jié)點(diǎn)的類型將不同的配置文件部署到不同的機(jī)器雷袋。
HA群集重用Nameservice ID來(lái)標(biāo)識(shí)由多個(gè)HA NameNode組成的單個(gè)HDFS實(shí)例吉殃。另外,還有一個(gè)名為NameNode ID的新抽象楷怒。群集中每個(gè)不同的NameNode都有一個(gè)不同的NameNode ID蛋勺。配置文件的參數(shù)需要包括Nameservice ID和NameNode ID以支持所有NameNode使用同一個(gè)配置文件。
對(duì)現(xiàn)有配置參數(shù)的更改
對(duì)于YARN實(shí)現(xiàn)鸠删,以下配置參數(shù)已更改:
fs.defaultFS - 以前為 fs.default.name 抱完,這是Hadoop FS客戶端在未給出任何前綴時(shí)使用的默認(rèn)路徑前綴。(fs.default.name 參數(shù)已經(jīng)被YARN棄用刃泡,但仍然有效巧娱。)
或者,您可以將Hadoop客戶端的默認(rèn)路徑配置為使用啟用HA的邏輯URI烘贴。例如家卖,如果你使用myCluster 作為Nameservice ID,如下所示庙楚,這將是所有HDFS路徑的權(quán)威部分的值上荡。你可以在你的core-site.xml配置文件中設(shè)置默認(rèn)路徑:
- 對(duì)于YARN:
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
- 對(duì)于MRv1:
<property>
<name>fs.default.name</name>
<value>hdfs://mycluster</value>
</property>
新的配置參數(shù)
要配置HA NameNodes,您必須在hdfs-site.xml中添加多個(gè)配置選項(xiàng)。
您設(shè)置這些配置的順序不重要酪捡,但是dfs.nameservices and dfs.ha.namenodes.[Nameservice ID]的值非常關(guān)鍵叁征。這意味著您應(yīng)該在設(shè)置其余配置選項(xiàng)之前決定這些值。
配置dfs.nameservices
dfs.nameservices - 這個(gè)名字服務(wù)的邏輯名稱
例如逛薇,為此名稱服務(wù)選擇一個(gè)邏輯名稱 myCluster捺疼,并使用此邏輯名稱作為此配置選項(xiàng)的值。你選擇的名字是任意的永罚。它將用于配置啤呼,也將作為群集中HDFS的絕對(duì)路徑。
配置dfs.ha.namenodes.[nameservice ID]
dfs.ha.namenodes.[nameservice ID] - 名稱服務(wù)中每個(gè)NameNode的唯一標(biāo)識(shí)符
配置逗號(hào)分隔的NameNode ID列表呢袱。這將由DataNode用于確定群集中的所有NameNode官扣。例如,如果你使用myCluster 作為NameService ID羞福,并且您想使用NN1 和 NN2 作為NameNodes的個(gè)體ID惕蹄,您可以按如下方式進(jìn)行配置:
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
注意:在此版本中,您可以為每個(gè)名稱服務(wù)配置最多兩個(gè)NameNode治专。
配置dfs.namenode.rpc-address.[nameservice ID]
dfs.namenode.rpc-address.[nameservice ID].[name node ID]- 每個(gè)NameNode偵聽(tīng)的完全限定的RPC地址
對(duì)于前面配置的兩個(gè)NameNode ID卖陵,請(qǐng)?jiān)O(shè)置NameNode進(jìn)程的完整地址和RPC端口。請(qǐng)注意张峰,這會(huì)導(dǎo)致兩個(gè)單獨(dú)的配置選項(xiàng)泪蔫。例如:
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>machine1.example.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>machine2.example.com:8020</value>
</property>
注意:如有必要,您可以類似地配置 servicerpc-address喘批。
配置dfs.namenode.http-address.[nameservice ID]
dfs.namenode.http-address.[nameservice ID].[name node ID] - 每個(gè)NameNode監(jiān)聽(tīng)的全限定HTTP地址
與上面的rpc-address類似鸥滨,為兩個(gè)NameNode的HTTP服務(wù)器設(shè)置偵聽(tīng)地址。例如:
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>machine1.example.com:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>machine2.example.com:50070</value>
</property>
注意:如果您啟用了Hadoop Kerberos安全功能谤祖,并且您打算使用HSFTP,則還應(yīng)該設(shè)置 https-address 老速。
配置dfs.namenode.shared.edits.dir
dfs.namenode.shared.edits.dir - 共享存儲(chǔ)目錄的位置
配置供JournalNodes使用的共享編輯存儲(chǔ)地址粥喜,由Active NameNode寫入并由Standby NameNode讀取,以保持兩個(gè) NameNode所做的所有文件系統(tǒng)更改一致橘券。盡管您必須指定多個(gè)JournalNode地址额湘,但您應(yīng)該只配置其中一個(gè)URI。該URI應(yīng)該采用以下格式:
qjournal://<host1:port1>;<host2:port2>;<host3:port3>/<journalId>
日志ID是此名稱服務(wù)的唯一標(biāo)識(shí)符旁舰,它允許一組JournalNodes為多個(gè)聯(lián)邦名稱系統(tǒng)提供存儲(chǔ)锋华。盡管這不是要求,但重用名稱服務(wù)標(biāo)識(shí)是個(gè)好主意箭窜。
例如毯焕,如果該群集的JournalNodes在機(jī)器 node1.example.com, node2.example.com, 和 node3.example.com 上運(yùn)行,并且nameservice ID是 myCluster,您可以使用以下值作為此設(shè)置的值(JournalNode的默認(rèn)端口為8485):
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
</property>
配置dfs.journalnode.edits.dir
dfs.journalnode.edits.dir - JournalNode守護(hù)進(jìn)程將存儲(chǔ)其本地狀態(tài)的路徑
在每個(gè)JournalNode機(jī)器上纳猫,配置JournalNodes使用的用于編輯和存儲(chǔ)其他本地狀態(tài)信息的絕對(duì)路徑; 每個(gè)JournalNode只使用一個(gè)路徑婆咸。(其他JournalNodes提供冗余;您也可以在本地連接的RAID-1或RAID-10陣列上配置此目錄。)
例如:
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/1/dfs/jn</value>
</property>
創(chuàng)建目錄(如果它不存在)并確保它的所有者是hdfs
$ sudo mkdir -p /data/1/dfs/jn
$ sudo chown -R hdfs:hdfs /data/1/dfs/jn
客戶端故障轉(zhuǎn)移配置
dfs.client.failover.proxy.provider.[nameservice ID] - HDFS客戶端用于聯(lián)系A(chǔ)ctive NameNode的Java類
配置DFS客戶端將用于確定哪個(gè)NameNode是當(dāng)前活動(dòng)的Java類的名稱芜辕,以及哪個(gè)NameNode當(dāng)前正在為客戶端請(qǐng)求提供服務(wù)尚骄。目前Hadoop附帶的唯一實(shí)現(xiàn)是 ConfiguredFailoverProxyProvider,所以使用這個(gè)侵续,除非你使用自定義的倔丈。例如:
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
fencing 配置
dfs.ha.fencing.methods - 一個(gè)腳本或Java類的列表,它們將用于在故障轉(zhuǎn)移期間對(duì)活動(dòng)NameNode進(jìn)行籬笆劃分
系統(tǒng)理想是状蜗,在任何給定的時(shí)間只有一個(gè)NameNode處于活動(dòng)狀態(tài)需五。
當(dāng)您使用Quorum-based的存儲(chǔ)時(shí),只有一個(gè)NameNode將被允許寫入JournalNodes诗舰,因此在“裂腦”場(chǎng)景中不會(huì)破壞文件系統(tǒng)元數(shù)據(jù)警儒。為dfs.ha.fencing.methods 屬性配置的默認(rèn)值 shell(true) ,它并沒(méi)有明確地嘗試隔離備用NameNode眶根。
在沒(méi)有明確屏蔽的情況下蜀铲,有一個(gè)狹窄的時(shí)間窗口,以前活動(dòng)的NameNode可能會(huì)提供對(duì)來(lái)自客戶端的讀取的過(guò)時(shí)響應(yīng)属百。當(dāng)以前活動(dòng)的NameNode試圖寫入JournalNodes時(shí)记劝,此窗口結(jié)束,此時(shí)NameNode關(guān)閉族扰。
由于沒(méi)有裂腦的危險(xiǎn)厌丑,這種時(shí)間窗口很少成為應(yīng)用程序的問(wèn)題。在需要強(qiáng)讀取一致性的罕見(jiàn)或特殊情況下渔呵,請(qǐng)使用明確的屏蔽方法怒竿,如agent-based fencer。
注意:如果您選擇使用agent-based fencer 扩氢,則仍應(yīng)配置shell(true) 耕驰,因?yàn)槿绻鸻gent-based fencer失敗時(shí)其他NameNode沒(méi)有響應(yīng)。
故障切換期間使用的防護(hù)方法將配置為以回車分隔的列表录豺,并且會(huì)按順序嘗試這些方法朦肘,直到其中一個(gè)表明防護(hù)已成功為止。
有關(guān)實(shí)現(xiàn)自己的自定義fencing 的信息双饥,請(qǐng)參閱 org.apache.hadoop.ha.NodeFencer class.媒抠。
配置外殼防護(hù)方法
shell - 運(yùn)行任意的shell命令來(lái)隔離活動(dòng)的NameNode
shell fencing方法運(yùn)行一個(gè)任意的shell命令,你可以像下面這樣配置它:
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
</property>
'('和')'之間的字符串直接傳遞給bash shell 咏花,不能包括任何結(jié)束括號(hào)趴生。
執(zhí)行時(shí),配置腳本的第一個(gè)參數(shù)將是要被隔離的NameNode的地址,后面是在配置中指定的所有參數(shù)冲秽。
shell命令將在啟動(dòng)時(shí)包含hadoop環(huán)境中所有的配置遍歷舍咖,將配置項(xiàng)中的_替換為. 。例如锉桑, dfs_namenode_rpc-address 將包含目標(biāo)節(jié)點(diǎn)的RPC地址排霉,即使配置可能將該變量指定為 dfs.namenode.rpc-address.ns1.nn1。
變量 | 描述 |
---|---|
$ target_host | 要隔離的節(jié)點(diǎn)的主機(jī)名 |
$ target_port | 圍繞節(jié)點(diǎn)的IPC端口 |
$ TARGET_ADDRESS | 以上兩個(gè)變量組合為port |
$ target_nameserviceid | 要被隔離的NameNode的名稱服務(wù)ID |
$ target_namenodeid | 要被隔離的NameNode的NameNode ID |
要fencing的目標(biāo)節(jié)點(diǎn)的以下變量也可用:
變量 | 描述 |
---|---|
$ target_host | 要隔離的節(jié)點(diǎn)的主機(jī)名 |
$ target_port | 圍繞節(jié)點(diǎn)的IPC端口 |
$ TARGET_ADDRESS | 以上兩個(gè)變量組合為port |
$ target_nameserviceid | 要被隔離的NameNode的名稱服務(wù)ID |
$ target_namenodeid | 要被隔離的NameNode的NameNode ID |
您也可以使用這些環(huán)境變量作為shell命令本身的替代民轴。例如:
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh --nameservice=$target_nameserviceid $target_host:$target_port)</value>
</property>
如果shell命令返回0的退出碼攻柠,則確定防護(hù)成功。如果它返回任何其他退出代碼后裸,則防護(hù)未成功瑰钮,并嘗試列表中的下一個(gè)防護(hù)方法。
注意:此防護(hù)方法不會(huì)實(shí)現(xiàn)任何超時(shí)微驶。如果超時(shí)是必要的浪谴,它們應(yīng)該在shell腳本中實(shí)現(xiàn)(例如,通過(guò)分支子shell在幾秒鐘內(nèi)殺死它的父代)因苹。
自動(dòng)故障轉(zhuǎn)移配置
以上各節(jié)介紹如何配置手動(dòng)故障轉(zhuǎn)移苟耻。在該模式下,即使主動(dòng)節(jié)點(diǎn)發(fā)生故障,系統(tǒng)也不會(huì)自動(dòng)觸發(fā)從活動(dòng)節(jié)點(diǎn)到備用節(jié)點(diǎn)的故障轉(zhuǎn)移。本節(jié)介紹如何配置和部署自動(dòng)故障轉(zhuǎn)移汗茄。有關(guān)如何實(shí)現(xiàn)自動(dòng)故障轉(zhuǎn)移的概述,請(qǐng)參閱自動(dòng)故障轉(zhuǎn)移棚放。
部署ZooKeeper
在典型的部署中,ZooKeeper守護(hù)進(jìn)程被配置為在三個(gè)或五個(gè)節(jié)點(diǎn)上運(yùn)行。由于ZooKeeper本身具有輕量資源需求,因此可以在與HDFS NameNode和Standby節(jié)點(diǎn)上配置ZooKeeper節(jié)點(diǎn)杈湾。使用MapReduce v2(MRv2)的操作員經(jīng)常選擇在與YARN ResourceManager相同的節(jié)點(diǎn)上部署第三個(gè)ZooKeeper進(jìn)程。建議將ZooKeeper節(jié)點(diǎn)的數(shù)據(jù)存儲(chǔ)與HDFS元數(shù)據(jù)的存儲(chǔ)分開(kāi)攘须,以獲得最佳性能和隔離漆撞。
有關(guān)如何設(shè)置ZooKeeper集成的說(shuō)明,請(qǐng)參閱ZooKeeper文檔阻课。在下面的章節(jié)中,我們假設(shè)您已經(jīng)建立了一個(gè)在三個(gè)或更多節(jié)點(diǎn)上運(yùn)行的ZooKeeper集群艰匙,并通過(guò)使用ZooKeeper命令行界面(CLI)進(jìn)行連接來(lái)驗(yàn)證其正確的操作限煞。
配置自動(dòng)故障轉(zhuǎn)移
注意:在開(kāi)始配置自動(dòng)故障轉(zhuǎn)移之前,您必須關(guān)閉群集员凝。當(dāng)集群正在運(yùn)行時(shí)署驻,不支持從手動(dòng)故障轉(zhuǎn)移設(shè)置轉(zhuǎn)換為自動(dòng)故障轉(zhuǎn)移設(shè)置。
配置自動(dòng)故障轉(zhuǎn)移需要兩個(gè)額外的配置參數(shù)。在hdfs-site.xml 文件旺上,添加:
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
這指定應(yīng)將群集設(shè)置為自動(dòng)故障轉(zhuǎn)移瓶蚂。
在core-site.xml文件,添加:
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
</property>
這列出了運(yùn)行ZooKeeper服務(wù)的主機(jī)端口對(duì)宣吱。
與本文檔前面介紹的參數(shù)一樣窃这,這些設(shè)置可以通過(guò)在名稱服務(wù)的基礎(chǔ)上配置 nameservice ID后綴來(lái)配置。例如征候,在啟用了聯(lián)合的群集中杭攻,您可以通過(guò)設(shè)置僅顯式啟用其中一個(gè)名稱服務(wù)的自動(dòng)故障轉(zhuǎn)移dfs.ha.automatic-failover.enabled.my-nameservice-id 。
還有其他幾個(gè)配置參數(shù)可以用來(lái)控制自動(dòng)故障轉(zhuǎn)移的行為疤坝,但它們?cè)诖蠖鄶?shù)安裝中不是必需的兆解。有關(guān)詳細(xì)信息,請(qǐng)參閱Hadoop文檔的配置部分跑揉。
初始化ZooKeeper中的HA狀態(tài)
添加配置密鑰后锅睛,下一步是在ZooKeeper中初始化所需的狀態(tài)。您可以通過(guò)從其中一個(gè)NameNode主機(jī)運(yùn)行以下命令來(lái)完成此操作历谍。
注意:使用此命令時(shí)现拒,ZooKeeper集合必須正在運(yùn)行; 否則將無(wú)法正常工作。
$ hdfs zkfc -formatZK
這將創(chuàng)建一個(gè)znode, 其上存儲(chǔ)有自動(dòng)故障轉(zhuǎn)移系統(tǒng)所需數(shù)據(jù)扮饶。
安全訪問(wèn)ZooKeeper
如果您運(yùn)行的是安全群集具练,則可能需要確保存儲(chǔ)在ZooKeeper中的信息也是安全的。這可以防止惡意客戶修改ZooKeeper中的元數(shù)據(jù)或者觸發(fā)錯(cuò)誤的故障轉(zhuǎn)移甜无。
為了保護(hù)ZooKeeper中的信息扛点,請(qǐng)首先將以下內(nèi)容添加到core-site.xml文件:
<property>
<name>ha.zookeeper.auth</name>
<value>@/path/to/zk-auth.txt</value>
</property>
<property>
<name>ha.zookeeper.acl</name>
<value>@/path/to/zk-acl.txt</value>
</property>
請(qǐng)注意這些值中的'@'字符 - 它指定配置不是內(nèi)聯(lián)的,而是指向磁盤上的文件岂丘。
第一個(gè)配置的文件指定ZooKeeper認(rèn)證列表陵究,ZooKeeper CLI使用相同的配置格式。例如奥帘,你可以指定類似 digest:hdfs-zkfcs:mypassword 的形式 铜邮, 其中hdfs-zkcs是ZooKeeper的唯一用戶名, mypassword是密碼 寨蹋。
接下來(lái)松蒜,使用如下命令生成與此驗(yàn)證對(duì)應(yīng)的ZooKeeper訪問(wèn)控制列表(ACL):
$ java -cp $ZK_HOME/lib/*:$ZK_HOME/zookeeper-3.4.2.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider hdfs-zkfcs:mypassword
output: hdfs-zkfcs:mypassword->hdfs-zkfcs:P/OQvnYyU/nF/mGYvB/xurX8dYs=
將' - >'字符串后面的輸出部分復(fù)制并粘貼到文件 zk-acls.txt 中,以字符串“digest:”為前綴已旧。例如:
digest:hdfs-zkfcs:vlUvLnd8MlacsE80rDuu6ONESbM=:rwcda
要使這些ACL生效秸苗,請(qǐng)重新運(yùn)行 zkfc -formatZK 命令,如上所述运褪。
這樣做后惊楼,您可以按如下方式驗(yàn)證ZooKeeper CLI的ACL:
[zk: localhost:2181(CONNECTED) 1] getAcl /hadoop-ha
'digest,'hdfs-zkfcs:vlUvLnd8MlacsE80rDuu6ONESbM=
: cdrwa
自動(dòng)故障轉(zhuǎn)移FAQ
- 是否需要以特定順序啟動(dòng)ZKFC和NameNode守護(hù)進(jìn)程玖瘸?
不需要。在任何給定的節(jié)點(diǎn)上檀咙,您可以在其相應(yīng)的NameNode之前或之后啟動(dòng)ZKFC雅倒。
- 我應(yīng)該進(jìn)行哪些額外的監(jiān)測(cè)?
您應(yīng)該在運(yùn)行NameNode的每臺(tái)主機(jī)上添加監(jiān)控弧可,以確保ZKFC保持運(yùn)行蔑匣。例如,在某些ZooKeeper故障中侣诺,ZKFC可能會(huì)意外退出殖演,應(yīng)該重新啟動(dòng)以確保系統(tǒng)已準(zhǔn)備好進(jìn)行自動(dòng)故障轉(zhuǎn)移。此外年鸳,您應(yīng)該在ZooKeeper quorum 中監(jiān)視每個(gè)服務(wù)器趴久。如果ZooKeeper崩潰,自動(dòng)故障轉(zhuǎn)移將不起作用搔确。
- 如果ZooKeeper出現(xiàn)故障會(huì)發(fā)生什么彼棍?
如果ZooKeeper群集崩潰,則不會(huì)觸發(fā)自動(dòng)故障轉(zhuǎn)移膳算。但是座硕,HDFS將繼續(xù)運(yùn)行,沒(méi)有任何影響涕蜂。當(dāng)ZooKeeper重新啟動(dòng)時(shí)华匾,HDFS將會(huì)重新連接。 - 我可以將我的NameNode中的一個(gè)指定為主/首選嗎机隙?
目前蜘拉,這不支持。首先啟動(dòng)的NameNode將變?yōu)榛顒?dòng)狀態(tài)有鹿。您可以選擇以特定順序啟動(dòng)群集旭旭,以便首選節(jié)點(diǎn)首先啟動(dòng)。 - 如何在配置自動(dòng)故障轉(zhuǎn)移時(shí)啟動(dòng)手動(dòng)故障轉(zhuǎn)移葱跋?
即使配置了自動(dòng)故障轉(zhuǎn)移持寄,您也可以啟動(dòng)手動(dòng)故障轉(zhuǎn)移。它將執(zhí)行相應(yīng)的故障轉(zhuǎn)移娱俺。
部署HDFS高可用性
在設(shè)置完所有必要的配置選項(xiàng)后稍味,即可啟動(dòng)JournalNodes和兩個(gè)HA NameNode。
重要提示: 在開(kāi)始之前:請(qǐng)確保您已執(zhí)行中所述的所有配置和設(shè)置任務(wù) 配置硬件的HDFS HA和配置軟件HDFS HA荠卷,包括初始化的ZooKeeper HA狀態(tài)模庐,如果部署了自動(dòng)故障轉(zhuǎn)移。
安裝并啟動(dòng)JournalNodes
-
將JournalNode守護(hù)程序安裝在它們將運(yùn)行的每臺(tái)機(jī)器上僵朗。
要在Red Hat兼容系統(tǒng)上安裝JournalNode:
$ sudo yum install hadoop-hdfs-journalnode
在Ubuntu和Debian系統(tǒng)上安裝JournalNode:
$ sudo apt-get install hadoop-hdfs-journalnode
在SLES系統(tǒng)上安裝JournalNode:
$ sudo zypper install hadoop-hdfs-journalnode
- 在他們將要運(yùn)行的每臺(tái)機(jī)器上啟動(dòng)JournalNode守護(hù)進(jìn)程:
sudo service hadoop-hdfs-journalnode start
在格式化主NameNode(在新集群中)之前和啟動(dòng)NameNodes(在所有情況下)之前赖欣,請(qǐng)確保守護(hù)進(jìn)程啟動(dòng)。
格式化NameNode(如果是新集群)
如果您正在設(shè)置新的HDFS群集验庙,請(qǐng)格式化您將用作主NameNode的NameNode; 請(qǐng)參閱格式化NameNode顶吮。
重要提示:確保JournalNodes已啟動(dòng)。如果您已將NameNode配置為與JournalNodes進(jìn)行通信粪薛,但尚未啟動(dòng)JournalNodes悴了,則格式化將失敗。
初始化共享編輯目錄(如果轉(zhuǎn)換現(xiàn)有的非HA集群)
如果要將非HA NameNode轉(zhuǎn)換為HA违寿,需要使用本地NameNode中的edits目錄的數(shù)據(jù)初始化共享編輯目錄:
hdfs namenode -initializeSharedEdits
啟動(dòng)NameNodes
- 啟動(dòng)主(已格式化)的NameNode:
$ sudo service hadoop-hdfs-namenode start
- 啟動(dòng)備用NameNode:
$ sudo -u hdfs hdfs namenode -bootstrapStandby
$ sudo service hadoop-hdfs-namenode start
注意:如果啟用了Kerberos湃交,請(qǐng)不要使用命令sudo -u <user> <command>; 他們會(huì)因安全錯(cuò)誤而失敗。使用以下命令:$ kinit <user>(如果您使用密碼)或 $ kinit -kt <keytab> <principal>(如果你使用的是 keytab
)藤巢,然后搞莺,對(duì)于該用戶執(zhí)行的每個(gè)命令 $ <command>.
啟動(dòng)備用NameNode 帶-bootstrapStandby選項(xiàng)會(huì)將主NameNode的元數(shù)據(jù)目錄(包括名稱空間信息和最新的檢查點(diǎn))的內(nèi)容復(fù)制到備用NameNode。(保存NameNode元數(shù)據(jù)的目錄位置使用配置選項(xiàng) dfs.namenode.name.dir 和 dfs.namenode.edits.dir)進(jìn)行配置掂咒。
您可以通過(guò)每個(gè)NameNode配置的HTTP地址來(lái)訪問(wèn)其網(wǎng)頁(yè)才沧。請(qǐng)注意,在配置的地址旁邊是NameNode的HA狀態(tài)(“Standby”或“Active”)绍刮。每當(dāng)HA NameNode啟動(dòng)并且未啟用自動(dòng)故障轉(zhuǎn)移時(shí)温圆,它最初處于Standby狀態(tài)。如果啟用自動(dòng)故障轉(zhuǎn)移孩革,則啟動(dòng)的第一個(gè)NameNode將變?yōu)榛顒?dòng)狀態(tài)岁歉。
重新啟動(dòng)服務(wù)(如果轉(zhuǎn)換現(xiàn)有的非HA集群)
如果要從非HA轉(zhuǎn)換為HA配置,則需要重新啟動(dòng)JobTracker和TaskTracker(對(duì)于MRv1膝蜈,如果使用的話)或者ResourceManager锅移,NodeManager和JobHistory Server(對(duì)于YARN)以及DataNode:
在每個(gè)DataNode上:
$ sudo service hadoop-hdfs-datanode start
在每個(gè)TaskTracker系統(tǒng)(MRv1)上:
$ sudo service hadoop-0.20-mapreduce-tasktracker start
在JobTracker系統(tǒng)(MRv1)上:
$ sudo service hadoop-0.20-mapreduce-jobtracker start
驗(yàn)證JobTracker和TaskTracker是否正確啟動(dòng):
sudo jps | grep Tracker
在ResourceManager系統(tǒng)(YARN)上:
$ sudo service hadoop-yarn-resourcemanager start
在每個(gè)NodeManager系統(tǒng)上(YARN;通常與運(yùn)行DataNode服務(wù)的系統(tǒng)相同):
$ sudo service hadoop-yarn-nodemanager start
在MapReduce JobHistory服務(wù)器系統(tǒng)(YARN)上:
$ sudo service hadoop-mapreduce-historyserver start
部署自動(dòng)故障轉(zhuǎn)移(如果已配置)
如果您使用ZooKeeper FailoverController(ZKFC)配置自動(dòng)故障切換,則必須在每臺(tái)NameNode上安裝并啟動(dòng) zkfc 守護(hù)進(jìn)程彬檀。命令如下帆啃。
在紅帽兼容系統(tǒng)上安裝ZKFC:
$ sudo yum install hadoop-hdfs-zkfc
在Ubuntu和Debian系統(tǒng)上安裝ZKFC:
$ sudo apt-get install hadoop-hdfs-zkfc
在SLES系統(tǒng)上安裝ZKFC:
$ sudo zypper install hadoop-hdfs-zkfc
啟動(dòng) zkfc :
$ sudo service hadoop-hdfs-zkfc start
以特定順序啟動(dòng)ZKFC和NameNode后臺(tái)進(jìn)程并不重要。在任何給定的節(jié)點(diǎn)上窍帝,您可以在相應(yīng)的NameNode之前或之后啟動(dòng)ZKFC努潘。
您應(yīng)該在運(yùn)行NameNode的每臺(tái)主機(jī)上添加監(jiān)控,以確保ZKFC保持運(yùn)行坤学。例如疯坤,在某些類型的ZooKeeper故障中,ZKFC可能會(huì)意外退出深浮,應(yīng)該重新啟動(dòng)以確保系統(tǒng)準(zhǔn)備好進(jìn)行自動(dòng)故障轉(zhuǎn)移压怠。
此外,您應(yīng)該在每個(gè)服務(wù)器監(jiān)控ZooKeeper quorum 飞苇。如果ZooKeeper崩潰菌瘫,則自動(dòng)故障轉(zhuǎn)移將不起作用蜗顽。如果ZooKeeper群集崩潰,則不會(huì)觸發(fā)自動(dòng)故障轉(zhuǎn)移雨让。但是雇盖,HDFS將繼續(xù)運(yùn)行,沒(méi)有任何影響栖忠。當(dāng)ZooKeeper重新啟動(dòng)時(shí)崔挖,HDFS將會(huì)重新連接。
驗(yàn)證自動(dòng)故障轉(zhuǎn)移
在啟用了自動(dòng)故障轉(zhuǎn)移的群集的初始部署之后庵寞,您應(yīng)該測(cè)試其操作狸相。為此,首先找到活動(dòng)的NameNode捐川。如上所述脓鹃,您可以通過(guò)訪問(wèn)NameNode Web界面來(lái)確定哪個(gè)節(jié)點(diǎn)處于活動(dòng)狀態(tài)。
一旦找到活動(dòng)的NameNode古沥,就可以在該節(jié)點(diǎn)上引發(fā)故障将谊。例如,你可以使用 kill -9 <pid of NN> 模擬JVM崩潰渐白∽鹋ǎ或者,您可以重新啟動(dòng)機(jī)器或其網(wǎng)絡(luò)接口以模擬不同類型的停機(jī)纯衍。觸發(fā)中斷后栋齿,另一個(gè)NameNode應(yīng)在幾秒鐘內(nèi)自動(dòng)激活。檢測(cè)故障并觸發(fā)故障轉(zhuǎn)移所需的時(shí)間取決于配置ha.zookeeper.session-timeout.ms襟诸,默認(rèn)為5秒瓦堵。
如果測(cè)試不成功,則可能是配置錯(cuò)誤歌亲。檢查zkfc 日志 以及NameNode守護(hù)進(jìn)程來(lái)進(jìn)一步診斷問(wèn)題菇用。