在HDFS集群中,一般設(shè)置多副本提高可靠性(冗余),也能提高數(shù)據(jù)讀取的總體性能米丘。但這多個(gè)副本應(yīng)該選擇哪些節(jié)點(diǎn)進(jìn)行放置呢剑令?即本文要討論的數(shù)據(jù)放置策略,或稱多副本放置策略 replica placement policy拄查。
mark: 本文中吁津,默認(rèn)副本因子為3。
最原始的放置策略即把三個(gè)副本盡量分配到不同的三個(gè)節(jié)點(diǎn)上堕扶。否則碍脏,假設(shè)兩副本放置到了一個(gè)節(jié)點(diǎn),則會(huì)因?yàn)樵摴?jié)點(diǎn)的故障而直接損失兩個(gè)副本稍算,且在該數(shù)據(jù)被大量客戶端同時(shí)讀取時(shí)典尾,兩個(gè)副本也不能分擔(dān)負(fù)載(該節(jié)點(diǎn)的處理能力即上限)。
機(jī)架感知策略 Rack Awareness
既然考慮了節(jié)點(diǎn)故障邪蛔,不妨再考慮下機(jī)架故障:由于斷電/物理線路斷路/交換機(jī)故障等問題造成一整個(gè)機(jī)架的機(jī)子同時(shí)崩潰時(shí)……若某個(gè)重要機(jī)密放置時(shí)正好全放在了這一個(gè)機(jī)架的三臺(tái)機(jī)子上……就問你怕不怕急黎!
若我們?cè)跀?shù)據(jù)放置時(shí),盡量將一個(gè)數(shù)據(jù)的不同副本盡量均勻地放置到不同機(jī)架的機(jī)子中侧到,就能有效避免機(jī)架崩潰即數(shù)據(jù)丟失的情況勃教,提高可靠度。若你非要問我:幾個(gè)機(jī)架都崩潰了呢匠抗?機(jī)房都沒了呢故源?我也無言以對(duì),抱拳向“杠精”致敬汞贸。
網(wǎng)絡(luò)拓?fù)?/h5>
實(shí)現(xiàn)“均勻放置到不同機(jī)架”的策略之前绳军,我們需要先識(shí)別不同的機(jī)架。在Hadoop中矢腻,通過網(wǎng)絡(luò)拓?fù)鋵?duì)節(jié)點(diǎn)進(jìn)行相對(duì)位置定義门驾。樹形的網(wǎng)絡(luò)位置拓?fù)淙缦拢粋€(gè)嚴(yán)格的層級(jí)結(jié)構(gòu)多柑。
/datacenter/rack/node奶是,類似文件系統(tǒng)中的文件路徑名,Hadoop據(jù)此來識(shí)別不同的節(jié)點(diǎn)竣灌。
但是集群無法自己感知到各節(jié)點(diǎn)的相對(duì)位置(其實(shí)可以通過探測(cè)網(wǎng)絡(luò)延遲來推斷)聂沙,需要進(jìn)行機(jī)架感知的配置。配置前初嘹,所有的節(jié)點(diǎn)的相對(duì)位置都默認(rèn)為是一樣的“/default-rack”及汉,只會(huì)通過IP去區(qū)分。
Hadoop中屯烦,可通過調(diào)用Java類或配置文件指定的外部腳本來獲取各節(jié)點(diǎn)的網(wǎng)絡(luò)位置標(biāo)志符坷随。但兩種方式都需要遵守繼承org.apache.hadoop.net.DNSToSwitchMapping接口房铭,以保證節(jié)點(diǎn)與ID的一一對(duì)應(yīng)關(guān)系,拓?fù)湫畔⒏袷?rack/host温眉。
- 使用Java類:實(shí)現(xiàn)一個(gè)類育叁,該類將由net.topology.node.switch.mapping.impl參數(shù)指定
- 使用外部腳本:由net.topology.script.file.name參數(shù)指定,以下是官網(wǎng)給的一個(gè)python腳本示例芍殖,輸入節(jié)點(diǎn)IP可輸出對(duì)應(yīng)的位置ID。
#!/usr/bin/python
# this script makes assumptions about the physical environment.
# 1) each rack is its own layer 3 network with a /24 subnet, which
# could be typical where each rack has its own
# switch with uplinks to a central core router.
# 2) topology script gets list of IP's as input, calculates network address, and prints '/network_address/ip'.
import netaddr
import sys
sys.argv.pop(0) # discard name of topology script from argv list as we just want IP addresses
netmask = '255.255.255.0' # set netmask to what's being used in your environment. The example uses a /24
for ip in sys.argv: # loop over list of datanode IP's
address = '{0}/{1}'.format(ip, netmask) # format address string so it looks like 'ip/netmask' to make netaddr work
try:
network_address = netaddr.IPNetwork(address).network # calculate and print network address
print "/{0}".format(network_address)
except:
print "/rack-unknown"
機(jī)架感知策略
啟用機(jī)架感知后的副本放置策略具體如下:
- 如果writer在集群節(jié)點(diǎn)中谴蔑,將副本一放置到它所屬的節(jié)點(diǎn)上豌骏,無法滿足則放置到與它同機(jī)架的隨機(jī)一個(gè)節(jié)點(diǎn),再不行就隨機(jī)一個(gè)節(jié)點(diǎn)隐锭。
- 副本二放置到不同機(jī)架的節(jié)點(diǎn)上窃躲。
- 副本三放置到與副本二同機(jī)架的節(jié)點(diǎn)中。
由此避免機(jī)架故障帶來的數(shù)據(jù)丟失钦睡,并能有效減少機(jī)架間的寫數(shù)據(jù)帶來的流量開銷蒂窒,可提高寫入性能,但是限定在了兩個(gè)機(jī)架中從而降低了數(shù)據(jù)讀取的總網(wǎng)絡(luò)帶寬荞怒。算是一個(gè)總體性能的綜合衡量考慮吧洒琢。
若副本因子大于3,后續(xù)的副本會(huì)隨機(jī)放置褐桌,但總體上會(huì)保證每個(gè)機(jī)架的副本數(shù)量小于 衰抑。
LDBAS(可靠性部分)
在云環(huán)境中又不一樣了。在云平臺(tái)中荧嵌,兩個(gè)虛擬機(jī)可能會(huì)存在于一臺(tái)物理宿主機(jī)中呛踊,稱之為虛擬機(jī)共存。若兩個(gè)副本被分配到這兩個(gè)同宿主機(jī)的虛擬節(jié)點(diǎn)中啦撮,一樣地存在可靠性下降(當(dāng)物理機(jī)宕掉時(shí))和性能瓶頸(該節(jié)點(diǎn)的處理能力限制了該副本的并發(fā)讀取上限)谭网。
LDBAS即解決了云環(huán)境中,虛擬共存帶來的可靠性下降赃春,主要思想即重構(gòu)Hadoop網(wǎng)絡(luò)拓?fù)溆湓瘢瑢⑻摂M節(jié)點(diǎn)的物理宿主機(jī)信息考量其中,副本分配時(shí)盡量分布到不同物理宿主機(jī)的虛擬機(jī)節(jié)點(diǎn)聘鳞,避免或減少副本在硬件設(shè)備(物理機(jī)/機(jī)架)的冗余放置薄辅,從而提高可靠性。即網(wǎng)絡(luò)拓?fù)涓聻椋?機(jī)架/物理宿主機(jī)/虛擬節(jié)點(diǎn)抠璃。
由圖站楚,可定義兩個(gè)節(jié)點(diǎn)的距離為樹中最短路徑的邊的條數(shù)。由此節(jié)點(diǎn)間距離越小搏嗡,即節(jié)點(diǎn)的共存信息越少窿春,在其中放置副本的可靠性越高拉一。故將節(jié)點(diǎn)間距離作為副本放置時(shí)選擇節(jié)點(diǎn)的依據(jù)。
如何求解副本放置的多個(gè)節(jié)點(diǎn)呢旧乞?暴力求解固然能得到最優(yōu)解蔚润,但遍歷搜索多節(jié)點(diǎn)集合選擇相對(duì)距離最小的一個(gè),求解的時(shí)間復(fù)雜度達(dá)到O(n^k)尺栖,k是副本因子數(shù)嫡纠。HDFS原始放置策略,是針對(duì)每個(gè)副本都遍歷節(jié)點(diǎn)進(jìn)行選擇延赌,復(fù)雜度在(可·n)除盏,LDBAS也采用了貪心算法求解:
- 優(yōu)先客戶端所在節(jié)點(diǎn)或與其同機(jī)架節(jié)點(diǎn)或隨機(jī)
- 與副本一放置節(jié)點(diǎn),距離最遠(yuǎn)的節(jié)點(diǎn)
- 與副本一挫以、二放置節(jié)點(diǎn)總距離最遠(yuǎn)的節(jié)點(diǎn)
實(shí)質(zhì)策略中者蠕,還考慮了本地性的影響因素,此處僅針對(duì)可靠性掐松,不做展開(可見后續(xù)文章)踱侣。
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袭灯,“玉大人刺下,你說我怎么就攤上這事』” “怎么了橘茉?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)姨丈。 經(jīng)常有香客問我畅卓,道長(zhǎng),這世上最難降的妖魔是什么蟋恬? 我笑而不...
- 正文 為了忘掉前任翁潘,我火速辦了婚禮,結(jié)果婚禮上歼争,老公的妹妹穿的比我還像新娘拜马。我一直安慰自己渗勘,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布俩莽。 她就那樣靜靜地躺著旺坠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扮超。 梳的紋絲不亂的頭發(fā)上取刃,一...
- 文/蒼蘭香墨 我猛地睜開眼屁柏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了有送?” 一聲冷哼從身側(cè)響起淌喻,我...
- 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雀摘,沒想到半個(gè)月后裸删,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡阵赠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年涯塔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片清蚀。...
- 正文 年R本政府宣布东揣,位于F島的核電站践惑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嘶卧。R本人自食惡果不足惜尔觉,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芥吟。 院中可真熱鬧穷娱,春花似錦绑蔫、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嫁盲,卻和暖如春篓叶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羞秤。 一陣腳步聲響...
- 正文 我出身青樓俐镐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親哺哼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佩抹,可洞房花燭夜當(dāng)晚...