官方文檔翻譯冯遂,官方鏈接蕊肥。
翻譯水平有限,且以學習為主蛤肌,請諒解和提意見晴埂。
轉(zhuǎn)載請注明出處!Q岸ā儒洛!
接著上一篇發(fā)布的文章繼續(xù)翻譯。這次從部署章節(jié)開始狼速。
部署
配置概述
類似聯(lián)邦的配置琅锻,HA的配置向后兼容,且允許不改變現(xiàn)有的單NameNode配置集群的配置向胡。如此設(shè)計新的配置恼蓬,以致于在集群所有節(jié)點可以使用相同的配置,不需要基于此類型的節(jié)點部署不同的配置文件到不同的機器上僵芹。
像HDFS聯(lián)邦機制一樣处硬,HA集群重用nameservice ID來標識一個單獨的HDFS實例,該實例實際上由多個NameNode組成拇派。另外荷辕,被稱為NameNode ID新的抽象加入到HA凿跳。在集群中每個不同的NameNode都有一個不同的NameNode ID以示區(qū)別。對于所有的NameNode支持單一的配置文件疮方,相關(guān)的配置參數(shù)使用nameservice ID為后綴控嗜,與NameNode ID等同。
配置細節(jié)
配置HA NameNode骡显,必須增加幾個配置項到hdfs-site.xml配置文件中疆栏。
對于你設(shè)置這些配置的順序并不重要,但是對于dfs.nameservices和dfs.ha.namenodes選項所選擇的值是重要的惫谤。[nameservice ID]將決定后面那些配置項的key壁顶。因此,設(shè)置剩下的配置項前溜歪,你將要決定這些值若专。
-
dfs.nameservices - 新的nameservice的邏輯名
為這個nameservice定義一個邏輯名,例如“mycluster”痹愚,且這個配置項的值即是這個邏輯名。這個名字可以任意定義蛔糯。它將被用于配置和在集群中作為絕對HDFS路徑的認證組件拯腮。
注意:如果同時使用了HDFS聯(lián)邦機制,這個配置將被設(shè)置成包括其它nameservices蚁飒、HA或其它的一個列表动壤,以逗號分割的列表。
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
-
dfs.ha.namenodes.[nameservice ID] - 對于在nameservice中的每個Namenode的唯一標識
使用逗號分隔的NameNode ID列表進行配置淮逻。這是DataNode確定集群中所有的NameNode琼懊。例如,如果之前你使用“mycluster”定義了nameservice ID爬早,且可以使用“nn1”和“nn2”作為各自的NameNode ID哼丈,將配置如下:
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
注意:目前,可以為每個nameservice配置最多兩個NameNode筛严。
-
dfs.namenode.rpc-address.[nameservice ID].[name node ID] - 每個Name Node的RPC地址和監(jiān)聽端口
對于之前配置的NameNode ID的兩個配置醉旦,設(shè)置全地址和NameNode進程的IPC端口。注意是兩個對立的配置項桨啃。例如:
<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>
-
dfs.namenode.http-address.[nameservice ID].[name node ID] - 每個NameNode的HTTP地址和監(jiān)聽端口
類似上面RPC地址车胡,設(shè)置NameNode的HTTP服務(wù)的地址和端口號。例如:
<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使用安全特性照瘾,可以為每個NameNode配置HTTPS匈棘。
-
dfs.namenode.shared.edits.dir - 標識JNs(NameNode將讀/寫的編輯記錄存入JNs)組的URI
JournalNode提供共享編輯存儲,有Active NameNode寫入析命,Standby NameNode讀取且保持更新有Active NameNode作出的所有文件系統(tǒng)的變化主卫,這里配置一個所有JournalNode地址的地址串逃默。雖然必須指定幾個JournalNode地址,僅配置一個URI串队秩。如下形式:
qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*
對于這個nameservice笑旺,這個Journal ID是唯一的標識,允許一個單一的JournalNode集為聯(lián)邦命名系統(tǒng)提供存儲馍资。雖然不是必須的筒主,但是為journal ID重用nameservice ID是個好建議。
例如鸟蟹,對于這個集群JournalNode運行在“node1.example.com”,“node2.example.com”和“node3.example.com”機器上乌妙,且nameservice ID是“mycluster”,可以使用如下的值進行配置建钥。JournalNode默認端口是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.client.failover.proxy.provider.[nameservice ID] - HDFS客戶端聯(lián)系A(chǔ)ctive NameNode的Java類
配置Java類名,該類將有DFS客戶端使用熊经,決定哪個NameNode是當前Active的泽艘,因此此NameNode是當前正在服務(wù)于客戶端請求。當前Hadoop唯一實現(xiàn)是ConfiguredFailoverProxyProvider镐依,因此使用這個匹涮,除非進行自定。例如:
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
-
dfs.ha.fencing.methods - 腳本或Java類的列表槐壳。在故障轉(zhuǎn)移期間然低,將用于fence這個Active NameNode。
對于理想狀態(tài)的系統(tǒng)來說务唐,在任意時刻有且僅有一個NameNode是在Active狀態(tài)下雳攘。重要的是,當時用QJM枫笛,永遠僅有一個NameNode將被允許寫入JNs吨灭,因此沒有可能由于腦裂現(xiàn)象破環(huán)文件系統(tǒng)元數(shù)據(jù)。但是刑巧,當故障轉(zhuǎn)移發(fā)生時沃于,原Active NameNode到客戶端的讀請求服務(wù)仍然可能,這可能是過時的海诲,因為直到NameNode停止的這段時間繁莹,NameNode仍嘗試向JNs寫入√蒯#基于這個原因咨演,當時用QJM時仍然需要配置一些fencing方法。然而蚯斯,在fencing機制失敗事件中提高系統(tǒng)可用性薄风。配置一個fencing方法最明智是在fencing方法列表最后確保返回成功饵较。注意如果沒有選擇沒有實際fencing方法,還必須配置一些設(shè)置遭赂,比如:“shell(/bin/true)”循诉。
fencing方法配置一個以回車分割的列表,將按順序執(zhí)行撇他,直至一個fencing明確返回成功茄猫。hadoop提供兩種方法:shell和sshfence。對于自定義fencing方法的實現(xiàn)困肩,參看org.apache.hadoop.ha.NodeFencer類划纽。
1)sshfence - SSH到Active NameNode并kill掉這個進程
sshfence選項SSH到目標節(jié)點,使用fuser殺掉在TCP端口監(jiān)聽的服務(wù)進程锌畸。為了可以讓這個fencing選項能夠工作勇劣,必須可以在沒有密碼的情況下,SSH到目標節(jié)點潭枣。因此比默,必須配置一個dfs.ha.fencing.ssh.private-key-files配置項,逗號分隔的SSH私鑰文件的列表盆犁。例如:
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/exampleuser/.ssh/id_rsa</value>
</property>
可選命咐,可以配置一個非標準帶用戶名和端口執(zhí)行SSH,也可以配置超時蚣抗,單位ms侈百;對于SSH瓮下,fencing方法過時后翰铡,將被認為失敗。配置如下:
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence([[username][:port]])</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
2)shell - 運行一個shell腳本讽坏,fence這個Active NameNode
Shell fencing方法運行一個任意的shell腳本锭魔,配置如下:
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
</property>
“(”和“)”之間的字符串直接傳遞到bash shell,中間不能包含任何關(guān)閉括號路呜。
shell命令運行在一個包含所有當前Hadoop配置的環(huán)境里迷捧,使用配置鍵時使用'_'替換'.'。
另外胀葱,如下變量引用目標機器執(zhí)行fencing:
變量名 | 說明 |
---|---|
$target_host | 被fencing的節(jié)點主機名 |
$target_port | 被fencing的節(jié)點的IPC端口 |
$target_address | 包含上述兩個變量漠秋,形如:host:port |
$target_nameserviceid | 被fencing的NN的nameservice ID |
$target_namenodeid | 被fencing的NN的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抵屿,fencing被確定為成功庆锦。如果返回其它退出碼,這個fencing沒有成功轧葛,在列表中的下一個fencing將被執(zhí)行搂抒。
注意:fencing方法沒有實現(xiàn)任何超時艇搀。如果超時是必須的,應(yīng)該在shell腳本中實現(xiàn)(例如通過子shell殺掉父進程的秒數(shù))求晶。
-
fs.defaultFS - 當沒有給定時焰雕,Hadoop FS客戶端使用的默認路徑前綴
可選,現(xiàn)在可以使用HA邏輯URI配置默認的Hadoop客戶端路徑芳杏。比如之前使用"mycluster"定義的nameservice ID矩屁,定義為HDFS路徑認證部分的值。在core-site.xml文件中形如:
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
-
dfs.journalnode.edits.dir - JournalNode進程存儲它的本地狀態(tài)的路徑
這是在JournalNode節(jié)點機器上的絕對路徑蚜锨,編輯日志和其它本地狀態(tài)將本存儲在這個路徑下档插。可以使用單一路徑作為配置亚再。這些數(shù)據(jù)的冗余是由索格JN提供的郭膛,或者把這個目錄配置在本地的RAID上。例如:
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journal/node/local/data</value>
</property>
部署細節(jié)
在準備好所有必須的配置項后氛悬,必須啟動JournalNode守護進程则剃。使用hadoop-daemon.sh start journalnode命令啟動,并等待每個相關(guān)的機器上的進程啟動完成如捅。
一旦JournalNode已經(jīng)啟動完成棍现,必須初始化同步兩個NameNode在磁盤的元數(shù)據(jù)。
- 如果是設(shè)置一個新的HDFS集群镜遣,需要首先在其中一個NameNodes運行如下命令:
hdfs namenode -format
- 如果已經(jīng)格式化了NameNode己肮,或是轉(zhuǎn)換一個非HA集群到HA集群,需要將現(xiàn)有的NameNode元數(shù)據(jù)復(fù)制到其它未格式化的NameNode上悲关,要在未格式化的NameNode運行如下命令:
hdfs namenode -bootstrapStandby
運行該命令谎僻,確保JN(由dfs.namenode.shared.edits.dir作為配置)包含足夠的編輯記錄事務(wù)支持兩個NameNode啟動。
- 如果轉(zhuǎn)換一個非HA的NameNode成為HA的NameNode寓辱,需要運行如下命令:
hdfs namenode -initializeSharedEdits
這個命令將從本地NameNode編輯記錄目錄初始化JN使用的編輯記錄數(shù)據(jù)艘绍。
現(xiàn)在可以啟動兩個HA的NameNode,就像啟動一般的NameNode秫筏。
可以分別通過配置的HTTP地址訪問每個NameNode的web頁面诱鞠。將注意到配置地址顯示NameNode的HA狀態(tài)('active' 或'standby')。HA的NameNode初始狀態(tài)任何時候都是Standby这敬。