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