Google 三架馬車(chē)中凹炸,第一架即是 GFS(Googel File system )
文件系統(tǒng)從垂直伸縮到水平伸縮
早期进陡,為了提升計(jì)算機(jī)的運(yùn)算以及存儲(chǔ)能力额各,主要靠的是垂直伸縮的方式绎速。摩爾定律提出集成電路上晶體管的數(shù)目每?jī)赡陼?huì)增加一倍八毯。當(dāng)時(shí),半導(dǎo)體行業(yè)大致按照摩爾定律發(fā)展了半個(gè)多世紀(jì)讶踪。
獨(dú)立硬盤(pán)冗余陣列(RAID, Redundant Array of Independent Disks)可以認(rèn)為是一種垂直伸縮。其基本思想是把多個(gè)磁盤(pán)組裝起來(lái)稱(chēng)為一個(gè)磁盤(pán)陣列泊交,使之性能達(dá)到甚至超過(guò)一個(gè)價(jià)格昂貴柱查、容量巨大的硬盤(pán)雏婶。根據(jù) RAID 實(shí)現(xiàn)方式的不同物赶,可以有不同的效果,包括提升容量留晚、磁盤(pán)容錯(cuò)酵紫、處理性能错维。
互聯(lián)網(wǎng)時(shí)代,計(jì)算機(jī)硬件的性能提升早已放緩参歹,公司購(gòu)買(mǎi)大型計(jì)算機(jī)的成本是很大的隆判,所以開(kāi)始出現(xiàn)水平伸縮的方式,通過(guò)分布式技術(shù)臭挽,在集群中不斷增加計(jì)算機(jī)來(lái)提升計(jì)算能力咬腕。將 RAID 的思想應(yīng)用到分布式集群,就產(chǎn)生了分布式文件系統(tǒng)纽帖,分布式存儲(chǔ)技術(shù)的典型代表就是 HDFS举反。
HDFS (Hadoop Distributed File System) 被設(shè)計(jì)用來(lái)搭建大規(guī)模的分布式集群,提供海量數(shù)據(jù)的讀寫(xiě)吹截、存儲(chǔ)凝危。
HDFS 的特點(diǎn)和設(shè)計(jì)目標(biāo):
硬件容錯(cuò) 大規(guī)模集群有大量節(jié)點(diǎn),硬件會(huì)有一定的損壞概率懦铺,所以 HDFS 支持錯(cuò)誤檢測(cè)支鸡,快速和自動(dòng)的恢復(fù)服務(wù)趁窃。
流式訪問(wèn) HDFS 支持流式訪問(wèn)數(shù)據(jù)醒陆,被設(shè)計(jì)用于批量處理而非用戶(hù)交互裆针。重點(diǎn)是高吞吐量訪問(wèn)而不是低延遲。(換句話(huà)受澡刹,HDFS 為高吞吐量而設(shè)計(jì)耘婚,以高延遲為代價(jià))
存儲(chǔ)大文件 HDFS 適合存儲(chǔ)大型文件,并將文件分塊存儲(chǔ)到不同的節(jié)點(diǎn)上嚷闭。
簡(jiǎn)單一致性模型 一次寫(xiě)入赖临,多次讀取思杯。支持追加數(shù)據(jù)挠进,不支持修改數(shù)據(jù)內(nèi)容。這樣的設(shè)計(jì)簡(jiǎn)化了一致性模型暖璧,支持高吞吐量的訪問(wèn)君旦。
移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)更劃算 程序比數(shù)據(jù)小得多,那么將程序分發(fā)到數(shù)據(jù)所在得地方進(jìn)行計(jì)算局蚀。比如 Mapreduce 任務(wù)在多個(gè)節(jié)點(diǎn)上分別運(yùn)行后再分別聚合的思路恕稠。
跨平臺(tái) HDFS 作為大數(shù)據(jù)存儲(chǔ)鹅巍,被廣泛應(yīng)用于多種大數(shù)據(jù)平臺(tái)料祠。
HDFS 架構(gòu)
HDFS 的架構(gòu)如上圖所示澎羞∽苯剩可以看到其中的關(guān)鍵組件包括一個(gè) NameNode(NN) 和多個(gè) DataNode(DN),事實(shí)上大部分的分布式技術(shù)都是類(lèi)似這樣的主從(Master-Slave) 結(jié)構(gòu)塘匣。
HDFS 中文件被切分文多個(gè)數(shù)據(jù)塊(Block)存儲(chǔ)在多個(gè) DataNode 中巷帝,塊大小默認(rèn)為 128M,數(shù)據(jù)塊副本默認(rèn)為3驰徊。
NameNode 管理 HDFS 文件系統(tǒng)的元數(shù)據(jù)(Metadata)和控制客戶(hù)端(Client)對(duì)文件的訪問(wèn)請(qǐng)求堕阔。文件操作比如打開(kāi)超陆、關(guān)閉、重命名等都由 NameNode 執(zhí)行时呀,響應(yīng)操作記錄也存儲(chǔ)在其中谨娜。文件的數(shù)據(jù)塊副本數(shù)和對(duì)應(yīng)的 DataNode 地址也由 NameNode 維護(hù)存儲(chǔ)。
DataNode 管理相應(yīng)節(jié)點(diǎn)的存儲(chǔ)漠畜,響應(yīng) NameNode 命令坞靶,讀寫(xiě)用戶(hù)的文件對(duì)應(yīng)的數(shù)據(jù)塊,定期向 NameNode 發(fā)送心跳信息躯喇,匯報(bào)本身及其所有 block 信息、健康狀況倦微。
數(shù)據(jù)副本存放
上圖展示了 HDFS 數(shù)據(jù)副本存放的示意欣福。從 NameNode 的元數(shù)據(jù)信息中可以看到焦履,對(duì)于文件 part-0 ,其副本份數(shù)是 2郑临,block ID 分別為 1 和 3屑宠。其中 block1 存放在 DataNode1 和 DataNode3 中,這樣即使某個(gè) DataNode 宕機(jī)躺翻,也不會(huì)影響文件的訪問(wèn)卫玖。
HDFS 數(shù)據(jù)塊分布在不同的 DataNode 上假瞬,所以文件系統(tǒng)可以并行地進(jìn)行讀寫(xiě)操作,實(shí)現(xiàn)告訴訪問(wèn)剪芥。
大型的 HDFS 集群往往有多個(gè)機(jī)架芦劣。當(dāng)副本個(gè)數(shù)為 3 時(shí)说榆,往數(shù)據(jù)塊副本存放策略是一個(gè)當(dāng)前運(yùn)行客戶(hù)端的節(jié)點(diǎn)上签财,另外兩個(gè)副本放在其它機(jī)架的不同節(jié)點(diǎn)上,從而保證數(shù)據(jù)的可靠性和讀寫(xiě)性能唱蒸。
以上就是 HDFS 的基本存儲(chǔ)原理。
HDFS 高可用 (High Availability庆捺,HA)
NameNode 節(jié)點(diǎn)中存儲(chǔ)有以下兩個(gè)文件滔以,存儲(chǔ)重要的元數(shù)據(jù)信息。
fsimage: NameNode 的快照抵碟,元數(shù)據(jù)的鏡像坏匪,包含了文件系統(tǒng)中的所有目錄和文件inode的序列化信息
edits: 記錄文件系統(tǒng)的改動(dòng)
NameNode 把對(duì)文件系統(tǒng)的修改存儲(chǔ)到 edits 中,啟動(dòng)時(shí)從 fsimage 讀取文件狀態(tài)敦迄,從 edits 應(yīng)用編輯操作粒竖,隨著 edits 越來(lái)越大蕊苗,NameNode 的啟動(dòng)時(shí)間會(huì)變長(zhǎng)。
在 Hadoop 2.X 之前有 Secondary NameNode尖滚,按一定規(guī)則將 edits 文件和 fsimage 文件合并瞧柔,合并后 NameNode 會(huì)啟用新的 edits 文件,這樣會(huì)減小 edits 文件的文件大小撼唾,控制 edits 文件的大小會(huì)減少 NameNode 在啟動(dòng)階段解析加載 edits 文件的時(shí)長(zhǎng)哥蔚。
但是糙箍,在 hadoop2.0 之前,NameNode 只有一個(gè)抖格,存在單點(diǎn)問(wèn)題(雖然 Hadoop1.0 有secondary NameNode,checkpointnode收奔,buckcupnode 這些办桨,但是單點(diǎn)問(wèn)題依然存在),在 hadoop2.0 引入了 HA 機(jī)制损姜。
Hadoop 2.X 引入 Active NameNode 和 Standby NameNode 摧阅,提供主備切換避免單點(diǎn)故障绷蹲。HA 其本質(zhì)上就是要保證主備 NN 元數(shù)據(jù)一致,即保證 fsimage 和 edits 在備 NN 上也是完整的比规。元數(shù)據(jù)的同步很大程度取決于 edits 的同步拦英,而這步驟的關(guān)鍵就是共享文件系統(tǒng)疤估。提供兩種方式。
NFS 網(wǎng)絡(luò)共享文件系統(tǒng)的方式
提供共享文件的 NAS 設(shè)備钞瀑。NFS 作為 Active NameNode 和 Standby NameNode 之間數(shù)據(jù)共享的存儲(chǔ)慷荔。Active NameNode 會(huì)把最近的 edits 文件寫(xiě)到 NFS,而 Standby NameNode 從 NFS 中把數(shù)據(jù)讀過(guò)來(lái)贷岸。這個(gè)方式的缺點(diǎn)是吧碾,如果 Active NameNode 或者 Standby NameNode 有一個(gè)和 NFS 之間網(wǎng)絡(luò)有問(wèn)題墓卦,則會(huì)造成他們之前數(shù)據(jù)的同步出問(wèn)題。
QJM(Quorum Journal Manager )方式
QJM 由JournalNode(JN)組成睁本,一般是奇數(shù)點(diǎn)結(jié)點(diǎn)組成。每個(gè) JournalNode 對(duì)外有一個(gè)簡(jiǎn)易的 RPC 接口抄瑟,以供 NameNode 讀寫(xiě) edits 到 JN 本地磁盤(pán)枉疼。當(dāng)寫(xiě) edits 時(shí)骂维,NameNode 會(huì)同時(shí)向所有 JournalNode 并行寫(xiě)文件,只要有 N/2+1 結(jié)點(diǎn)寫(xiě)成功則認(rèn)為此次寫(xiě)操作成功褪测,遵循 Paxos 協(xié)議潦刃。
JN日志節(jié)點(diǎn)是一個(gè)輕量級(jí)的乖杠,所以可以和Hadoop的其他守護(hù)線(xiàn)程放在一起,不需要額外設(shè)備笆包。
完成 HA 除了元數(shù)據(jù)的同步略荡,還需要一個(gè)完善的主備選舉切換機(jī)制汛兜,依賴(lài)于 Zookeeper。
關(guān)于 HA 詳細(xì)內(nèi)容可參考
HDFS 聯(lián)邦(Federation)
如下圖 HDFS 有兩個(gè)重要層級(jí)肛根,命名空間(Namespace)和 塊存儲(chǔ)服務(wù)(Block Storage)漏策。但是之前介紹的 HDFS 結(jié)構(gòu)都是單 NameNode 的(注意上文說(shuō)得 HA 并不提供 Namespace 的擴(kuò)展)掺喻,單 NameNode 命名空間受限储矩,整個(gè) HDFS 文件系統(tǒng)的吞吐量受限于單個(gè) NameNode 的吞吐量褂乍,比如存儲(chǔ)大量小文件時(shí)逃片,NameNode 會(huì)越來(lái)越大,并且單個(gè) NameNode 無(wú)法隔離應(yīng)用程序呀狼。
聯(lián)邦 HDFS 提供了擴(kuò)展命名空間的策略赠潦,如下圖所示草冈。
塊池(Block Pool)
一個(gè)塊池是一系列屬于單個(gè)命名空間的塊集合怎棱,DataNodes 為集群中的所有塊池存儲(chǔ)塊。每個(gè)塊池都是獨(dú)立管理凡资。這就允許命名空間為新塊生成 Block IDs 時(shí)不需要與其他命名空間協(xié)調(diào)谬运。一個(gè) NameNode 故障不會(huì)阻止 DataNode 為集群中的其他 NameNodes 提供服務(wù)梆暖。
一個(gè)命名空間和它的塊池一起被稱(chēng)為命名空間卷(Namespace Volume)。命名空間卷是一個(gè)獨(dú)立的自我管理單位厚掷。當(dāng)一個(gè) NameNode/namespace 被刪除時(shí)级解,對(duì)應(yīng)的在 DataNodes 上的塊池也會(huì)被刪除勤哗。在集群升級(jí)期間,每個(gè)命名空間卷作為一個(gè)單元來(lái)進(jìn)行升級(jí)冬竟。
ClusterID
ClusterID 用于標(biāo)識(shí)集群中所有的節(jié)點(diǎn)。當(dāng)一個(gè) NameNode 被格式化時(shí),ClusterID 就會(huì)人工提供或者自動(dòng)生成袋狞,同時(shí)這個(gè) ID 用于將剩余其他 NameNode 格式化到集群中映屋。
HDFS 聯(lián)邦的主要好處:
命名空間可擴(kuò)展 - 聯(lián)邦增加了命名空間的水平擴(kuò)展性棚点。大型部署或使用大量小文件的部署使用命名空間擴(kuò)展可以允許將更多 NameNodes 添加到集群中,這對(duì)于大型部署或使用大量小文件部署是非常有益的(這樣就能避免單 個(gè)NameNode 內(nèi)存有限的問(wèn)題)砌梆。
性能 - 文件系統(tǒng)吞吐量將不受單個(gè)名稱(chēng)節(jié)點(diǎn)的限制贬循。向集群添加更多NameNode可擴(kuò)展文件系統(tǒng)讀/寫(xiě)的吞吐量杖虾。
隔離 - 單個(gè) NameNode 在多用戶(hù)環(huán)境中不提供隔離。例如坟比,一個(gè)實(shí)驗(yàn)應(yīng)用程序可能會(huì)使 NameNode 過(guò)載嚷往,并降低主要應(yīng)用程序的速度皮仁。通過(guò)使用多個(gè) NameNode,可以將不同類(lèi)別的應(yīng)用程序和用戶(hù)隔離到不同的命名空間巩割。
以上便是本文的全部?jī)?nèi)容付燥,關(guān)于 HDFS 的文件讀寫(xiě)键科,容錯(cuò)等內(nèi)容會(huì)在下一篇文章通過(guò)漫畫(huà)的形式介紹漩怎。
參考文獻(xiàn)
HDFS 官方文檔:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
極客時(shí)間大數(shù)據(jù)專(zhuān)欄
歡迎關(guān)注的我微信公眾號(hào)
?