HDFS 系統(tǒng)架構(gòu)

HDFS Architecture

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ù)制颇玷。

hdfsarchitecture.png

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 quotasaccess permissions。 HDFS 不支持軟离福、硬鏈接杖狼。但是,HDFS 架構(gòu)不排除實(shí)現(xiàn)這些功能妖爷。

雖然HDFS遵守文件系統(tǒng)命名約定蝶涩,一些路徑和名稱 (比如/.reserved 和.snapshot ) 保留了。比如功能 transparent encryptionsnapshot 就使用的保留路徑絮识。

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è)塊外哲思,其他的塊一樣大。在appendhsync添加了可變長度塊的支持后吩案,用戶可以啟動(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上所有塊的清單途样。

hdfsdatanodes.png
  • 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ì)從磁盤讀取FsImageEditLog,把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 failuresnetwork 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

FsImageEditLog 是HDFS的核心數(shù)據(jù)結(jié)構(gòu)雄妥。這些文件的損壞將導(dǎo)致HDFS實(shí)例異常。 因此依溯,NameNode可以配置為支持多FsImageEditLog 副本模式老厌。任何對(duì)FsImage or EditLog的更新都會(huì)導(dǎo)致每個(gè)FsImagesEditLogs 的同步更新。FsImageEditLog的同步更新會(huì)導(dǎo)致降低命名空間每秒的事物效率黎炉。但是枝秤,這種降級(jí)是可以接受的,因?yàn)镠DFS應(yīng)用是數(shù)據(jù)密集型慷嗜,而不是元數(shù)據(jù)密集型淀弹。當(dāng)NameNode重啟的時(shí)候丹壕,它會(huì)選擇最新的一致的FsImageEditLog

另外一種提供故障恢復(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 APIREST 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乾吻,一起剝皮案震驚了整個(gè)濱河市绎签,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诡必,老刑警劉巖搔扁,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碳抄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嫉入,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門咒林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爷光,“玉大人,你說我怎么就攤上這事蛀序⌒炻悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵骑祟,是天一觀的道長气笙。 經(jīng)常有香客問我,道長缸棵,這世上最難降的妖魔是什么谭期? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮型诚,結(jié)果婚禮上鸳劳,老公的妹妹穿的比我還像新娘。我一直安慰自己涵紊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布颤练。 她就那樣靜靜地躺著驱负,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宇挫。 梳的紋絲不亂的頭發(fā)上酪术,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天绘雁,我揣著相機(jī)與錄音,去河邊找鬼庐舟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘟檩。 我是一名探鬼主播澈蟆,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼趴俘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寥闪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤凿渊,失蹤者是張志新(化名)和其女友劉穎埃脏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彩掐,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堵幽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抡谐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桐猬。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溃肪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羔沙,到底是詐尸還是另有隱情厨钻,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布诗充,位于F島的核電站诱建,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏俺猿。R本人自食惡果不足惜押袍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望造烁。 院中可真熱鬧,春花似錦惭蟋、人聲如沸告组。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽我碟。三九已至,卻和暖如春厘托,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背押赊。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工包斑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人神帅。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓枕稀,卻偏偏與公主長得像谜嫉,于是被迫代替她去往敵國和親凹联。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355