HDFS用戶指南
原文地址:http://hadoop.apache.org/core/docs/current/hdfs_user_guide.html
譯者:dennis zhuang(killme2008@gmail.com),有錯(cuò)誤請(qǐng)指正,多謝。
目的
本文檔可以作為使用Hadoop分布式文件系統(tǒng)用戶的起點(diǎn),無論是將HDFS應(yīng)用在一個(gè)Hadoop集群中還是作為一個(gè)單獨(dú)的分布式文件系統(tǒng)使用。HDFS被設(shè)計(jì)成可以馬上在許多環(huán)境中工作起來,那么一些HDFS的運(yùn)行知識(shí)肯定能大大地幫助你對(duì)一個(gè)集群做配置改進(jìn)和診斷。
概覽
HDFS是Hadoop應(yīng)用的主要分布式存儲(chǔ)。一個(gè)HDFS集群由一個(gè)管理文件系統(tǒng)元數(shù)據(jù)的NameNode,和存儲(chǔ)實(shí)際
數(shù)據(jù)的一些Datanode組成。HDFS的架構(gòu)在這里有詳細(xì)描述。這個(gè)用戶指南主要提供給需要跟HDFS集群打交道的用戶或者管理員。HDFS架構(gòu)文章
中的圖描繪了Namenode、Datanode和客戶端們之間的基本交互。本質(zhì)上,客戶端與Namenode通訊獲取或者修改文件的元數(shù)據(jù),與
Datanode進(jìn)行實(shí)際的IO操作。
下面的列表應(yīng)該是大多數(shù)用戶關(guān)心的HDFS突出特點(diǎn)。斜體字的術(shù)語將在后面詳細(xì)描述。
1)Hadoop,包括HDFS,非常適合廉價(jià)機(jī)器上的分布式存儲(chǔ)和分布式處理。它是容錯(cuò)的、可伸縮的,并且非常易于擴(kuò)展。并且,以簡單性和適用性著稱的Map-Reduce是Hadoop不可或缺的組成部分。
2)HDFS的默認(rèn)配置適合于大多數(shù)安裝的應(yīng)用。通常情況下,只有在一個(gè)非常大規(guī)模的集群上才需要修改默認(rèn)配置。
3)HDFS是用java編寫的,支持大多數(shù)平臺(tái)。
4)支持shell命令行風(fēng)格的HDFS目錄交互。
5)Namenode和Datanode都內(nèi)建了web服務(wù)器,可以方便地查看集群的狀態(tài)
6)HDFS經(jīng)常性地實(shí)現(xiàn)新的特性和改進(jìn),下面是HDFS中的一些有用特性的子集:
文件許可和授權(quán)
Rack awareness:當(dāng)調(diào)度任務(wù)和分配存儲(chǔ)的時(shí)候?qū)⒐?jié)點(diǎn)的物理位置考慮進(jìn)去。
Safemode(安全模式):用于維護(hù)的一個(gè)管理狀態(tài)
fsck: 診斷文件系統(tǒng)的一個(gè)工具,用來查找丟失的文件或者block
Rebalancer:當(dāng)數(shù)據(jù)在Datanode間沒有均勻分布的時(shí)候,用于重新平衡集群的工具
升級(jí)和回滾:當(dāng)Hadoop軟件升級(jí),在升級(jí)遇到不可預(yù)期的問題的時(shí)候,可以回滾到HDFS升級(jí)前的狀態(tài)
二級(jí)Namenode:幫助Namenode維持包含了HDFS修改的日志的文件(edits日志文件,下文談到)大小在限制范圍內(nèi)。
前提條件
下面的文檔描述了一個(gè)Hadoop集群的安裝和設(shè)置:
本文檔的剩余部分假設(shè)你已經(jīng)搭設(shè)并運(yùn)行了一個(gè)至少擁有一個(gè)Datanode的HDFS。基于本文檔的目的,Namenode和Datanode可以運(yùn)行在同一臺(tái)機(jī)器上。
Web接口
Namenode和Datanode分別跑了一個(gè)內(nèi)置的web服務(wù)器,來展現(xiàn)集群當(dāng)前狀態(tài)的一些基本信息。在默認(rèn)配置
下,Namenode的首頁地址是http://namenode:50070(namenode就是Namenode節(jié)點(diǎn)所在機(jī)器IP或者名稱)。這個(gè)
頁面列出了集群中的所有datanode以及集群的基本統(tǒng)計(jì)。web接口同樣可以用于瀏覽文件系統(tǒng)(點(diǎn)擊Namenode首頁上的“Browse
the file system"鏈接)。
Shell命令
Hadoop包括了多種shell風(fēng)格的命令,用于跟HDFS或者Hadoop支持的其他文件系統(tǒng)交互。命令
bin/hadoop fs -help 可以列出Hadoop shell支持的命令。更進(jìn)一步,bin/hadoop fs -help
command
可以展現(xiàn)特定命令command的幫助細(xì)節(jié)。這些命令支持一般文件系統(tǒng)的操作,例如拷貝文件、修改文件權(quán)限等。同時(shí)也支持了部分HDFS特有的命令,例如
修改文件的replication因子。
DFSAdmin命令
'bin/hadoop dfsadmin'
命令支持一些HDFS管理功能的操作。'bin/hadoop dfsadmin -help'可以列出所有當(dāng)前支持的命令。例如:
-
-report
: 報(bào)告HDFS的基本統(tǒng)計(jì)信息。部分信息同時(shí)展現(xiàn)在Namenode的web首頁上。
-
-safemode
: 盡管通常并不需要,管理員還是可以通過手工操作進(jìn)入或者離開safemode狀態(tài)
-
-finalizeUpgrade
: 移除上一次升級(jí)時(shí)集群所做的備份。
二級(jí)Namenode
Namenode將對(duì)文件系統(tǒng)的修改存儲(chǔ)在一個(gè)原生文件系統(tǒng)文件中(名為edits的文件)。當(dāng)Namenode啟動(dòng)的時(shí)
候,它從映像文件(fsimage)讀取HDFS的狀態(tài),然后將edits日志文件中的修改作用在此內(nèi)存狀態(tài)上,接著將得到的新的HDFS狀態(tài)寫回
fsimage,后續(xù)的正常操作開始于一個(gè)空的edits日志文件。由于Namenode僅僅在啟動(dòng)的時(shí)候?qū)simage和edits合并,因此在一個(gè)
大的集群上經(jīng)過一定時(shí)間操作后,edits文件將會(huì)非常大。由此帶來的一個(gè)副作用就是下次Namenode的重新啟動(dòng)將花費(fèi)很長時(shí)間。二級(jí)
Namenode就是為了解決這個(gè)問題,它會(huì)周期性地合并fsimage和edits日志文件,并且將edits日志文件的大小保持在限制范圍內(nèi)。通常它
會(huì)跑在另一個(gè)機(jī)器上,因?yàn)樗膬?nèi)存要求跟主namenode一樣。二級(jí)Namenode可以通過'bin/start-dfs.sh'啟動(dòng)在conf
/masters配置文件里配置的節(jié)點(diǎn)上。
Rebalancer
HDFS的數(shù)據(jù)可能不會(huì)總是在Datanode之間分布得很一致。一個(gè)常見的原因是往現(xiàn)有的集群中加入了新的Datanode。當(dāng)分配block的時(shí)候,Namenode依據(jù)幾個(gè)參數(shù)來決定哪個(gè)datanode來接受這些block。一些需要考慮的因素如下:
1)一個(gè)block的副本存放在正在寫該block的節(jié)點(diǎn)上
2)需要將一個(gè)block的副本擴(kuò)展到其他機(jī)架上,防止因?yàn)檎麄€(gè)機(jī)架故障導(dǎo)致的數(shù)據(jù)丟失。
3)副本之一通常放在同一個(gè)機(jī)架的另一個(gè)節(jié)點(diǎn)上,減少跨機(jī)架的網(wǎng)絡(luò)IO
4)將HDFS數(shù)據(jù)均勻一致地分布在集群中的datanode上。
基于這些相互競爭的因素,數(shù)據(jù)可能不會(huì)在Datanode之間擴(kuò)展得一致。HDFS給管理員提供了一個(gè)工具,用來分析block的分配情況和在datanode之間重新平衡數(shù)據(jù)。這個(gè)功能暫未實(shí)現(xiàn),它的描述可以在這個(gè) PDF文檔中看到,記錄編號(hào)HADOOP-1652.
Rack Awareness
典型的大規(guī)模Hadoop集群是部署在數(shù)個(gè)機(jī)架上的,那么顯然同一個(gè)機(jī)架內(nèi)的節(jié)點(diǎn)間的網(wǎng)絡(luò)通訊比之不同機(jī)架間節(jié)點(diǎn)間的網(wǎng)
絡(luò)通訊更可取。另外,Namenode會(huì)嘗試將block的副本分布在數(shù)個(gè)機(jī)架中以提高容錯(cuò)性。Hadoop讓集群管理員來決定某個(gè)節(jié)點(diǎn)從屬于哪個(gè)機(jī)架,
通過配置變量dfs.network.script來實(shí)現(xiàn)。當(dāng)這個(gè)腳本有配置的時(shí)候,每個(gè)節(jié)點(diǎn)都運(yùn)行該腳本來決定它的rackid。默認(rèn)安裝假設(shè)所有的節(jié)
點(diǎn)從屬于同一個(gè)機(jī)架。這個(gè)特性和配置進(jìn)一步的闡述在這個(gè)PDF文檔,編號(hào)為
HADOOP-692。
Safemod(安全模式)
當(dāng)Namenode啟動(dòng)的時(shí)候,它從fsimage和edits日志兩個(gè)文件中加載文件系統(tǒng)的狀態(tài)。然后等待
datanode報(bào)告他們的block信息,以便防止Namenode在確認(rèn)block副本是否足夠前過早地開始復(fù)制block。這段時(shí)間的
Namenode就是處于所謂safemode狀態(tài)。處于safemode的Namenode也是HDFS集群的只讀模型,此時(shí)不允許任何對(duì)文件系統(tǒng)或者
block的修改。正常情況下,Namenode會(huì)在開始后自動(dòng)退出safemode。如果有需要,HDFS可以通過'bin/hadoop
dfsadmin
-safemode'命令顯式地進(jìn)入safemode狀態(tài)。Namenode的web首頁顯示當(dāng)前的safemode是否打開。更詳細(xì)的描述和配置可以參
考setSafeMode()方法的JavaDoc。
譯
注:詳細(xì)介紹下safemode的配置參數(shù),在safemode狀態(tài),Namenode會(huì)等待所有的datanode報(bào)告他們自己的block信息,看看
所有的block的副本是否達(dá)到最低要求的數(shù)目,這個(gè)數(shù)目可以通過dfs.replication.min參數(shù)配置,默認(rèn)是1,也就是至少要求有一個(gè)副
本。當(dāng)報(bào)告合格的Datanode的數(shù)目達(dá)到一定百分比,Namenode才會(huì)離開safemode狀態(tài)。這個(gè)百分比也是可配置的,通過
dfs.safemode.threshold.pct參數(shù),默認(rèn)是0.999f(也就是要求99.9%的Datanode
合格)。Namenode在合格的datanode數(shù)目達(dá)到要求的時(shí)候,并不是馬上離開safemode狀態(tài),會(huì)有一個(gè)擴(kuò)展時(shí)間,讓剩余的
datanode來報(bào)告block信息,這個(gè)擴(kuò)展時(shí)間默認(rèn)是30秒,可以通過dfs.safemode.extension參數(shù)配置,單位是毫秒。
Fsck
HDFS提供了fsck命令用來檢測各種各樣的不一致性。fsck被設(shè)計(jì)用來報(bào)告各種文件的問題,例如某個(gè)文件丟失的
block,block的副本數(shù)目是否低于設(shè)置等。不同于傳統(tǒng)的一般原生文件系統(tǒng)的fsck命令,hdfs的fsck命令并不修正所檢測到的錯(cuò)誤。通常情
況下,Namenode會(huì)自動(dòng)修正大多數(shù)可以被修復(fù)的錯(cuò)誤,HDFS的fsck不是Hadoop shel的命令,可以通過'bin/hadoop
fsck'執(zhí)行,可以運(yùn)行在整個(gè)文件系統(tǒng)上或者一個(gè)文件子集上。
升級(jí)和回滾
當(dāng)升級(jí)某個(gè)集群的Hadoop的時(shí)候,正如任何軟件的升級(jí)一樣,可能會(huì)引入新的bug或者不兼容的修改導(dǎo)致現(xiàn)有的應(yīng)用出
現(xiàn)過去沒有發(fā)現(xiàn)的問題。在所有重要的HDFS安裝應(yīng)用中,是不允許出現(xiàn)因丟失任何數(shù)據(jù)需要從零開始重啟HDFS的情況。HDFS允許管理員恢復(fù)到
Hadoop的早期版本,并且將集群的狀態(tài)回滾到升級(jí)前。HDFS的升級(jí)細(xì)節(jié)請(qǐng)參考 upgrade wiki。HDFS在任何時(shí)間只能有一個(gè)備份,因此在升級(jí)前,管理員需要通過'bin/hadoop dfsadmin -finalizeUpgrade'命令移除現(xiàn)有的備份。下面簡要描述了典型的升級(jí)過程:
1)在升級(jí)Hadoop前,如果已經(jīng)存在備份,需要先結(jié)束(finalize)它。可以通過'dfsadmin -upgradeProgress status'命令查詢集群是否需要執(zhí)行finalize
2)停止集群,分發(fā)部署新版本的Hadoop
3)執(zhí)行新版本的hadoop,通過添加 -upgrade 選項(xiàng),例如/bin/start-dfs.sh -upgrade
4)大多數(shù)情況下,集群在升級(jí)后可以正常運(yùn)行。一旦新的HDFS在運(yùn)行若干天的操作后沒有出現(xiàn)問題,那么就可以結(jié)束(finalize)這次升級(jí)。請(qǐng)注意,在升級(jí)前刪除的文件并不釋放在datanode上的實(shí)際磁盤空間,直到集群被結(jié)束(finalize)升級(jí)前。
5)如果有需要回到老版本的Hadoop,那么可以:
a)停止集群,分發(fā)部署老版本的Hadoop
b)通過rollback選項(xiàng)啟動(dòng)集群,例如bin/start-dfs.sh -rollback
文件許可和安全
文件許可的設(shè)計(jì)與其他平臺(tái)(如linux)
的文件系統(tǒng)類似。在當(dāng)前實(shí)現(xiàn),安全被限制在簡單的文件許可上。啟動(dòng)Namenode的用戶被作為HDFS的超級(jí)用戶。HDFS的未來版本將支持網(wǎng)絡(luò)驗(yàn)證,
例如Kerberos方案(譯注:MIT開發(fā)的一個(gè)驗(yàn)證系統(tǒng))的用戶驗(yàn)證以及數(shù)據(jù)傳輸?shù)募用堋8敿?xì)的討論參考Permissions User and Administrator Guide。
伸縮性
Hadoop正運(yùn)行在成千上萬個(gè)節(jié)點(diǎn)的集群上。 PoweredBy Hadoop列
出了一些部署Hadoop在大規(guī)模集群上的組織和機(jī)構(gòu)。HDFS在每個(gè)集群上只有一個(gè)Namenode節(jié)點(diǎn),Namenode節(jié)點(diǎn)上可用內(nèi)存是當(dāng)前伸縮性
的主要限制。在非常大規(guī)模的集群上,增加HDFS中存儲(chǔ)的文件的平均大小,將可以幫助提高集群的大小而不用增加Namenode的內(nèi)存需求。默認(rèn)的配置可
能不適合非常大規(guī)模的集群應(yīng)用。Hadoop FAQ頁列出了對(duì)于大規(guī)模Hadoop集群的配置改進(jìn)建議。
關(guān)聯(lián)文檔
本用戶指南可作為使用HDFS很好的一個(gè)起點(diǎn),在本文檔持續(xù)改進(jìn)的同時(shí),有一些非常有價(jià)值的關(guān)于Hadoop和HDFS的文檔資料可供參考。下列資料可作為進(jìn)一步探索的起點(diǎn):