HDFS的配置詳解和日常維護
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.HDFS運維概述
HDFS的運維主要分為兩方面,一方面是對文件系統的管理,這部分與linux文件系統的操作有很多相似之處,較易掌握;另一方面是對分布式進程的管理.
通過Cloudera Manager Server的Web UI去訪問HDFS界面。具體操作如下:
1>.點擊HDFS服務
2>.點擊"Web UI",隨機選擇一個NameNode節點(我這里做了hdfs ha模式)。
3>.查看Hadoop版本
4>.除了上面的方式查看Hadoop版本,我們還可以用以下的方式查看
5>.隨機選中一個節點
6>.點擊"組件",可以查看各個軟件的版本
二.HDFS配置文件詳解
1>.以下參數講解以社區版2.6.0的參數名和默認值為准(配置文件為:hdfs-default.xml / hdfs-site.xml )。
鏈接地址:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
2>.dfs.namenode.name.dir
指定一個本地文件系統路徑,決定NN在何處存放fsimage。可以通過逗號分隔指定多個路徑,在Hadoop1.0時代這是一種為NN做高可用的方法,但目前有更完善的Journal Node解決方案,留默認值即可。
3>.dfs.permissions.enabled
默認為true。如果為true,則啟用HDFS的權限檢查,否則不啟用。在生產 環境,一定要啟用,測試環境可以自行決定。
4>.dfs.permissions.superusergroup
默認supergroup,指定HDFS的超級用戶組的組名,可按需設置。
5>.dfs.datanode.data.dir
默認file://${hadoop.tmp.dir}/dfs/data,指定DN存放塊數據的本地盤路徑,可以通過逗號分隔指定多個路徑。在生產環境可能會在一個DN上掛多塊盤,因此需要修改該值。
6>.dfs.replication
塊副本數,默認為3。默認值是一個比較穩妥的值。
7>.dfs.blocksize
塊大小,默認為134217728,即128MB。對大多數生產環境來說是一個比較穩妥的值。因為該值決定了MR的默認map數,也會影響NN消耗的內存量, 需要謹慎修改。
8>.dfs.namenode.handler.count
NN處理rpc請求的線程數,默認為10,對大多數集群來說該值過小,設置該值的一般原則是將其設置為集群大小的自然對數乘以20,即20logN,N為集群大小。例如對100個節點的集群該值可以設到90。
當然,我們可以通過python幫我們計算合適的值。 [root@node101.yinzhengjie.org.cn ~]# python -c 'import math ; print int(math.log(100) * 20)' 92 [root@node101.yinzhengjie.org.cn ~]#
9>.dfs.datanode.balance.bandwidthPerSec
HDFS做均衡時使用的最大帶寬,默認為1048576,即1MB/s,對大多數千兆 甚至萬兆帶寬的集群來說過小。不過該值可以在啟動balancer腳本時再設 置,可以不修改集群層面默認值。
10>.dfs.hosts / dfs.hosts.exclude
指定連接NN的主機的白/黑名單。通常黑名單比較有用,例如在對DN進行 更換硬盤操作時,可以先將其加入黑名單進行摘除,等運維操作結束后再放行。
參考鏈接:https://www.cnblogs.com/yinzhengjie/p/10693499.html。
11>.dfs.datanode.failed.volumes.tolerated
DN多少塊盤損壞后停止服務,默認為0,即一旦任何磁盤故障DN即關閉。 對盤較多的集群(例如每DN12塊盤),磁盤故障是常態,通常可以將該值設置為1或2,避免頻繁有DN下線。
12>.dfs.ha.automatic-failover.enabled
是否啟用HDFS的自動故障轉移,默認為false。像CDH等發行版,如果打開 HDFS HA后,該值會被自動更新為true,因此通常不需要自己改動。
13>.dfs.support.append
是否啟用HDFS的追加寫入支持,默認為true。老版本Hadoop上append功能有bug,因此該值曾經默認為false,但現在已經可以放心使用true,有老集群升級上來的需要調整。
14>.dfs.encrypt.data.transfer
HDFS數據在網絡上傳輸時是否加密,默認為false。如果Hadoop集群運行 在非安全網絡上,可以考慮開啟該參數,但會帶來一些CPU開銷。通常 Hadoop都會在私有網絡內部署,不需要動該值。
15>.dfs.client.read.shortcircuit
是否開啟HDFS的短路本地讀,默認為false。像CDH等發行版會默認將該參 數打開,並且如果在任何一種Hadoop上安裝Impala,也需要打開該參數。 打開后,還需要設置dfs.domain.socket.path參數以指定一個Unix Socket文件的路徑。
16>.dfs.datanode.handler.count
數據節點的服務器線程數,默認為10。可適當增加這個數值來提升DataNode RPC服務的並發度。 在DataNode上設定,取決於系統的繁忙程度,設置太小會導致性能下降甚至報錯。線程數的提高將增加DataNode的內存需求,因此,不宜過度調整這個數值。
17>.dfs.datanode.max.transfer.threads (dfs.datanode.max.xcievers)
DataNode可以同時處理的數據傳輸連接數,即指定在DataNode內外傳輸數據使用的最大線程數。 官方將該參數的命名改為dfs.datanode.max.transfer.threads。默認值為4096。推薦值為8192。
18>.dfs.namenode.avoid.read.stale.datanode
指示是否避免讀取“過時”的數據節點(DataNode),這些數據節點(DataNode)的心跳消息在指定的時間間隔內未被名稱節點(NameNode)接收。過時的數據節點(DataNode)將移動到返回供讀取的節點列表的末尾。有關寫入的類似設置,請參閱df.namenode.avoint.write.stale.datanode。默認值是flase,推薦設置為true。
19>.dfs.namenode.avoid.write.stale.datanode
指示超過失效 DataNode 時間間隔 NameNode 未收到檢測信號信息時是否避免寫入失效 DataNode。寫入應避免使用失效 DataNode,除非多個已配置比率 (dfs.namenode.write.stale.datanode.ratio) 的 DataNode 標記為失效。有關讀取的類似設置,請參閱 dfs.namenode.avoid.read.stale.datanode。 默認值是flase,推薦設置為true。
20>.dfs.datanode.du.reserved
當DataNode向NameNode匯報可用的硬盤大小的時候,它會把所有dfs.data.dir所列出的可用的硬盤大小總和發給NameNode。由於mapred.local.dir經常會跟DataNode共享可用的硬盤資源,因此我們需要為Mapreduce任務保留一些硬盤資源。dfs.datanode.du.reserved定義了每個dfs.data.dir所定義的硬盤空間需要保留的大小,以byte為單位。默認情況下,該值為0,也就是說HDFS可以使用每個數據硬盤的所有空間,節點硬盤資源耗盡時就會進入讀模式。因此,建議每個硬盤都為map任務保留最少10GB的空間,如果每個Mapreduce作業都會產生大量的中間結果,或者每個硬盤空間都比較大(超過2TB),那么建議相應的增大保留的硬盤空間。我在生產環境中設置改值的大小為50G字節!
21>.其他配置
有一些操作系統或Linux文件系統層面的配置,本身不屬於HDFS,但會對 HDFS的性能或可用性有影響,我們也需要了解:https://www.cnblogs.com/yinzhengjie/p/10367447.html
三.HDFS日常維護
1>.容量管理
理解HDFS的數據都是以普通文件格式寫到DN的本地磁盤。HDFS的已使用容量有多種查看方式,比如NameNode頁面(默認端口50070的)、hdfs dfs命令、以及集群管理器頁面(如Cloudera CM)。
HDFS總使用容量在80%以下是安全的,超過就需要人工干預。另外也要理解,HDFS不可能做到每個DN的每塊盤都以相同的百分比寫入數據,很可能出現總容量使用80%,但個別盤已經超90%甚至寫滿的情況,這時候就需要借助balancer腳本(start-balancer.sh)或 hdfs balancer命令來進行均衡。為了管理數據,還需要熟悉常用的hdfs 和Linux命令。 容量管理還涉及到非技術性工作。如企業的數據總量和增量如何? 如何設置清理策略?是否需要對冷熱數據采取不同的管理策略(如存儲介質、副本數)?如何制定擴容、災備方案?等等。這些工作無法通過培訓傳授方案,需要結合企業實際進行規划。
2>.進程管理
HDFS進程管理中,DN的進程比較次要,死掉只需處理完問題再拉起即可。 NN進程的可用性決定了整個HDFS的可用性。目前已有完善的NameNode HA方案,如果是 社區版集群,可參考(QJM方案): http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html。如果是CDH集群,可進入HDFS服務,點擊Actions - Enable High Availability,按照指引逐步操作即可,比較直觀。 另外,為了保證NN進程的穩定,還需要考慮分配的JVM內存。我們介紹過一般100w個塊對應300MB堆內存,按此計算出一個值后,再乘以2就夠用了。
3>.故障管理
HDFS最常見的是硬盤故障,停機更換即可,注意同時停機個數<副本數即可,服務起來后做一下fsck。
NN的故障比較棘手。有了Hadoop2.x后的NameNode HA機制后,單點故障不再可怕,但仍會被內存相關問題困擾。最常出現的情況就是出現長時間的full GC,使得NN無法響應其他進程的RPC請求,從而造成嚴重問題。 推薦使用Java8以上版本的JDK以及G1GC,並分配足夠的堆內存,使得每次GC的時間可控。
4>.配置管理
HDFS主要配置的說明已介紹過,其余配置可查詢官方文檔(以2.6.0為 例): http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml.
需要注意的是大部分配置需要重啟HDFS服務生效,小部分需要重啟單個DN生效。
5>. 對HDFS日常維護中常用的命令總結
HDFS一般命令,在日常維護中高頻使用的:
列出文件 文件(及目錄)的復制、追加、刪除、讀取
文件(及目錄)權限和歸屬的修改
文件(及目錄)大小統計
HDFS管理命令,在日常維護中高頻使用的:
hdfs fsck
hdfs balancer
namenode系列命令(例如啟用HA等)
dfsadmin系列命令(進入退出安全模式、升級HDFS等)
四.課后作業
在你的測試集群(最好有多台虛擬機搭一個全分布集群),測試HDFS接近寫滿文件時的狀態變化
實驗配置NameNode HA