1. HDFS對(duì)底層的磁盤(pán)存儲(chǔ)如何選擇的?
一個(gè)HDFS集群,會(huì)有很多個(gè)datanode節(jié)點(diǎn),每個(gè)datanode節(jié)點(diǎn)會(huì)掛載很多塊磁盤(pán)。HDFS在存儲(chǔ)數(shù)據(jù)時(shí)如何動(dòng)態(tài)負(fù)載均衡最優(yōu)化地往每個(gè)datanode,每個(gè)磁盤(pán)上存儲(chǔ)數(shù)據(jù)呢?
其實(shí)沒(méi)啥,DataNode在運(yùn)行過(guò)程中,為了計(jì)算DN的capacity使用量,實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的動(dòng)態(tài)均衡,DN會(huì)對(duì)已配置的數(shù)據(jù)存儲(chǔ)路徑(dfs.datanode.data.dir)進(jìn)行du -sk操作,以此獲得capacity使用量匯報(bào)給NN中,然后NN就知道哪些DN有空間能被寫(xiě)數(shù)據(jù)進(jìn)去,哪些是空間不足的。
為了保證數(shù)據(jù)使用量的近實(shí)時(shí)性,目前DN是以默認(rèn)10分鐘的間隔時(shí)間執(zhí)行一次。假設(shè)按照一個(gè)DN節(jié)點(diǎn)12個(gè)數(shù)據(jù)目錄對(duì)應(yīng)12塊盤(pán)的情況,就會(huì)有12個(gè)du操作在每個(gè)10分鐘內(nèi)都會(huì)執(zhí)行一次。在datanode存儲(chǔ)的數(shù)據(jù)使用率比較高的時(shí)候,會(huì)十分消耗性能。直接引發(fā)阻塞io,系統(tǒng)load直線增高。
這種問(wèn)題在大規(guī)模的集群中是很常見(jiàn)的,下面是針對(duì)線上(hadoop2.6版本的)簡(jiǎn)易零時(shí)的優(yōu)化手段。說(shuō)明:此問(wèn)題僅存在于低于hadoop2.8版本,高于此版本已經(jīng)修復(fù)。
https://issues.apache.org/jira/browse/HADOOP-9884
如果碰到這種情況,升級(jí)不了集群版本,那么我們還有其他奇技淫巧嗎?
2.通過(guò)修改HDFS代碼實(shí)現(xiàn)優(yōu)化
先回顧一下du,df的使用
du原理簡(jiǎn)述:
du命令全程disk usage,它的統(tǒng)計(jì)原理在于將目標(biāo)路徑下的當(dāng)前沒(méi)有被刪除的文件進(jìn)行大小累加,然后得出總使用量。這種計(jì)算方式在文件數(shù)量少時(shí)往往不會(huì)表現(xiàn)出什么問(wèn)題。但是當(dāng)目標(biāo)路徑目錄多,文件多的時(shí)候,du會(huì)表現(xiàn)出明顯的時(shí)間執(zhí)行耗時(shí)。
df 原理簡(jiǎn)述:
df命令統(tǒng)計(jì)值通過(guò)文件系統(tǒng)獲取的。df命令的弊端是它不能按照具體目錄進(jìn)行使用量的統(tǒng)計(jì)。df是按照所在磁盤(pán)級(jí)別進(jìn)行統(tǒng)計(jì)的。換句話說(shuō),用df命令在屬于同一塊物理盤(pán)的子路徑下執(zhí)行df命令,獲取的值會(huì)是完全一致的。比較遺憾,這種情況將無(wú)法支持DataNode多block pool共用一塊盤(pán)的情況。
處理方式:使用 df 命令替換 du
捕獲到datanode執(zhí)行過(guò)程中調(diào)用的 du -sk 命令,替換為df -k 。
實(shí)現(xiàn)腳本如下:
##將原始的 du指令更換名稱
