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