大資料基礎運維 HDFS引數調優

2021-10-17 14:27:06 字數 3987 閱讀 9463

1.namenode資料目錄

dfs.name.dir, dfs.namenode.name.dir

指定乙個本地檔案系統路徑,決定nn在何處存放fsimage和editlog檔案。可以通過逗號分隔指定多個路徑. 目前我們的產線環境只配置了乙個目錄,並存放在了做了raid1或raid5的磁碟上。

2.datanode資料目錄

dfs.data.dir, dfs.datanode.data.dir

指定dn存放塊資料的本地盤路徑,可以通過逗號分隔指定多個路徑。在生產環境可能會在乙個dn上掛多塊盤。

3.資料塊的副本數

dfs.replication

資料塊的副本數,預設值為3

4.資料塊大小

dfs.block.size

hdfs資料塊的大小,預設為128m,目前我們產線環境配置的是1g

5.hdfs做均衡時使用的最大頻寬

dfs.datanode.balance.bandwidthpersec

hdfs做均衡時使用的最大頻寬,預設為1048576,即1mb/s,對大多數千兆甚至萬兆頻寬的集群來說過小。不過該值可以在啟動balancer指令碼時再設定,可以不修改集群層面預設值。目前目前我們產線環境設定的是50m/s~100m/s

6.磁碟可損壞數

dfs.datanode.failed.volumes.tolerated

dn多少塊盤損壞後停止服務,預設為0,即一旦任何磁碟故障dn即關閉。對盤較多的集群(例如每dn12塊盤),磁碟故障是常態,通常可以將該值設定為1或2,避免頻繁有dn下線。

7.資料傳輸連線數

dfs.datanode.max.xcievers

datanode可以同時處理的資料傳輸連線數,即指定在datanode內外傳輸資料使用的最大執行緒數。官方將該引數的命名改為dfs.datanode.max.transfer.threads,預設值為4096,推薦值為8192,我們產線環境也是8192

8.namenode處理rpc呼叫的執行緒數

dfs.namenode.handler.count

namenode中用於處理rpc呼叫的執行緒數,預設為10。對於較大的集群和配置較好的伺服器,可適當增加這個數值來提公升namenode rpc服務的併發度,該引數的建議值:集群的自然對數 * 20

python -c 'import math ; print int(math.log(n) * 20)'

我們800+節點產線環境配置的是200~500之間

9.namenode處理datanode 上報資料塊和心跳的執行緒數

dfs.namenode.service.handler.count

用於處理datanode 上報資料塊和心跳的執行緒數量,與dfs.namenode.handler.count演算法一致

10.datanode處理rpc呼叫的執行緒數

dfs.datanode.handler.count

datanode中用於處理rpc呼叫的執行緒數,預設為3。可適當增加這個數值來提公升datanode rpc服務的併發度,執行緒數的提高將增加datanode的記憶體需求,因此,不宜過度調整這個數值。我們產線環境設定的是10

11.datanode最大傳輸線程數

dfs.datanode.max.xcievers

最大傳輸線程數 指定在 datanode 內外傳輸資料使用的最大執行緒數。

這個值是指定 datanode 可同時處理的最大檔案數量,推薦將這個值調大,預設是256,最大值可以配置為65535,我們產線環境配置的是8192。

12.讀寫資料時的快取大小

io.file.buffer.size

–設定在讀寫資料時的快取大小,應該為硬體分頁大小的2倍

我們產線環境設定的為65536 ( 64k) 

13.冗餘資料塊刪除

在日常維護hadoop集群的過程中發現這樣一種情況:

某個節點由於網路故障或者datanode程序死亡,被namenode判定為死亡,hdfs馬上自動開始資料塊的容錯拷貝;當該節點重新新增到集群中時,由於該節點上的資料其實並沒有損壞,所以造成了hdfs上某些block的備份數超過了設定的備份數。通過觀察發現,這些多餘的資料塊經過很長的一段時間才會被完全刪除掉,那麼這個時間取決於什麼呢?

該時間的長短跟資料塊報告的間隔時間有關。datanode會定期將當前該結點上所有的block資訊報告給namenode,引數dfs.blockreport.intervalmsec就是控制這個報告間隔的引數。

hdfs-site.xml檔案中有乙個引數:

dfs.blockreport.intervalmsec

3600000

determines block reporting interval in milliseconds.

其中3600000為預設設定,3600000毫秒,即1個小時,也就是說,塊報告的時間間隔為1個小時,所以經過了很長時間這些多餘的塊才被刪除掉。通過實際測試發現,當把該引數調整的稍小一點的時候(60秒),多餘的資料塊確實很快就被刪除了

14.新增塊延遲匯報

當datanode上新寫完乙個塊,缺省會立即匯報給namenode。在乙個大規模hadoop集群上,每時每刻都在寫資料,datanode上隨時都會有寫完資料塊然後匯報給namenode的情況。因此namenode會頻繁處理datanode這種快匯報請求,會頻繁地持有鎖,其實非常影響其他rpc的處理和響應時間。

通過延遲快匯報配置可以減少datanode寫完塊後的塊匯報次數,提高namenode處理rpc的響應時間和處理速度。

dfs.blockreport.incremental.intervalmsec

300

我們產線環境hdfs集群上此引數配置為500毫秒,就是當datanode新寫乙個塊,不是立即匯報給namenode,而是要等待500毫秒,在此時間段內新寫的塊一次性匯報給namenode。

15.增大同時開啟的檔案描述符和網路連線上限

使用ulimit命令將允許同時開啟的檔案描述符數目上限增大至乙個合適的值。同時調整核心引數net.core.somaxconn網路連線數目至乙個足夠大的值。

補充: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的值。

大資料運維 HDFS學習

一 hdfs概念 1 介紹 hadoop distributed file system,簡稱hdfs,是乙個分布式檔案系統。hdfs有著高容錯性 fault tolerent 的特點,並且設計用來部署在低廉的 low cost 硬體上。而且它提供高吞吐量 high throughput 來訪問應用...

Hadoop 調優篇 運維視角

hadoop運維人員,負責為hadoop提供乙個高效和可靠的作業執行環境,很多時候,需要從全域性出發,通過調整一些關鍵引數以提供系統的效能和吞吐量.總體上看,hadoop運維需要從硬體選擇,作業系統引數調優,jvm引數調優,hadoop引數調優四個方面著手進行調優 1.硬體選擇 在硬體環境中,應著重...

大資料集群調優

場景1 在datanode開始工作 通電 的時候,會上報本地的資料塊給namenode的客戶端進行註冊,這時候客戶端個數比較關鍵,如果太少,datanode在連線namenode的時候會出現總是超時或者連線被拒絕 如果設定太大,則記憶體開銷會增大,造成不必要的浪費,最終可能導致記憶體溢位。引數 df...