node分布式存儲
① 試述HDFS聯邦能夠解決什麼問題
HDFS聯邦能夠解決對文件系統數據的流式處理訪問。HDFS 提供文件許可權和身份驗證。
HDFS的簡介:
HDFS(Hadoop Distributed File System)是hadoop項目的核心子項目,是分布式計算中數據存儲管理的基礎。是基於流數據模式訪問和處理超大文件的需求而開發的, 可以運行於廉價的商用伺服器上。
它所具有的高容錯、 高可靠性、 高可擴展性、 高獲得性、 高吞吐率等特徵為海量數據提供了不怕故障的存儲, 為超大數據集(Large Data Set) 的應用處理帶來了很多便利。
HDFS是開源的,存儲著Hadoop應用將要處理的數據,類似於普通的Unix和linux文件系統,不同的是它是實現了google的GFS文件系統的思想,是適用於大規模分布式數據處理相關應用的、可擴展的分布式文件系統。
HDFS的功能:
1)數據的分布式存儲和處理。
2)Hadoop 提供了一個命令介面來與 HDFS 進行交互。
3)namenode 和 datanode 的內置伺服器可幫助用戶輕松檢查群集的狀態。
4)對文件系統數據的流式處理訪問。
5)HDFS 提供文件許可權和身份驗證。
② 什麼是HDFS
HDFS,全稱Hadoop Distributed File System,意思是分布式文件系統。
Hadoop分布式文件系統是指被設計成適合運行在通用硬體(commodity hardware)上的分布式文件系統。
③ 第三章 大數據存儲
一,HDFS的基本特徵與構架
1.基本特徵
(1)大規模數據分布存儲能力:以分布式存儲能力和良好的可擴展性。(基於大量分布節點上的本地文件系統,構建一個邏輯上具有巨大容量的分布式文件系統,並且整個文件系統的容量可隨集群中節點的增加而線性擴展)
(2)高並發訪問能力:提供很高的數據訪問寬頻(高數據吞吐率),並且可以把帶寬的大小等比例擴展到集群中的全部節點上
(3)強大的容錯能力:(設計理念中硬體故障被視作常態)保證在經常有節點發生硬體故障的情況下正確檢測硬體故障,並且能自動從故障中快速恢復,確保數據不丟失(採用多副本數據塊形式存儲)
(4)順序式文件訪問:(大數據批處理都是大量簡單數據記錄的順序處理)對順序讀進行了優化,支持大量數據的快速順序讀出,代價是對於隨機的訪問負載較高
(5)簡單的一致性模型(一次寫多次讀):支持大量數據的一次寫入,多次讀取;不支持已寫入數據的更新操作,但允許在文件尾部添加新的數據
(6)數據塊存儲模式:默認的塊大小是64MB。好處:減少元數據的數量,允許這些數據塊通過隨機方式選擇節點,分布存儲在不同地方
2.基本框架與工作過程
(1)基本組成結構與文件訪問過程
[1]HDFS;一個建立在一組分布式伺服器節點的本地文件系統之上的分布式文件系統(採用經典主-從結構)
[2]主控節點NameNode:
1)是一個主伺服器,用來管理整個文件系統的命名空間和元數據,以及處理來自外界的文件訪問請求
2)保存了文件系統的三中元數據
命名空間:整個分布式文件系統的目錄結構
數據塊與文件名的映射表
每個數據塊副本的位置信息,每一個數據塊默認有3個副本
[3]從節點DataNode:
1)用來實際存儲和管理文件的數據塊
2)為了防止數據丟失,每個數據塊默認有3個副本,且3個副本會分別復制在不同節點上,以避免一個節點失效造成一個數據塊的徹底丟失
[4]程序訪問文件時,實際文件數據流並不會通過NameNode傳送,而是從NameNode獲得所需訪問數據塊的存儲位置信息後,直接去訪問對應的DataNode獲取數據
[5]設計好處:
1)可以允許一個文件的數據能同時在不同DataNode上並發訪問,提高數據訪問的速度
2)減少NameNode的負擔,避免使NameNode成為數據訪問瓶頸
[6]基本訪問過程:
1)首先,用戶的應用程序通過HDFS的客戶端程序將文件名發送至NameNode
2)NameNode接收到文件名之後,在HDFS目錄中檢索文件名對應的數據塊,再根據數據塊信息找到保存數據塊的DataNode地址,講這些地址回送到客戶端
3)客戶端接收到這些DataNode地址之後,與這些DataNode並行的進行數據傳輸操作,同時將操作結果的相關日誌提交到NameNode
2.數據塊
(1)為了提高硬碟的效率,文件系統中最小的數據讀寫單元是數據塊
(2)HDFS數據塊的默認大小是64MB,實際部署中,可能會更多
(3)將數據塊設置大的原因是減少定址開銷的時間
(4)當應用發起數據傳輸請求:
[1]NameNode首先檢索文件對應的數據塊信息,找到數據塊對應的DataNode
[2]DataNode根據數據塊信息在自身的存儲中尋找相應的文件,進而與應用程序之間交換數據
[3]因為檢索過程是但進行,所以要增加數據塊大小,這樣就可以減少定址的頻度和時間開銷
3.命名空間
(1)文件命名遵循「目錄/子目錄/文件」格式
(2)通過命令行或者是API可以創建目錄,並且將文件保存在目錄中。可以對文件進行創建,刪除,重命名操作
(3)命令空間由NameNode管理。所有對命名空間的改動都會被記錄
(4)允許用戶配置文件在HDFS上保存的副本數量,保存的副本數稱作「副本因子」
4.通信協議
(1)採用TCP協議作為底層的支撐協議
(2)應用協議
[1]應用可以向NameNode主動發起TCP連接
[2]應用和NameNode交互協議稱為Client協議
[3]NameNode和DataNode交互的協議稱為DataNode協議
(3)用戶和DataNode的交互是通過發起遠程調用(RPC),並由NameNode響應來完成的。另外,NameNode不會主動發起遠程過程調用請求
5.客戶端:是用戶和HDFS通信最常見的渠道,部署的HDFS都會提供客戶端
二,HDFS可靠性設計
1.HDFS數據塊多副本存儲設計
(1)採用了在系統中保存多個副本的方式保存數據,且同一個數據塊的多個副本會存放在不同節點上
(2)優點:
[1]採用多副本,可以讓客戶從不同數據塊中讀取數據,加快傳輸速度
[2]HDFS的DataNode之間通過網路傳輸數據,如果採用多個副本可以判斷數據傳輸是否出錯
[3]多副本可以保證某個DataNode失效的情況下,不會丟失數據
2.可靠性的設計實現
(1)安全模式:
[1]HDFS啟動時,NameNode進入安全模式
[2]處於安全模式的NameNode不能做任何文本操作,甚至內部的副本創建不允許
[3]NameNode需要和各個DataNode通信,獲得其中保存的數據塊信息,並對數據塊信息進行檢查
[4]只有通過了NameNode檢查,一個數據塊被認為安全。當被認為安全的數據塊所佔比例達到某個閾值,NameNode退出
(2)SecondaryNmaeNode
[1]使用它來備份NameNode元數據,以便在其失效時能從中恢復出其上的元數據
[2]它充當NameNode的一個副本,本身並不處理任何請求。
[3]作用:周期性保存NameNode的元數據
(3)心跳包和副本重新創建
[1]心跳包:位於HDFS核心的NameNode,通過周期性的活動檢查DataNode的活動
[2]檢測到DataNode失效,保存在其上的數據不可用。則其上保存的副本需要重新創建這個副本,放到另外可用的地方
(4)數據一致性
[1]採用了數據校驗和機制
[2]創建文件時,HDFS會為這個文件生成一個校驗和,校驗和文件和文件本身保存在同一空間上,
[3]傳輸數據時會將數據與校驗和一起傳輸,應用收到數據後可以進行校驗
(5)租約
[1]防止同一個文件被多個人寫入數據
[2]NameNode保證同一個文件只會發放一個允許的租約,可以有效防止出現多人寫入的情況
(6)回滾
三,HDFS文件存儲組織與讀寫
1.文件數據的存儲組織
(1)NameNode目錄結構
[1]藉助本地文件系統來保存數據,保存文件夾位置由配置選項({dfs.name.dir}/{/tmp/dfs/name})決定
[2]在NameNode的${dfs.name.dir}之下有3個文件夾和1個文件:
1)current目錄:
文件VERSION:保存了當前運行的HDFS版本信息
FsImages:是整個系統的空間鏡像文件
Edit:EditLog編輯文件
Fstime:上一次檢查點時間
2)previous.checkpoint目錄:和上一個一致,但是保存的是上一次檢查點的內容
3)image目錄:舊版本的FsImage存儲位置
4)in_use.look:NameNode鎖,只在NameNode有效(啟動並且能和DataNode正常交互)時存在。
(2)DataNode目錄結構
[1]藉助本地文件系統來保存數據。保存文件夾位置由配置選項{dfs.data.dir}決定
[2]在其之下有4個子目錄和2個文件
1)current目錄:已經成功寫入的數據塊,以及一些系統需要的文件
a)文件VERSION:保存了當前運行的HDFS版本信息
b)subdirXX:當同一目錄下文件超過一定限制,新建一個目錄,保存多出來的數據塊和元數據
2)tmp目錄和blockBeingWritten目錄:正在寫入的數據塊,是HDFS系統內部副本創建時引發的寫入操作對應的數據塊
3)detach目錄:用於DataNode升級
4)Storage目錄:防止版本不同帶來風險
5)in_user.lock文件:DataNode鎖。只有在DataNode有效時存在。
(3)CheckPointNode目錄結構:和上一個基本一致
2.數據的讀寫過程
(1)數據讀取過程
[1]首先,客戶端調用FileSystem實例的open方法,獲得這個文件對應的輸入流,在HDFS中就是DFSInputStream
[2]構造第一步的輸入流時,通過RPC遠程調用NameNode可以獲得NameNode中此文件對應的數據塊保存位置,包括這個文件副本的保存位置(註:在輸入流中會按照網路拓撲結構,根據與客戶端距離對DataNode進行簡單排序)
[3]-[4]獲得此輸入流後,客戶端調用READ方法讀取數據。輸入流選擇最近的DFSInputStream會根據前面的排序結果,選擇最近的DataNode建立連接並讀取數據。
[5]如果已達到數據塊末端,關閉這個DataNode的連接,然後重新查找下一個數據塊
[6]客戶端調用close,關閉輸入流DFSInputStream
(2)數據輸入過程
[1]-[2]:客戶端調用FileSystem實例的create方法,創建文件。檢查後,在NameNode添加文件信息,創建結束之後,HDFS會返回一個輸出流DFSDataOutputStream給客戶端
[3]調用輸出流的write方法向HDFS中對應的文件寫入數據。
數據首先會被分包,這些分包會寫入一個輸出流的內部隊列Data隊列中,接收完整數據分包,輸出流回想NameNode申請保存文件和副本數據塊的若干個DataNode
[4]DFSDataOutputStream會(根據網路拓撲結構排序)將數據傳輸給距離上最短的DataNode,這個節點接收到數據包後傳給下一個。數據在各節點之間通過管道流通,減少傳輸開銷
[5]數據節點位於不同機器上,數據需要通過網路發送。(為保證數據節點數據正確,接收到數據的節點要向發送者發送確認包)
[6]執行3-5知道數據全部寫完,DFSDataInputStream繼續等待知道所有數據寫入完畢並確認,調用complete方法通知NameNode文件寫入完成
[7]NameNode接收到complete消息之後,等待相應數量的副本寫入完畢後,告知客戶端
傳輸過程,當某個DataNode失效,HDFS執行:
1)關閉數據傳輸的管道
2)將等待ACK隊列的數據放到Data隊列頭部
3)更新正常DataNode中所有數據塊版本。當失效的DataNode重啟,之前的數據塊會因為版本不對被清除
4)在傳輸管道中刪除失效的DataNode,重新建立管道並發送數據包
4.HDFS文件系統操作命令
(1)HDFS啟動與關閉
[1]啟動過程:
1)進入到NameNode對應節點的Hadoop安裝目錄
2)執行啟動腳本:bin/start-dfs.sh
[2]關閉過程:bin/stop-dfs.sh
(2)文件操作命令格式與注意事項
[1]基本命令格式:
1)bin/hadoop dfs-cmd <args> args-> scheme://authority/path
2)args參數基本格式前面是scheme,authority是機器地址和對應埠
a)本地文件,scheme是file
b)HDFS上文件,scheme是hdfs
(3)文件操作基本格式
[1]hadoop dfs-cat URL [URL ...]
[2]作用:將參數所指示文件內容輸出到stdout
④ HDFS 為何在大數據領域經久不衰
大數據中最寶貴、最難以代替的就是數據,一切都圍繞數據。
HDFS是最早的大數據存儲系統,存儲著寶貴的數據資產,各種新演算法、框架要想得到廣泛使用,必須支持HDFS,才能獲取已存儲在裡面的數據。所以大數據技術越發展,新技術越多,HDFS得到的支持越多,越離不開HDFS。 HDFS也許不是最好的大數據存儲技術,但依然是最重要的大數據存儲技術 。
HDFS是如何實現大數據高速、可靠的存儲和訪問的呢?
Hadoop分布式文件系統HDFS的設計目標是管理數以千計的伺服器、數以萬計的磁碟,將大規模的伺服器計算資源當作一個單一存儲系統進行管理,對應用程序提供數以PB計的存儲容量,讓應用程序像使用普通文件系統一樣存儲大規模的文件數據。
文件以多副本的方式進行存儲:
缺點:
優點:
HDFS的大容量存儲和高速訪問的實現。
RAID將數據分片後,在多塊磁碟上並發進行讀寫訪問,提高了存儲容量、加快了訪問速度,並通過數據冗餘校驗提高了數據可靠性,即使某塊磁碟損壞也不會丟數據。將RAID的設計理念擴大到整個分布式伺服器集群,就產生了分布式文件系統,這便是Hadoop分布式文件系統的核心原理。
和RAID在多個磁碟上進行文件存儲及並行讀寫的思路一樣,HDFS是在一個大規模分布式伺服器集群上,對數據分片後進行並行讀寫及冗餘存儲。因為HDFS可部署在一個大的伺服器集群,集群中所有伺服器的磁碟都可供HDFS使用,所以整個HDFS的存儲空間可以達到PB級。
HDFS是主從架構。一個HDFS集群會有一個NameNode(命名節點,簡稱NN),作為主伺服器(master server)。
HDFS公開了文件系統名稱空間,允許用戶將數據存儲在文件中,就好比我們平時使用os中的文件系統一樣,用戶無需關心底層是如何存儲數據的。 在底層,一個文件會被分成一或多個數據塊,這些資料庫塊會被存儲在一組數據節點中。在CDH中數據塊的默認128M。 在NameNode,可執行文件系統的命名空間操作,如打開,關閉,重命名文件等。這也決定了數據塊到數據節點的映射。
HDFS被設計為可運行在普通的廉價機器上,而這些機器通常運行著一個Linux操作系統。一個典型的HDFS集群部署會有一個專門的機器只能運行 NameNode ,而其他集群中的機器各自運行一個 DataNode 實例。雖然一台機器上也可以運行多個節點,但不推薦。
負責文件數據的存儲和讀寫操作,HDFS將文件數據分割成若干數據塊(Block),每個DataNode存儲一部分Block,這樣文件就分布存儲在整個HDFS伺服器集群中。
應用程序客戶端(Client)可並行訪問這些Block,從而使得HDFS可以在伺服器集群規模上實現數據並行訪問,極大提高訪問速度。
HDFS集群的DataNode伺服器會有很多台,一般在幾百台到幾千台,每台伺服器配有數塊磁碟,整個集群的存儲容量大概在幾PB~數百PB。
負責整個分布式文件系統的元數據(MetaData)管理,即文件路徑名、數據塊的ID以及存儲位置等信息,類似os中的文件分配表(FAT)。
HDFS為保證數據高可用,會將一個Block復制為多份(默認3份),並將多份相同的Block存儲在不同伺服器,甚至不同機架。當有磁碟損壞或某個DataNode伺服器宕機,甚至某個交換機宕機,導致其存儲的數據塊不能訪問時,客戶端會查找其備份Block訪問。
HDFS中,一個文件會被拆分為一個或多個數據塊。默認每個數據塊有三個副本,每個副本都存放在不同機器,而且每一個副本都有自己唯一的編號:
文件/users/sameerp/data/part-0的復制備份數設為2,存儲的BlockID分別為1、3:
上述任一台伺服器宕機後,每個數據塊都至少還有一個備份存在,不會影響對文件/users/sameerp/data/part-0的訪問。
和RAID一樣,數據分成若干Block後,存儲到不同伺服器,實現數據大容量存儲,並且不同分片的數據能並行進行讀/寫操作,實現數據的高速訪問。
副本存放:NameNode節點選擇一個DataNode節點去存儲block副本的過程,該過程的策略是在可靠性和讀寫帶寬間權衡。
《Hadoop權威指南》中的默認方式:
Google大數據「三駕馬車」的第一駕是GFS(Google 文件系統),而Hadoop的第一個產品是HDFS,分布式文件存儲是分布式計算的基礎。
這些年來,各種計算框架、各種演算法、各種應用場景不斷推陳出新,但大數據存儲的王者依然是HDFS。
磁碟介質在存儲過程中受環境或者老化影響,其存儲的數據可能會出現錯亂。
HDFS對存儲在DataNode上的數據塊,計算並存儲校驗和(CheckSum)。在讀數據時,重新計算讀取出來的數據的校驗和,校驗不正確就拋異常,應用程序捕獲異常後就到其他DataNode上讀取備份數據。
DataNode監測到本機的某塊磁碟損壞,就將該塊磁碟上存儲的所有BlockID報告給NameNode,NameNode檢查這些數據塊還在哪些DataNode上有備份,通知相應的DataNode伺服器將對應的數據塊復制到其他伺服器上,以保證數據塊的備份數滿足要求。
DataNode會通過心跳和NameNode保持通信,如果DataNode超時未發送心跳,NameNode就會認為這個DataNode已經宕機失效,立即查找這個DataNode上存儲的數據塊有哪些,以及這些數據塊還存儲在哪些伺服器上,隨後通知這些伺服器再復制一份數據塊到其他伺服器上,保證HDFS存儲的數據塊備份數符合用戶設置的數目,即使再出現伺服器宕機,也不會丟失數據。
NameNode是整個HDFS的核心,記錄著HDFS文件分配表信息,所有的文件路徑和數據塊存儲信息都保存在NameNode,如果NameNode故障,整個HDFS系統集群都無法使用;如果NameNode上記錄的數據丟失,整個集群所有DataNode存儲的數據也就沒用了。
所以,NameNode高可用容錯能力非常重要。NameNode採用主從熱備的方式提供高可用服務:
集群部署兩台NameNode伺服器:
兩台伺服器通過Zk選舉,主要是通過爭奪znode鎖資源,決定誰是主伺服器。而DataNode則會向兩個NameNode同時發送心跳數據,但是只有主NameNode才能向DataNode返回控制信息。
正常運行期,主從NameNode之間通過一個共享存儲系統shared edits來同步文件系統的元數據信息。當主NameNode伺服器宕機,從NameNode會通過ZooKeeper升級成為主伺服器,並保證HDFS集群的元數據信息,也就是文件分配表信息完整一致。
軟體系統,性能差點,用戶也許可接受;使用體驗差,也許也能忍受。但若可用性差,經常出故障不可用,就麻煩了;如果出現重要數據丟失,那開發攤上大事。
而分布式系統可能出故障地方又非常多,內存、CPU、主板、磁碟會損壞,伺服器會宕機,網路會中斷,機房會停電,所有這些都可能會引起軟體系統的不可用,甚至數據永久丟失。
所以在設計分布式系統的時候,軟體工程師一定要綳緊可用性這根弦,思考在各種可能的故障情況下,如何保證整個軟體系統依然是可用的。
## 6 保證系統可用性的策略
任何程序、任何數據,都至少要有一個備份,也就是說程序至少要部署到兩台伺服器,數據至少要備份到另一台伺服器上。此外,稍有規模的互聯網企業都會建設多個數據中心,數據中心之間互相進行備份,用戶請求可能會被分發到任何一個數據中心,即所謂的異地多活,在遭遇地域性的重大故障和自然災害的時候,依然保證應用的高可用。
當要訪問的程序或者數據無法訪問時,需要將訪問請求轉移到備份的程序或者數據所在的伺服器上,這也就是 失效轉移 。失效轉移你應該注意的是失效的鑒定,像NameNode這樣主從伺服器管理同一份數據的場景,如果從伺服器錯誤地以為主伺服器宕機而接管集群管理,會出現主從伺服器一起對DataNode發送指令,進而導致集群混亂,也就是所謂的「腦裂」。這也是這類場景選舉主伺服器時,引入ZooKeeper的原因。ZooKeeper的工作原理,我將會在後面專門分析。
當大量的用戶請求或者數據處理請求到達的時候,由於計算資源有限,可能無法處理如此大量的請求,進而導致資源耗盡,系統崩潰。這種情況下,可以拒絕部分請求,即進行 限流 ;也可以關閉部分功能,降低資源消耗,即進行 降級 。限流是互聯網應用的常備功能,因為超出負載能力的訪問流量在何時會突然到來,你根本無法預料,所以必須提前做好准備,當遇到突發高峰流量時,就可以立即啟動限流。而降級通常是為可預知的場景准備的,比如電商的「雙十一」促銷,為了保障促銷活動期間應用的核心功能能夠正常運行,比如下單功能,可以對系統進行降級處理,關閉部分非重要功能,比如商品評價功能。
HDFS是如何通過大規模分布式伺服器集群實現數據的大容量、高速、可靠存儲、訪問的。
1.文件數據以數據塊的方式進行切分,數據塊可以存儲在集群任意DataNode伺服器上,所以HDFS存儲的文件可以非常大,一個文件理論上可以占據整個HDFS伺服器集群上的所有磁碟,實現了大容量存儲。
2.HDFS一般的訪問模式是通過MapRece程序在計算時讀取,MapRece對輸入數據進行分片讀取,通常一個分片就是一個數據塊,每個數據塊分配一個計算進程,這樣就可以同時啟動很多進程對一個HDFS文件的多個數據塊進行並發訪問,從而實現數據的高速訪問。關於MapRece的具體處理過程,我們會在專欄後面詳細討論。
3.DataNode存儲的數據塊會進行復制,使每個數據塊在集群里有多個備份,保證了數據的可靠性,並通過一系列的故障容錯手段實現HDFS系統中主要組件的高可用,進而保證數據和整個系統的高可用。
⑤ Hadoop分布式文件系統(HDFS)會不會被淘汰
首先我們應該更具體的理解這樣一個現象,為什麼流行的技術閉閉敏框架會被淘汰。談到淘汰,常見兩種情況:
第一:應用模式被淘汰了,例如:BB機,功能機,最終被智能機淘汰,膠卷被數碼相機淘汰,即便諾基亞的功能機做得再完美,也會被淘汰。軟體方面例如:終端的字處理,郵件收發等應用軟體被視窗應用軟體淘汰。
第二:技術升級,新技術彌補了老技術的缺陷,並且引入了更多有優勢的功能。例如:Springframework的橫空出世,配合Hibernate,在具有同樣功效的情況下,解決了EJB的部署復雜,體態臃腫,計算效率低,用靈活性,面向程序員的友好性,淘汰了曾經企業級經典的EJB。
那麼對於Hadoop分布式文件系統(HDFS),我們要討論它的淘汰可能性,淘汰時間,首先我們就要看它為什麼要被淘汰的因素。從模式上,分布式文件系統是大數據存儲技術極為重要的一個領域,我們還看不到分布式文件系統有被淘汰的任何理由,那麼我就再看技術升級是否有淘汰它的可能性。
談技術升級,首先要看HDFS的缺點,然後再看這種缺點的解決辦法,是否會帶來新的技術框架,然後讓HDFS埋進歷史的垃圾堆。
HDFS為集中式態橋協調架構,namenode若是單節點,部署並不復雜,但是namenode作為單節點無法可靠的運行在生產環境,必須對namenode實現雙機HA,那麼部署復雜度就變得極高,這時候需要在namenode,datanode的基礎上再引入namenode active,namenode standby的概念,需要引入QJM的元數據共享存儲並基於Paxos做一致性協調,另外需要引入ZKFC和ZooKeeper,解決主備選舉,健康探測,主備切換等操作。
因此HDFS的部署復雜度完全是因為namenode HA導致的。這是集中式管理的分布式架構一個原生問題,如果在這個地方進行優化的話,那麼就是簡化QJM,ZKFC,ZooKeeper的多組服務,用一組服務來代替,但是namenode和datanode的分布式數據塊的讀寫,復制,恢復機制,目前看非常成熟,高效,這是核心問題,並不是缺點,不需要更具顛覆性的優化。
由於namenode在內存中記錄了所有數據塊(block 默認128M)的信息,索引了數據塊與datanode的關系,並且構建了文件系統樹,因此可想而知namenode的元數據內存區是大量佔用內存,這是沒有上限的。對於較大型數據存儲項目,例如上百個datanode節點和上千萬個數據塊的容量來說,元數據在namenode的內存大概能控制在32G以內,這是還沒問題的,但是對於構建海量數據中心的超大型項目,這個問題就好像達摩克斯之劍,首先堆內存超過臨界范圍導致的內存定址性能問題不說,一旦namenode內存超限到單機內存可承載的物理上最大承受范圍,整個hdfs數據平台將面臨停止服務。
這個問題的本質還是Google設計GFS時候採用粗放的實用主義,先把元數據都交給主節點在內存中節制,超大問題以後再解決。目前Google的GFS2設計上,已經將元數據在內存中遷移至了BigTable上,那麼問題就來了:「BigTable基於GFS,而GFS2的元數據基於BigTable」?有點雞生蛋還是蛋生雞的自相矛盾。是的,看似矛盾實質轎枝上是架構的嵌套復用,可以這么去解讀:GFS2是基於<基於GFS的BigTable的元數據存儲>的下一代GFS架構。用BigTable的k-v存儲模型放GFS2的元數據,雖然沒有內存高效,但是夠用,而且可以無限存儲,用BigTable專門存儲元數據形成的k-v記錄最終保存成GFS數據塊,因此在GFS的元數據內存中只需少量的內存佔用,就能支撐天量的真正應用於數據塊存儲的GFS2元數據。
基於GFS2的設計思想,我相信下一代HDFS應該也是這樣的方案去解決元數據的內存瓶頸問題,也就是基於<基於HDFS的HBase的元數據存儲>的下一代HDFS架構。那麼HDFS的元數據瓶頸問題將被徹底解決,很難看到比這更具優勢的替代性技術框架了。
如下圖所示:
副本數默認為3最大的問題就是占空間,這幾乎是所有傳統分布式文件系統(DFS)的通病。因此HDFS集群的默認空間利用率只有33.3%,這么低的利用率顯然不符合一些場景,例如長期的冷數據備份,那麼有沒有更好的方式呢?是有的,目前比較成熟的方案就是糾刪碼技術,類似raid5,raid6,HDFS 3.0版本以後支持這種模式,叫做Erasure Coding(EC)方案。
HDFS是怎麼通過EC方案解決磁碟利用率的問題呢?我們先聊點比較硬的原理,說說EC方案之一的條形布局:
首先數據文件寫的時候會向N個節點的塊(Block)依次寫入,N個Block會被切成多組條(stripe 1... stripe n),如果分布式環境有五個存儲節點(DataNode),那麼就把stripe切成3個單元(cell),然後再根據這3個cell計算出2個校驗cell,然後這5個cell(3個data+2個parity)分別寫入5個Block中。數據條就這么依次輪巡的方式,將校驗塊的位置輪換存儲在不同Block上,直至寫滿,這樣校驗塊的分布可以更均勻。
其次再說取數據,取數據每次只從3個DataNode中各取出1個cell,如果這3個cell都是數據cell,那麼就成功拿到一組數據條stripe,如果有一個cell是校驗cell,那麼就能通過校驗cell和另外2個數據cell計算出第3個數據cell,完成數據條stripe的組合。這種情況下,即便是5個datanode節點有2個datanode宕機了,另外3個datanode也能通過校驗碼計算完成剩餘2個節點的數據,這就是利用糾刪碼技術實現數據冗餘的原理。
通過這種方式,我們就比傳統2副本50%,3副本33.3%的多副本模式要省空間,EC中2+1可以達到66.7%的磁碟利用率,例子是3+2可以達到60%的磁碟利用率
但是其問題是特別消耗CPU計算,上面那種讀取情況,五分之三的讀取數據條時間都要進行校驗碼計算。因此可以利用Intel CPU推出的ISA-L底層函數庫專門用於提升校糾刪碼演算法的編解碼性能。通常情況下,糾刪碼用於冷數據的冗餘,也就是不經常訪問,但又必須聯機存儲以備查詢的數據。除了磁碟利用率,多副本方式用空間換效率的方式肯定是最好,沒什麼問題。