HDFS參數(shù)調(diào)優(yōu)
點(diǎn)擊上方“IT那活兒”公眾號(hào),關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了!?。?/strong>
NameNode數(shù)據(jù)目錄
dfs.name.dir, dfs.namenode.name.dir
指定一個(gè)本地文件系統(tǒng)路徑,決定NN在何處存放fsimage和editlog文件??梢酝ㄟ^逗號(hào)分隔指定多個(gè)路徑. 目前我們的產(chǎn)線環(huán)境只配置了一個(gè)目錄,并存放在了做了RAID1或RAID5的磁盤上。
DataNode數(shù)據(jù)路徑
dfs.data.dir, dfs.datanode.data.dir
指定DN存放塊數(shù)據(jù)的本地盤路徑,可以通過逗號(hào)分隔指定多個(gè)路徑。在生產(chǎn)環(huán)境可能會(huì)在一個(gè)DN上掛多塊盤。
數(shù)據(jù)塊的副本數(shù)
數(shù)據(jù)塊的副本數(shù),默認(rèn)值為3。
數(shù)據(jù)塊大小
HDFS數(shù)據(jù)塊的大小,默認(rèn)為128M,目前我們產(chǎn)線環(huán)境配置的是1G。
HDFS做均衡時(shí)使用的最大帶寬
dfs.datanode.balance.bandwidthPerSec
HDFS做均衡時(shí)使用的最大帶寬,默認(rèn)為1048576,即1MB/s,對(duì)大多數(shù)千兆甚至萬兆帶寬的集群來說過小。不過該值可以在啟動(dòng)balancer腳本時(shí)再設(shè)置,可以不修改集群層面默認(rèn)值。目前目前我們產(chǎn)線環(huán)境設(shè)置的是50M/s~100M/s。
磁盤可損壞數(shù)
dfs.datanode.failed.volumes.tolerated
DN多少塊盤損壞后停止服務(wù),默認(rèn)為0,即一旦任何磁盤故障DN即關(guān)閉。對(duì)盤較多的集群(例如每DN12塊盤),磁盤故障是常態(tài),通??梢詫⒃撝翟O(shè)置為1或2,避免頻繁有DN下線。
數(shù)據(jù)傳輸連接數(shù)
dfs.datanode.max.xcievers
DataNode可以同時(shí)處理的數(shù)據(jù)傳輸連接數(shù),即指定在DataNode內(nèi)外傳輸數(shù)據(jù)使用的最大線程數(shù)。官方將該參數(shù)的命名改為dfs.datanode.max.transfer.threads,默認(rèn)值為4096,推薦值為8192,我們產(chǎn)線環(huán)境也是8192。
NameNode處理RPC調(diào)用的線程數(shù)
dfs.namenode.handler.count
NameNode中用于處理RPC調(diào)用的線程數(shù),默認(rèn)為10。對(duì)于較大的集群和配置較好的服務(wù)器,可適當(dāng)增加這個(gè)數(shù)值來提升NameNode RPC服務(wù)的并發(fā)度,該參數(shù)的建議值:集群的自然對(duì)數(shù) * 20。python -c import math ; print int(math.log(N) * 20)
我們800+節(jié)點(diǎn)產(chǎn)線環(huán)境配置的是200~500之間。
NameNode處理datanode 上報(bào)數(shù)據(jù)塊和心跳的線程數(shù)
dfs.namenode.service.handler.count
用于處理datanode 上報(bào)數(shù)據(jù)塊和心跳的線程數(shù)量,與dfs.namenode.handler.count算法一致。
DataNode處理RPC調(diào)用的線程數(shù)
dfs.datanode.handler.count
DataNode中用于處理RPC調(diào)用的線程數(shù),默認(rèn)為3??蛇m當(dāng)增加這個(gè)數(shù)值來提升DataNode RPC服務(wù)的并發(fā)度,線程數(shù)的提高將增加DataNode的內(nèi)存需求,因此,不宜過度調(diào)整這個(gè)數(shù)值。我們產(chǎn)線環(huán)境設(shè)置的是10。
dfs.datanode.max.xcievers
最大傳輸線程數(shù) 指定在 DataNode 內(nèi)外傳輸數(shù)據(jù)使用的最大線程數(shù)。這個(gè)值是指定 datanode 可同時(shí)處理的最大文件數(shù)量,推薦將這個(gè)值調(diào)大,默認(rèn)是256,最大值可以配置為65535,我們產(chǎn)線環(huán)境配置的是8192。
–設(shè)定在讀寫數(shù)據(jù)時(shí)的緩存大小,應(yīng)該為硬件分頁大小的2倍。
我們產(chǎn)線環(huán)境設(shè)置的為65536 ( 64K) 。冗余數(shù)據(jù)塊刪除
在日常維護(hù)hadoop集群的過程中發(fā)現(xiàn)這樣一種情況:某個(gè)節(jié)點(diǎn)由于網(wǎng)絡(luò)故障或者DataNode進(jìn)程死亡,被NameNode判定為死亡,HDFS馬上自動(dòng)開始數(shù)據(jù)塊的容錯(cuò)拷貝;當(dāng)該節(jié)點(diǎn)重新添加到集群中時(shí),由于該節(jié)點(diǎn)上的數(shù)據(jù)其實(shí)并沒有損壞,所以造成了HDFS上某些block的備份數(shù)超過了設(shè)定的備份數(shù)。通過觀察發(fā)現(xiàn),這些多余的數(shù)據(jù)塊經(jīng)過很長(zhǎng)的一段時(shí)間才會(huì)被完全刪除掉,那么這個(gè)時(shí)間取決于什么呢?該時(shí)間的長(zhǎng)短跟數(shù)據(jù)塊報(bào)告的間隔時(shí)間有關(guān)。Datanode會(huì)定期將當(dāng)前該結(jié)點(diǎn)上所有的BLOCK信息報(bào)告給NameNode,參數(shù)dfs.blockreport.intervalMsec就是控制這個(gè)報(bào)告間隔的參數(shù)。hdfs-site.xml文件中有一個(gè)參數(shù):<property>
<name>dfs.blockreport.intervalMsecname>
<value>3600000value>
<description>Determines block reporting interval in milliseconds.description>
property>
其中3600000為默認(rèn)設(shè)置,3600000毫秒,即1個(gè)小時(shí),也就是說,塊報(bào)告的時(shí)間間隔為1個(gè)小時(shí),所以經(jīng)過了很長(zhǎng)時(shí)間這些多余的塊才被刪除掉。通過實(shí)際測(cè)試發(fā)現(xiàn),當(dāng)把該參數(shù)調(diào)整的稍小一點(diǎn)的時(shí)候(60秒),多余的數(shù)據(jù)塊確實(shí)很快就被刪除了。
當(dāng)datanode上新寫完一個(gè)塊,默認(rèn)會(huì)立即匯報(bào)給namenode。在一個(gè)大規(guī)模Hadoop集群上,每時(shí)每刻都在寫數(shù)據(jù),datanode上隨時(shí)都會(huì)有寫完數(shù)據(jù)塊然后匯報(bào)給namenode的情況。因此namenode會(huì)頻繁處理datanode這種快匯報(bào)請(qǐng)求,會(huì)頻繁地持有鎖,其實(shí)非常影響其他rpc的處理和響應(yīng)時(shí)間。通過延遲快匯報(bào)配置可以減少datanode寫完塊后的塊匯報(bào)次數(shù),提高namenode處理rpc的響應(yīng)時(shí)間和處理速度。<property>
<name>dfs.blockreport.incremental.intervalMsecname>
<value>300value>
property>
我們產(chǎn)線環(huán)境HDFS集群上此參數(shù)配置為500毫秒,就是當(dāng)datanode新寫一個(gè)塊,不是立即匯報(bào)給namenode,而是要等待500毫秒,在此時(shí)間段內(nèi)新寫的塊一次性匯報(bào)給namenode。
增大同時(shí)打開的文件描述符和網(wǎng)絡(luò)連接上限使用ulimit命令將允許同時(shí)打開的文件描述符數(shù)目上限增大至一個(gè)合適的值。同時(shí)調(diào)整內(nèi)核參數(shù)net.core.somaxconn網(wǎng)絡(luò)連接數(shù)目至一個(gè)足夠大的值。補(bǔ)充:net.core.somaxconn的作用 net.core.somaxconn是Linux中的一個(gè)kernel參數(shù),表示socket監(jiān)聽(listen)的backlog上限。什么是backlog呢?backlog就是socket的監(jiān)聽隊(duì)列,當(dāng)一個(gè)請(qǐng)求(request)尚未被處理或建立時(shí),它會(huì)進(jìn)入backlog。而socket server可以一次性處理backlog中的所有請(qǐng)求,處理后的請(qǐng)求不再位于監(jiān)聽隊(duì)列中。當(dāng)server處理請(qǐng)求較慢,以至于監(jiān)聽隊(duì)列被填滿后,新來的請(qǐng)求會(huì)被拒絕。在Hadoop 1.0中,參數(shù)ipc.server.listen.queue.size控制了服務(wù)端socket的監(jiān)聽隊(duì)列長(zhǎng)度,即backlog長(zhǎng)度,默認(rèn)值是128。而Linux的參數(shù)net.core.somaxconn默認(rèn)值同樣為128。當(dāng)服務(wù)端繁忙時(shí),如NameNode或JobTracker,128是遠(yuǎn)遠(yuǎn)不夠的。這樣就需要增大backlog,例如我們的集群就將ipc.server.listen.queue.size設(shè)成了32768,為了使得整個(gè)參數(shù)達(dá)到預(yù)期效果,同樣需要將kernel參數(shù)net.core.somaxconn設(shè)成一個(gè)大于等于32768的值。
本文來源:IT那活兒(上海新炬王翦團(tuán)隊(duì))

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/129498.html