Introduction
Hadoop Distributed File System (HDFS) 是設(shè)計(jì)可以運(yùn)行于普通商業(yè)硬件上的分布式文件系統(tǒng)葡粒。它跟現(xiàn)有的分布式文件系統(tǒng)有很多相通的地方等太,但是區(qū)別也是顯著的夫否。HDFS具有高度容錯(cuò)性能描睦,被設(shè)計(jì)運(yùn)行于低成本硬件上。HDFS可以向應(yīng)用提供高吞吐帶寬推盛,適合于大數(shù)據(jù)應(yīng)用抖格。HDFS 放寬了一些 POSIX 的要求生逸,以開啟對(duì)文件系統(tǒng)數(shù)據(jù)的流式訪問。HDFS 最初是作為Apache Nutch web 搜索引擎項(xiàng)目的基礎(chǔ)設(shè)施開發(fā)的趁矾。HDFS 現(xiàn)在是Apache Hadoop核心項(xiàng)目的一部分耙册。
Assumptions and Goals
-
硬件故障
Hardware Failure
硬件故障是常態(tài),而不是異常狀態(tài)毫捣。一個(gè)HDFS實(shí)例可能包含成百上千的服務(wù)器详拙,每臺(tái)都保存著部分文件系統(tǒng)數(shù)據(jù)帝际。實(shí)際上,存在大量的故障率不低的組件饶辙,意味著HDFS總有部分組件是不起作用的蹲诀。 因此,HDFS的核心架構(gòu)目標(biāo)之一弃揽,就是能檢測故障脯爪,并快速、自動(dòng)的恢復(fù)蹋宦。 -
流式數(shù)據(jù)訪問
Streaming Data Access
運(yùn)行在HDFS的應(yīng)用需要對(duì)其數(shù)據(jù)進(jìn)行流式訪問披粟。它們不是運(yùn)行在普通文件系統(tǒng)上的通用程序。HDFS偏向于批處理冷冗,而不是用戶交互進(jìn)程守屉。重點(diǎn)是數(shù)據(jù)的吞吐量,而不是訪問的延遲蒿辙。POSIX 針對(duì)HDFS拇泛、而非應(yīng)用,規(guī)定了很多硬性需求思灌。一些關(guān)鍵領(lǐng)域的 POSIX 語義已經(jīng)被引用來提升數(shù)據(jù)吞吐效率俺叭。 -
大數(shù)據(jù)集
Large Data Sets
運(yùn)行在HDFS上的應(yīng)用都有大數(shù)據(jù)集合。在HDFS上泰偿,一個(gè)典型的文件都以GB甚至TB計(jì)熄守。因此,HDFS針對(duì)大文件進(jìn)行了調(diào)優(yōu)耗跛。它應(yīng)該以提供高聚合數(shù)據(jù)帶寬裕照,并可以在一個(gè)集群內(nèi)擴(kuò)展到數(shù)百個(gè)節(jié)點(diǎn)。它應(yīng)該提供單實(shí)例千萬數(shù)量級(jí)別文件的支持调塌。 -
簡單一致性模型
Simple Coherency Model
HDFS應(yīng)用需要一個(gè)單次寫入多次讀取的文件模型晋南。文件一旦創(chuàng)建、寫入羔砾、關(guān)閉负间,除附加和截?cái)嗤猓恍枰慕唷T谖募┪哺郊觾?nèi)容是可以的政溃,但是不支持在任意點(diǎn)更新。這個(gè)假設(shè)簡化了數(shù)據(jù)一致性問題檀葛,實(shí)現(xiàn)了高吞吐量玩祟。 MapReduce應(yīng)用和爬蟲程序契合這種模型。 -
移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)便宜
“Moving Computation is Cheaper than Moving Data”
應(yīng)用在靠近數(shù)據(jù)操作的地方屿聋,進(jìn)行計(jì)算會(huì)更高效空扎。 在數(shù)據(jù)集巨大的時(shí)候藏鹊,尤其明顯。這將最小化網(wǎng)絡(luò)擁塞转锈,提升系統(tǒng)總吞吐量盘寡。該假設(shè)是,將計(jì)算移動(dòng)到數(shù)據(jù)所在位置撮慨,比將數(shù)據(jù)移動(dòng)到計(jì)算所在位置好竿痰。HDFS為應(yīng)用程序提供了接口,可以將它們移動(dòng)到更靠近數(shù)據(jù)的位置砌溺。 -
跨異構(gòu)軟影涉、硬件平臺(tái)的可移植性
Portability Across Heterogeneous Hardware and Software Platforms
HDFS被設(shè)計(jì)成易于從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái)。因此规伐,大量應(yīng)用普遍采用了HDFS作為平臺(tái)蟹倾。
NameNode and DataNodes
HDFS是主從架構(gòu)。一個(gè)HDFS集群包含一個(gè)NameNode猖闪,一個(gè)管理文件系統(tǒng)命名空間和控制客戶端訪問文件的master server鲜棠。以及,若干的 DataNodes培慌,通常集群的每個(gè)node一個(gè)豁陆,管理運(yùn)行DataNode的節(jié)點(diǎn)上的存儲(chǔ)。HDFS 發(fā)布一個(gè)文件系統(tǒng)命名空間吵护,并允許用戶數(shù)據(jù)已文件的形式存儲(chǔ)在上面盒音。內(nèi)部,一個(gè)文件被分成一個(gè)或多個(gè)塊馅而,存儲(chǔ)在一組DataNodes上里逆。NameNode 執(zhí)行文件系統(tǒng)命名空間操作,比如:打開用爪、關(guān)閉、重命名文件或目錄胁镐。它還確定塊到DataNodes的映射偎血。DataNodes 負(fù)責(zé)向文件系統(tǒng)客戶端提供讀寫服務(wù)。DataNodes 根據(jù) NameNode 的指令執(zhí)行塊的創(chuàng)建盯漂、刪除以及復(fù)制颇玷。
NameNode 和 DataNode 是設(shè)計(jì)運(yùn)行于普通商業(yè)機(jī)器的軟件。這些機(jī)器通常運(yùn)行 GNU/Linux 操作系統(tǒng)就缆。HDFS 是Java 語言編寫的帖渠;任何支持Java的機(jī)器都可以運(yùn)行NameNode or DataNode 軟件。使用高移植性Java語言竭宰,意味著HDFS可以部署在很大范圍的機(jī)器上空郊。一個(gè)典型的部署就是一臺(tái)特定的機(jī)器只運(yùn)行NameNode 軟件份招,而集群內(nèi)的其他機(jī)器運(yùn)行DataNode 軟件的一個(gè)實(shí)例。這種架構(gòu)不排除一臺(tái)機(jī)器上運(yùn)行多個(gè)DataNodes 狞甚,但是在實(shí)際部署中很少見锁摔。
單 NameNode 節(jié)點(diǎn)的存在大大簡化了架構(gòu)。NameNode 是所有HDFS 元數(shù)據(jù)的仲裁和倉庫哼审。系統(tǒng)設(shè)計(jì)上谐腰,用戶數(shù)據(jù)永遠(yuǎn)不經(jīng)過NameNode。
The File System Namespace
HDFS 支持傳統(tǒng)的文件分級(jí)組織涩盾。用戶或應(yīng)用可以創(chuàng)建目錄十气,并在目錄內(nèi)存儲(chǔ)文件。 文件系統(tǒng)命名空間的層次結(jié)構(gòu)跟其他文件系統(tǒng)類似春霍;可以創(chuàng)建砸西、刪除、移動(dòng)终畅、重命名文件籍胯。HDFS 支持 user quotas 和 access permissions。 HDFS 不支持軟离福、硬鏈接杖狼。但是,HDFS 架構(gòu)不排除實(shí)現(xiàn)這些功能妖爷。
雖然HDFS遵守文件系統(tǒng)命名約定蝶涩,一些路徑和名稱 (比如/.reserved 和.snapshot ) 保留了。比如功能 transparent encryption 和 snapshot 就使用的保留路徑絮识。
NameNode 維護(hù)文件系統(tǒng)命名空間绿聘。任何文件系統(tǒng)命名空間或?qū)傩缘淖兓紩?huì)被NameNode記錄次舌。 應(yīng)用可以指定HDFS應(yīng)維護(hù)的文件副本數(shù)量熄攘。文件副本的數(shù)量被稱為該文件的復(fù)制因子 replication factor
。該信息存儲(chǔ)于NameNode彼念。
Data Replication
HDFS 被設(shè)計(jì)用于在一個(gè)大規(guī)模集群上跨機(jī)器可靠地存儲(chǔ)巨大的文件挪圾。它以一序列的塊的方式存儲(chǔ)文件。每個(gè)文件都可以配置塊尺寸和復(fù)制因子逐沙。
一個(gè)文件除了最后一個(gè)塊外哲思,其他的塊一樣大。在append
和hsync
添加了可變長度塊的支持后吩案,用戶可以啟動(dòng)一個(gè)新的塊棚赔,而不用填充最后一個(gè)塊到配置的塊大小。
應(yīng)用可以指定一個(gè)文件的副本數(shù)量。復(fù)制因子可以在創(chuàng)建的時(shí)候指定靠益,也可以以后更改丧肴。HDFS的文件只寫一次(除了 appends 和 truncates) ,并在任何時(shí)候只允許一個(gè) writer 捆毫。
NameNode 指定塊復(fù)制的所有決策闪湾。它周期性的從集群的每個(gè)DataNodes 接受 Heartbeat 和 Blockreport。Heartbeat 的接受代表 DataNode 工作正常绩卤。Blockreport 包含了DataNode上所有塊的清單途样。
- Replica Placement: The First Baby Steps
副本的位置對(duì)HDFS的可靠性和性能至關(guān)重要。副本位置的優(yōu)化是HDFS和其他大多數(shù)分布式文件系統(tǒng)的區(qū)別濒憋。這是一個(gè)需要大量調(diào)優(yōu)和經(jīng)驗(yàn)的特性何暇。Rack-aware 復(fù)制策略的目的就是提高數(shù)據(jù)可靠性,可用性和網(wǎng)絡(luò)帶寬利用率凛驮。當(dāng)前副本位置策略的實(shí)現(xiàn)是這個(gè)方向的第一步裆站。實(shí)施該策略的短期目標(biāo)是在生產(chǎn)環(huán)境驗(yàn)證它,了解其更多的行為黔夭,為測試和研究更復(fù)雜的策略打下基礎(chǔ)宏胯。
大型HDFS實(shí)例運(yùn)行在跨多個(gè)Rack的集群服務(wù)器上。不同rack的兩個(gè)node通信需要通過交換機(jī)本姥。大多數(shù)情況下肩袍,同一rack內(nèi)的帶寬大于rack之間的帶寬。
NameNode 通過在 Hadoop Rack Awareness 內(nèi)的進(jìn)程描述 判斷DataNode 屬于哪個(gè)rack id婚惫。一個(gè)簡單但是并非最佳的策略是將副本分布于不同的racks氛赐。這可以防止整個(gè)機(jī)架發(fā)生故障時(shí)丟失數(shù)據(jù),并允許在讀取數(shù)據(jù)時(shí)使用多個(gè)機(jī)架的帶寬先舷。該策略在群集中均勻地分布副本艰管,使得組件故障時(shí)很容易平衡負(fù)載。 但是蒋川,該策略會(huì)增加寫入成本牲芋,因?yàn)閷懭氩僮餍枰獙K傳輸?shù)蕉鄠€(gè)機(jī)架。
一般捺球,復(fù)制因子設(shè)置為3街图, HDFS 的分布策略是:如果writer在datanode上則將一個(gè)副本放到本地機(jī)器, 如果writer不在datanode上則將一個(gè)副本放到writer所在機(jī)柜的隨機(jī)datanode 上懒构;另一個(gè)副本位于不同機(jī)架的node上;最后一個(gè)副本位于同一遠(yuǎn)程機(jī)架的不同node上耘擂。 該策略減少了機(jī)架間的寫流量胆剧,提升了寫性能。機(jī)架故障的概率遠(yuǎn)小于節(jié)點(diǎn)故障的概率;此策略不會(huì)影響數(shù)據(jù)可靠性和可用性承諾秩霍。但是篙悯,在讀取數(shù)據(jù)時(shí),它確實(shí)減少了聚合帶寬铃绒,因?yàn)閴K存儲(chǔ)于兩個(gè)機(jī)柜而不是三個(gè)機(jī)柜內(nèi)鸽照。使用此策略,副本不會(huì)均勻的分布于機(jī)架上颠悬。1/3 副本 位于同一節(jié)點(diǎn)矮燎, 2/3 副本位于同一機(jī)架, 另1/3副本位于其他機(jī)架赔癌。該策略提升了寫性能而不影響數(shù)據(jù)可靠性和讀性能诞外。
如果復(fù)制因子大于3,那么第4個(gè)及以后的副本則隨機(jī)放置灾票,只要滿足每個(gè)機(jī)架的副本在(replicas - 1) / racks + 2)之下峡谊。
因?yàn)?NameNode 不允許 DataNodes 擁有同一個(gè)塊的多個(gè)副本,所以副本的最大數(shù)就是DataNodes的數(shù)量刊苍。
在把對(duì) 存儲(chǔ)類型和存儲(chǔ)策略 的支持添加到 HDFS 后既们,除了上面介紹的rack awareness外, NameNode 會(huì)考慮其他副本排布的策略正什。NameNode 先基于rack awareness 選擇節(jié)點(diǎn)啥纸,然后檢查候選節(jié)點(diǎn)有文件關(guān)聯(lián)的策略需要的存儲(chǔ)空間。 如果候選節(jié)點(diǎn)沒有該存儲(chǔ)類型埠忘, NameNode 會(huì)查找其他節(jié)點(diǎn)脾拆。如果在第一條路徑中找不到足夠的節(jié)點(diǎn)來放置副本,NameNode會(huì)在第二條路徑中查找具有回滾存儲(chǔ)類型的節(jié)點(diǎn)莹妒。 名船、
當(dāng)前,這里描述的默認(rèn)副本排布策略正在使用中旨怠。
- Replica Selection
為了最小化全局帶寬消耗和讀取延遲渠驼, HDFS 會(huì)嘗試從最靠近reader的副本響應(yīng)讀取請求。如果在reader節(jié)點(diǎn)的同一機(jī)架上上存在副本鉴腻,則該副本有限響應(yīng)讀請求迷扇。如果HDFS集群跨多個(gè)數(shù)據(jù)中心,則本地?cái)?shù)據(jù)中心優(yōu)先爽哎。
- Safemode
啟動(dòng)時(shí)蜓席,NameNode 會(huì)進(jìn)入一個(gè)稱為 Safemode 的特殊狀態(tài)。當(dāng)NameNode處于Safemode狀態(tài)時(shí)课锌,不會(huì)復(fù)制數(shù)據(jù)塊厨内。NameNode從DataNodes接收Heartbeat和Blockreport消息祈秕。Blockreport包含DataNode托管的數(shù)據(jù)塊列表。每個(gè)塊都指定了最小副本數(shù)雏胃。當(dāng)數(shù)據(jù)塊的最小副本數(shù)已與NameNode簽入時(shí)请毛,該塊被認(rèn)為是安全復(fù)制的。在NameNode簽入安全復(fù)制數(shù)據(jù)塊的已配置百分比(加上額外的30秒)后瞭亮,NameNode退出Safemode狀態(tài)方仿。然后,它判斷列表內(nèi)的數(shù)據(jù)塊清單是否少于副本指定的數(shù)量统翩。NameNode 然后復(fù)制這些塊給其他 DataNodes仙蚜。
The Persistence of File System Metadata
HDFS 命名空間由 NameNode 存儲(chǔ)。NameNode 使用事務(wù)日志 EditLog
來持久化的保存系統(tǒng)元數(shù)據(jù)的每次變更唆缴。比如鳍征,在HDFS創(chuàng)建一個(gè)新文件,NameNode會(huì)在EditLog
插入一條記錄來指示該變更面徽。類似的艳丛,變更文件的復(fù)制因子也會(huì)在EditLog
插入一條新記錄。NameNode 以文件的形式趟紊,將EditLog
保存在本地OS文件系統(tǒng)上氮双。整個(gè)文件系統(tǒng)命名空間,包括塊到文件的映射霎匈、文件系統(tǒng)屬性戴差,都存儲(chǔ)于名字為FsImage
的文件內(nèi)。FsImage
也以文件的形式铛嘱,存儲(chǔ)在NameNode的本地文件系統(tǒng)上暖释。
NameNode 將包含整個(gè)文件系統(tǒng)和塊映射的image保存在內(nèi)存中。當(dāng)NameNode啟動(dòng)時(shí)墨吓,或檢查點(diǎn)被預(yù)先定義的閾值觸發(fā)時(shí)球匕,它會(huì)從磁盤讀取FsImage
和 EditLog
,把EditLog
內(nèi)的事物應(yīng)用到內(nèi)存中的FsImage帖烘,再將新版本刷新回磁盤的新FsImage
亮曹。然后會(huì)截?cái)嗯f的EditLog
,因?yàn)樗氖挛镆呀?jīng)應(yīng)用到了持久化的FsImage
上秘症。 這個(gè)過程稱為檢查點(diǎn)checkpoint
照卦。檢查點(diǎn)的目的是通過對(duì)文件系統(tǒng)元數(shù)據(jù)進(jìn)行快照并保存到FsImage,來確保HDFS擁有文件系統(tǒng)元數(shù)據(jù)的一致性視圖乡摹。盡管讀取FsImage
是高效的役耕,但是對(duì)FsImage
直接增量修改是不高效的。不是對(duì)每次編輯修改FsImage
聪廉,而是將每次編輯保存到Editlog
瞬痘。在檢查點(diǎn)期間氏义,將Editlog
的變更應(yīng)用到FsImage
。一個(gè)檢查點(diǎn)可以在固定周期(dfs.namenode.checkpoint.period)(以秒為單位)觸發(fā)图云,也可以文件系統(tǒng)事物數(shù)量達(dá)到某個(gè)值(dfs.namenode.checkpoint.txns)的時(shí)候觸發(fā)。
DataNode 在本地文件系統(tǒng)上以文件的形式存儲(chǔ) HDFS data 邻邮。DataNode 不知道 HDFS 文件竣况。它將HDFS data 的每個(gè)塊以獨(dú)立的文件存儲(chǔ)于本地文件系統(tǒng)上。DataNode 不在同一目錄創(chuàng)建所有的文件筒严。而是丹泉,使用heuristic來確定每個(gè)目錄的最佳文件數(shù)量,并適當(dāng)?shù)膭?chuàng)建子目錄鸭蛙。在一個(gè)目錄創(chuàng)建所有的本地文件是不好的摹恨,因?yàn)楸镜匚募到y(tǒng)可能不支持單目錄的海量文件數(shù)量。當(dāng)DataNode啟動(dòng)的時(shí)候娶视,它掃描本地文件系統(tǒng)晒哄,生成與本地文件系統(tǒng)一一對(duì)應(yīng)的HDFS數(shù)據(jù)塊列表,然后報(bào)告給NameNode肪获。這個(gè)報(bào)告稱為 Blockreport寝凌。
The Communication Protocols
所有的HDFS通信協(xié)議都在TCP/IP協(xié)議棧上⌒⒑眨客戶端與NameNode指定的端口建立連接较木。與NameNode以ClientProtocol 通信。DataNodes與NameNode以DataNode Protocol進(jìn)行通信青柄。遠(yuǎn)程過程調(diào)用(RPC)封裝了Client Protocol 和 DataNode Protocol伐债。設(shè)計(jì)上,NameNode從不啟動(dòng)任何RPCs致开。相反峰锁,它只應(yīng)答DataNodes or clients發(fā)出的RPC請求。
Robustness
HDFS的主要目標(biāo)是可靠的存儲(chǔ)數(shù)據(jù)喇喉,即使是在故障的情況下祖今。常見故障類型有三種:NameNode failures, DataNode failures 和 network partitions。
- Data Disk Failure, Heartbeats and Re-Replication
每個(gè)DataNode都周期性的向NameNode發(fā)送心跳信息拣技。 一個(gè)network partition可能導(dǎo)致DataNodes子集丟失與NameNode的連接千诬。NameNode會(huì)基于心跳信息的缺失來偵測這種情況。NameNode將沒有心跳信息的DataNodes標(biāo)記為dead
膏斤,并不再轉(zhuǎn)發(fā)任何IO請求給它們徐绑。任何注冊到dead DataNode的數(shù)據(jù)對(duì)HDFS將不再可用。DataNode death會(huì)導(dǎo)致某些塊的復(fù)制因子低于它們指定的值莫辨。NameNode不斷跟蹤需要復(fù)制的塊傲茄,并在必要時(shí)啟動(dòng)復(fù)制毅访。很多因素會(huì)導(dǎo)致重新復(fù)制:DataNode不可用,副本損壞盘榨,DataNode上硬盤故障喻粹,復(fù)制因子增加。
標(biāo)記 DataNodes dead 的超時(shí)時(shí)間保守地設(shè)置了較長時(shí)間 (默認(rèn)超過10分鐘) 以避免DataNodes狀態(tài)抖動(dòng)引起的復(fù)制風(fēng)暴草巡。對(duì)于性能敏感的應(yīng)用守呜,用戶可以設(shè)置較短的周期來標(biāo)記DataNodes為過期,讀寫時(shí)避免過期節(jié)點(diǎn)山憨。
- Cluster Rebalancing
HDFS 架構(gòu)支持?jǐn)?shù)據(jù)再平衡schemes查乒。如果一個(gè)DataNode的空余磁盤空間低于閾值,sheme就會(huì)將數(shù)據(jù)從一個(gè)DataNode 移動(dòng)到另外一個(gè)郁竟。在某些文件需求突然增長的情況下玛迄,sheme可能會(huì)在集群內(nèi)動(dòng)態(tài)的創(chuàng)建額外的副本,并再平衡其他數(shù)據(jù)棚亩。這些類型的數(shù)據(jù)再平衡schemes還沒有實(shí)現(xiàn)蓖议。
- Data Integrity
有可能從DataNode獲取的數(shù)據(jù)塊,到達(dá)的時(shí)候損壞了蔑舞。這種損壞可能是由于存儲(chǔ)設(shè)備故障拒担、網(wǎng)絡(luò)故障、軟件bug攻询。HDFS客戶端軟件會(huì)HDFS的內(nèi)容進(jìn)行校驗(yàn)从撼。當(dāng)客戶端創(chuàng)建HDFS文件的時(shí)候,它計(jì)算文件每個(gè)塊的校驗(yàn)值钧栖,并以獨(dú)立的隱藏文件存儲(chǔ)在同一HDFS命名空間內(nèi)低零。當(dāng)客戶端檢索文件時(shí)候,它會(huì)校驗(yàn)從每個(gè)DataNode獲取的數(shù)據(jù)拯杠,是否與關(guān)聯(lián)校驗(yàn)文件內(nèi)的校驗(yàn)值匹配掏婶。 如果不匹配,客戶端可以從另外擁有副本塊的DataNode檢索潭陪。
- Metadata Disk Failure
FsImage
和 EditLog
是HDFS的核心數(shù)據(jù)結(jié)構(gòu)雄妥。這些文件的損壞將導(dǎo)致HDFS實(shí)例異常。 因此依溯,NameNode可以配置為支持多FsImage
和EditLog
副本模式老厌。任何對(duì)FsImage
or EditLog
的更新都會(huì)導(dǎo)致每個(gè)FsImages
和EditLogs
的同步更新。FsImage
和 EditLog
的同步更新會(huì)導(dǎo)致降低命名空間每秒的事物效率黎炉。但是枝秤,這種降級(jí)是可以接受的,因?yàn)镠DFS應(yīng)用是數(shù)據(jù)密集型慷嗜,而不是元數(shù)據(jù)密集型淀弹。當(dāng)NameNode重啟的時(shí)候丹壕,它會(huì)選擇最新的一致的FsImage
和EditLog
。
另外一種提供故障恢復(fù)能力的辦法是多NameNodes 開啟HA薇溃,以shared storage on NFS or distributed edit log (called Journal)的方式菌赖。推薦后者。
- Snapshots
Snapshots - 快照沐序,支持在特定時(shí)刻存儲(chǔ)數(shù)據(jù)的副本盏袄。快照功能的一個(gè)用法薄啥,可以回滾一個(gè)故障的HDFS實(shí)例到已知工作良好的時(shí)候。
Data Organization
- Data Blocks
HDFS被設(shè)計(jì)與支持超大的文件逛尚。與HDFS適配的軟件都是處理大數(shù)據(jù)的垄惧。這些應(yīng)用都只寫一次,但是它們會(huì)讀取一或多次绰寞,并且需要滿足流式讀速度到逊。HDFS支持文件的 一次寫入-多次讀取 語義。 HDFS典型的塊大小是128 MB.滤钱。因此觉壶,HDFS文件被分割為128 MB的塊,可能的話每個(gè)塊都位于不同的DataNode上件缸。
- Replication Pipelining
當(dāng)客戶端以復(fù)制因子3寫入HDFS文件時(shí)铜靶,NameNode以 復(fù)制目標(biāo)選擇算法replication target choosing algorithm
檢索DataNodes 列表。該列表包含了承載該數(shù)據(jù)塊副本的DataNodes清單他炊。然后客戶端寫入到第一個(gè)DataNode争剿。第一DataNode逐步接受數(shù)據(jù)的一部分,將每一部分內(nèi)容寫入到本地倉庫痊末,并將該部分?jǐn)?shù)據(jù)傳輸給清單上的第二DataNode蚕苇。第二DataNode,按順序接受數(shù)據(jù)塊的每個(gè)部分凿叠,寫入到倉庫涩笤,然后將該部分?jǐn)?shù)據(jù)刷新到第三DataNode。最終盒件,第三DataNode將數(shù)據(jù)寫入到其本地倉庫蹬碧。
因此,DataNode從管道的前一個(gè)DataNode獲取數(shù)據(jù)履恩,同時(shí)轉(zhuǎn)發(fā)到管道的后一個(gè)DataNode锰茉。因此,數(shù)據(jù)是以管道的方式從一個(gè)DataNode傳輸?shù)较乱粋€(gè)的切心。
Accessibility
應(yīng)用訪問HDFS有很多方式飒筑。原生的片吊,HDFS 提供了FileSystem Java API 來給應(yīng)用調(diào)用。還提供了C language wrapper for this Java API 和 REST API 协屡。另外俏脊,還支持HTTP瀏覽器查看HDFS實(shí)例的文件。 通過使用NFS gateway肤晓,HDFS還可以掛載到客戶端作為本地文件系統(tǒng)的一部分爷贫。
- FS Shell
HDFS的用戶數(shù)據(jù)是以文件和目錄的形式組織的。它提供了一個(gè)命令行接口FS shell來提供用戶交互补憾。命令的語法類似于其他shell (比如:bash, csh)漫萄。如下是一些范例:
Action | Command |
---|---|
Create a directory named /foodir | bin/hadoop dfs -mkdir /foodir |
Remove a directory named /foodir | bin/hadoop fs -rm -R /foodir |
View the contents of a file named /foodir/myfile.txt | bin/hadoop dfs -cat /foodir/myfile.txt |
FS shell 的目標(biāo)是向依賴于腳本語言的應(yīng)用提供與存儲(chǔ)數(shù)據(jù)的交互。
- DFSAdmin
DFSAdmin 命令用于管理HDFS集群盈匾。這些命令僅給HDFS管理員使用腾务。如下范例:
Action | Command |
---|---|
Put the cluster in Safemode | bin/hdfs dfsadmin -safemode enter |
Generate a list of DataNodes | bin/hdfs dfsadmin -report |
Recommission or decommission DataNode(s) | bin/hdfs dfsadmin -refreshNodes |
- Browser Interface
典型的HDFS安裝會(huì)配置一個(gè)web server來將HDFS命名空間通過TCP端口發(fā)布出去。這允許用戶通過瀏覽器導(dǎo)航HDFS命名空間削饵,并查看文件內(nèi)容岩瘦。
Space Reclamation
- File Deletes and Undeletes
如果啟用了回收站配置,那么文件被FS Shell移除時(shí)并不會(huì)立即從HDFS刪除窿撬。HDFS會(huì)將其移動(dòng)到回收站目錄(每個(gè)用戶都有回收站启昧,位于 /user/<username>/.Trash
)。只要文件還在回收站內(nèi)劈伴,就可以快速恢復(fù)密末。
最近刪除的文件大多數(shù)被移動(dòng)到 current 回收站目錄 (/user/<username>/.Trash/Current
),在配置周期內(nèi)跛璧,HDFS給 current目錄內(nèi)的文件創(chuàng)建檢查點(diǎn)checkpoints
(位于 /user/<username>/.Trash/<date>
) ,并刪除舊的檢查點(diǎn)赡模。參考expunge command of FS shell 獲取更多關(guān)于回收站檢查點(diǎn)的信息。
在回收站過期后教硫,NameNode從HDFS命名空間刪除文件。刪除文件會(huì)將文件關(guān)聯(lián)的塊釋放辆布。注意瞬矩,在用戶刪除文件和HDFS增加free空間之間锋玲,會(huì)有一個(gè)明顯的延遲。
如下范例展示了FS Shell如何刪除文件。我們在delete目錄下創(chuàng)建兩個(gè)文件(test1 & test2)
$ hadoop fs -mkdir -p delete/test1
$ hadoop fs -mkdir -p delete/test2
$ hadoop fs -ls delete/
Found 2 items
drwxr-xr-x - hadoop hadoop 0 2015-05-08 12:39 delete/test1
drwxr-xr-x - hadoop hadoop 0 2015-05-08 12:40 delete/test2
我們刪除文件 test1伞插。如下命令顯示文件被移動(dòng)到回收站割粮。
$ hadoop fs -rm -r delete/test1
Moved: hdfs://localhost:8020/user/hadoop/delete/test1 to trash at: hdfs://localhost:8020/user/hadoop/.Trash/Current
現(xiàn)在我們嘗試以skipTrash參數(shù)刪除文件,該參數(shù)將不將文件發(fā)送到回收站舀瓢。文件將會(huì)從HDFS完全刪除耗美。
$ hadoop fs -rm -r -skipTrash delete/test2
Deleted delete/test2
我們檢查回收站,只有文件test1堰怨。
$ hadoop fs -ls .Trash/Current/user/hadoop/delete/
Found 1 items\
drwxr-xr-x - hadoop hadoop 0 2015-05-08 12:39 .Trash/Current/user/hadoop/delete/test1
如上蛇摸,文件test1進(jìn)了回收站,文件test2被永久刪除了。
- Decrease Replication Factor
當(dāng)縮減文件的復(fù)制因子時(shí)砸烦,NameNode選擇可以被刪除的多余副本。下一個(gè)Heartbeat會(huì)通報(bào)此信息給DataNode幢痘。DataNode然后會(huì)刪除響應(yīng)的塊,相應(yīng)的剩余空間會(huì)顯示在集群內(nèi)购岗。同樣门粪,在setReplication API調(diào)用完成和剩余空間在集群顯示之間會(huì)有一個(gè)時(shí)間延遲。
References
Hadoop JavaDoc API.
HDFS source code: http://hadoop.apache.org/version_control.html