HDFS HA啟用

翻譯: 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耕蝉。

  1. 執(zhí)行HDFS HA硬件配置下描述的所有配置和設(shè)置任務(wù)崔梗。
  2. 確保你有一個(gè)ZooKeeper服務(wù)。
  3. 轉(zhuǎn)到HDFS服務(wù)垒在。
  4. 選擇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í)行。

  1. 如果要配置群集中的其他服務(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:

  1. 停止HDFS服務(wù)。

  2. 配置服務(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修改配置屬性

  3. 在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

  4. 單擊Instances 選項(xiàng)卡况木。

  5. 選擇 Actions > Initialize High Availability State in ZooKeeper.

  6. 啟動(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

  1. 將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
  1. 在他們將要運(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

  1. 啟動(dòng)主(已格式化)的NameNode:
$ sudo service hadoop-hdfs-namenode start
  1. 啟動(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)題菇用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市陷揪,隨后出現(xiàn)的幾起案子惋鸥,更是在濱河造成了極大的恐慌,老刑警劉巖悍缠,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卦绣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡飞蚓,警方通過(guò)查閱死者的電腦和手機(jī)滤港,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)趴拧,“玉大人溅漾,你說(shuō)我怎么就攤上這事山叮。” “怎么了添履?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵聘芜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我缝龄,道長(zhǎng),這世上最難降的妖魔是什么挂谍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任叔壤,我火速辦了婚禮,結(jié)果婚禮上口叙,老公的妹妹穿的比我還像新娘炼绘。我一直安慰自己,他們只是感情好妄田,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布俺亮。 她就那樣靜靜地躺著,像睡著了一般疟呐。 火紅的嫁衣襯著肌膚如雪脚曾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天启具,我揣著相機(jī)與錄音本讥,去河邊找鬼。 笑死鲁冯,一個(gè)胖子當(dāng)著我的面吹牛拷沸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播薯演,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼撞芍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了跨扮?” 一聲冷哼從身側(cè)響起序无,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衡创,沒(méi)想到半個(gè)月后愉镰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钧汹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年丈探,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拔莱。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碗降,死狀恐怖隘竭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讼渊,我是刑警寧澤动看,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站爪幻,受9級(jí)特大地震影響菱皆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挨稿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一仇轻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奶甘,春花似錦篷店、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至钉赁,卻和暖如春蹄殃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背你踩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工窃爷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姓蜂。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓按厘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钱慢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逮京,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容