❶ 第三章 大數據存儲
一,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主要由哪些功能模塊構成
Hadoop分布式文件系統(HDFS)被設計成適合運行在通用硬體(commodity hardware)上的分布式文件系統。它和現有的分布式文件系統有很多共同點。但同時,它和其他的分布式文件系統的區別也是很明顯的。HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS放寬了一部分POSIX約束,來實現流式讀取文件系統數據的目的。HDFS在最開始是作為Apache Nutch搜索引擎項目的基礎架構而開發的。HDFS是Apache Hadoop Core項目的一部分。
Hadoop分布式文件系統架構
1 NameNode(名稱節點)
HDFS命名空間採用層次化(樹狀——譯者注)的結構存放文件和目錄。
2 映像和日誌
Inode和定義metadata的系統文件塊列表統稱為Image(映像).NameNode將整個命名空間映像保存在RAM中。而映像的持久化記錄則保存在NameNode的本地文件系統中,該持久化記錄被稱為Checkpoint(檢查點)。NameNode還會記錄HDFS中寫入的操作,並將其存入一個記錄文件,存放在本地文件系統中,這個記錄文件被叫做Journal(日誌)。
3 數據節點
DataNode上的每一個塊(block)副本都由兩個本地文件系統上的文件共同表示。其中一個文件包含了塊(block)本身所需包含的數據,另一個文件則記錄了該塊的元數據,包括塊所含數據大小和文件生成時間戳。數據文件的大小等於該塊(block)的真實大小,而不是像傳統的文件系統一樣,需要用額外的存儲空間湊成完整的塊。因此,如果一個塊里只需要一半的空間存儲數據,那麼就只需要在本地系統上分配半塊的存儲空間即可。
4 HDFS客戶端
用戶應用程序通過HDFS客戶端連接到HDFS文件系統,通過庫文件可導出HDFS文件系統的介面。像很多傳統的文件系統一樣,HDFS支持文件的讀、寫和刪除操作,還支持對目錄的創建和刪除操作。與傳統的文件系統不同的是,HDFS提供一個API用以暴露文件塊的位置。這個功能允許應用程序。
5 檢查點節點
HDFS中的NameNode節點,除了其主要職責是相應客戶端請求以外,還能夠有選擇地扮演一到兩個其他的角色,例如做檢查點節點或者備份節點。該角色是在節點啟動的時候特有的。
6 備份節點
HDFS的備份節點是最近在加入系統的一項特色功能。就像CheckpintNode一樣,備份節點能夠定期創建檢查點,但是不同的是,備份節點一直保存在內存中,隨著文件系統命名空間的映像更新和不斷更新,並與NameNode的狀態隨時保持同步。
7 系統更新和文件系統快照
在軟體更新的過程中,由於軟體的bug或者人為操作的失誤,文件系統損壞的幾率會隨之提升。在HDFS中創建系統快照的目的,就在於把系統升級過程中可能對數據造成的隱患降到最低。快照機制讓系統管理員將當前系統狀態持久化到文件系統中,這樣以來,如果系統升級後出現了數據丟失或者損壞,便有機會進行回滾操作,將HDFS的命名空間和存儲狀態恢復到系統快照進行的時刻。
❸ HDFS是由哪些部分組成
HDFS命名空間採用層次化(樹狀——譯者注)的結構存放文件和目錄。文件和目版錄用NameNode上的inodes表示。Inode記錄了許可權,權修改和訪問時間,命名空間,磁碟容量等屬性。文件內容會被分成不同的「大塊」(典型分塊策略是每塊128M,不過用戶可以對每個文件的分塊大小進行選擇)。NameNode負責維護命名空間樹以及與DataNode上文件分塊的映射關系。目前採用的設計結構是,沒一個集群只有一個NameNode,一個NameNode可以對應多個DataNode以及成千上萬的HDFS客戶端。一個DataNode可以同步執行多個應用任務。
❹ 大數據之HDFS
在現代的企業環境中,單機容量往往無法存儲大量數據,需要跨機器存儲。統一管理分布在集群上的文件系統稱為 分布式文件系統 。
HDFS (Hadoop Distributed File System)是 Hadoop 的核心組件之一, 非常適於存儲大型數據 (比如 TB 和 PB), HDFS 使用多台計算機存儲文件,並且提供統一的訪問介面,像是訪問一個普通文件系統一樣使用分布式文件系統。
HDFS是分布式計算中數據存儲管理的基礎,是基於流數據模式訪問和處理超大文件的需求而開發的,可以運行於廉價的商用伺服器上。它所具有的 高容錯、高可靠性、高可擴展性、高獲得性、高吞吐率 等特徵為海量數據提供了不怕故障的存儲,為超大數據集的應用處理帶來了很多便利。
HDFS 具有以下 優點 :
當然 HDFS 也有它的 劣勢 ,並不適合以下場合:
HDFS 採用Master/Slave的架構來存儲數據,這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。
Namenode是整個文件系統的管理節點,負責接收用戶的操作請求。它維護著整個文件系統的目錄樹,文件的元數據信息以及文件到塊的對應關系和塊到節點的對應關系。
Namenode保存了兩個核心的數據結構:
在NameNode啟動的時候,先將fsimage中的文件系統元數據信息載入到內存,然後根據edits中的記錄將內存中的元數據同步到最新狀態;所以,這兩個文件一旦損壞或丟失,將導致整個HDFS文件系統不可用。
為了避免edits文件過大, SecondaryNameNode會按照時間閾值或者大小閾值,周期性的將fsimage和edits合並 ,然後將最新的fsimage推送給NameNode。
並非 NameNode 的熱備。當NameNode 掛掉的時候,它並不能馬上替換 NameNode 並提供服務。其主要任務是輔助 NameNode,定期合並 fsimage和fsedits。
Datanode是實際存儲數據塊的地方,負責執行數據塊的讀/寫操作。
一個數據塊在DataNode以文件存儲在磁碟上,包括兩個文件,一個是數據本身,一個是元數據,包括數據塊的長度,塊數據的校驗和,以及時間戳。
文件劃分成塊,默認大小128M,以快為單位,每個塊有多個副本(默認3個)存儲不同的機器上。
Hadoop2.X默認128M, 小於一個塊的文件,並不會占據整個塊的空間 。Block數據塊大小設置較大的原因:
文件上傳 HDFS 的時候,Client 將文件切分成 一個一個的Block,然後進行存儲。
Client 還提供一些命令來管理 HDFS,比如啟動或者關閉HDFS。
Namenode始終在內存中保存metedata,用於處理「讀請求」,到有「寫請求」到來時,namenode會首 先寫editlog到磁碟,即向edits文件中寫日誌,成功返回後,才會修改內存 ,並且向客戶端返回,Hadoop會維護一個fsimage文件,也就是namenode中metedata的鏡像,但是fsimage不會隨時與namenode內存中的metedata保持一致,而是每隔一段時間通過合並edits文件來更新內容。
HDFS HA(High Availability)是為了解決單點故障問題。
HA集群設置兩個名稱節點,「活躍( Active )」和「待命( Standby )」,兩種名稱節點的狀態同步,可以藉助於一個共享存儲系統來實現,一旦活躍名稱節點出現故障,就可以立即切換到待命名稱節點。
為了保證讀寫數據一致性,HDFS集群設計為只能有一個狀態為Active的NameNode,但這種設計存在單點故障問題,官方提供了兩種解決方案:
通過增加一個Secondary NameNode節點,處於Standby的狀態,與Active的NameNode同時運行。當Active的節點出現故障時,切換到Secondary節點。
為了保證Secondary節點能夠隨時頂替上去,Standby節點需要定時同步Active節點的事務日誌來更新本地的文件系統目錄樹信息,同時DataNode需要配置所有NameNode的位置,並向所有狀態的NameNode發送塊列表信息和心跳。
同步事務日誌來更新目錄樹由JournalNode的守護進程來完成,簡稱為QJM,一個NameNode對應一個QJM進程,當Active節點執行任何命名空間文件目錄樹修改時,它會將修改記錄持久化到大多數QJM中,Standby節點從QJM中監聽並讀取編輯事務日誌內容,並將編輯日誌應用到自己的命名空間。發生故障轉移時,Standby節點將確保在將自身提升為Active狀態之前,從QJM讀取所有編輯內容。
注意,QJM只是實現了數據的備份,當Active節點發送故障時,需要手工提升Standby節點為Active節點。如果要實現NameNode故障自動轉移,則需要配套ZKFC組件來實現,ZKFC也是獨立運行的一個守護進程,基於zookeeper來實現選舉和自動故障轉移。
雖然HDFS HA解決了「單點故障」問題,但是在系統擴展性、整體性能和隔離性方面仍然存在問題:
HDFS HA本質上還是單名稱節點。HDFS聯邦可以解決以上三個方面問題。
在HDFS聯邦中,設計了多個相互獨立的NN,使得HDFS的命名服務能夠水平擴展,這些NN分別進行各自命名空間和塊的管理,不需要彼此協調。每個DN要向集群中所有的NN注冊,並周期性的發送心跳信息和塊信息,報告自己的狀態。
HDFS聯邦擁有多個獨立的命名空間,其中,每一個命名空間管理屬於自己的一組塊,這些屬於同一個命名空間的塊組成一個「塊池」。每個DN會為多個塊池提供塊的存儲,塊池中的各個塊實際上是存儲在不同DN中的。
❺ HDFS由什麼組成
大數據平台包含了採集層、存儲層、計算層和應用層,是一個復雜的IT系統,需要學會Hadoop等分布式系統的開發技能。
1.1採集層:Sqoop可用來採集導入傳統關系型資料庫的數據、Flume對於日誌型數據採集,另外使用Python一類的語言開發網路爬蟲獲取網路數據;
1.2儲存層:分布式文件系統HDFS最為常用;採用了主從(Master/Slave)結構模型,一個HDFS集群是由一個NameNode和若干個DataNode組成的。其中NameNode作為主伺服器,管理文件系統的命名空間和客戶端對文件的訪問操作;集群中的DataNode管理存儲的數據。
1.3計算層:有不同的計算框架可以選擇,常見的如MapRece、Spark等,一般來講,如果能使用計算框架的「原生語言」,運算效率會最高(MapRece的原生支持Java,而Spark原生支持Scala);
1.4應用層:包括結果數據的可視化、交互界面開發以及應用管理工具的開發等,更多的用到Java、Python等通用IT開發前端、後端的能力;
❻ 大數據原理及技術—HDFS
4V:數據量大(volume)、數據類型繁多(variety)、處理速度快(velocity)、價值密度低(value)
Hadoop 是一個開源分布式計算平台,提供了系統底層細節透明的分布式架構基礎。Hadoop的核心是分布式文件系統HDFS和MapRece。Hadoop採用分布式存儲和分布式處理兩大核心技術,其設計目標是可以高效穩定運行在廉價的計算機集群上(低成本),可以擴展到數以千計計算機節點,從而可以採用冗餘數據存儲方式,當一個節點數據出現問題,其他副本可以提供服務。
同普通文件系統,分布式文件系統採用塊(磁碟塊)的概念,是文件系統讀寫操作的最小單位,塊是數據讀寫的基本單元。HDFS默認一個塊大小是64MB。
由計算機集群多個節點構成,兩類節點:主節點(master)/名稱節點(name)、從節點(slave)/數據節點(data)。名稱節點負責文件(包括數據節點)和目錄的創建、刪除和重命名等,同時管理數據節點和文件塊的映射關系,因此客戶端只有訪問名稱節點才能找到請求的文件塊所在位置,進而找到相應位置讀取文件塊。數據節點負責數據的存儲和讀取。存儲時,名稱節點分配存儲位置;讀取時,從名稱節點獲取數據節點文件塊,再由客戶端寫入或訪問數據。
客戶端需要訪問一個文件時,首先從名稱節點獲得這個文件的數據塊的位置列表,然後根據列表獲取實際存儲各個數據塊的數據節點的位置,最後數據節點根據數據塊信息在本地文件系統找到對應文件,並把數據返回客戶端。
採用主從(master/slave)結構模型,一個HDFS集群包括一個名稱節點和若干個數據節點。名稱節點作為中心伺服器,負責管理文件系統的命名空間(命名空間包括目錄、文件和塊)和客戶端對文件的訪問;數據節點負責處理文件系統客戶端的讀寫請求,在名稱節點統一調度下進行數據塊創建、刪除、復制等操作。每個數據節點會周期性向名稱節點發送「心跳」信息,報告自己的狀態,沒有按時發送則會被標記為「宕機」。
冗餘存儲:採取多副本方式存儲數據,因此保證了系統的容錯性和可用性。
❼ Hadoop文檔(2.9.2) - HDFS架構
Hadoop分布式文件系統(HDFS)是一種運行在通用硬體上的分布式文件系統。它與傳統的分布式文件系統有很多相似之處,但是也有顯著的不同。HDFS是高容錯的,可以部署在低成本硬體上。HDFS提供了對應用數據的高吞吐量訪問,適用於具有大數據集的應用。HDFS為了流數據訪問放鬆了一些POSIX的限制。
HDFS是主從結構。一個HDFS集群由一個NameNode和一組DataNode組成。NameNode是主伺服器,負責管理文件系統命名空間以及客戶端對文件的訪問。DataNode通常每個節點一個,負責管理存儲。HDFS對外暴露了一個文件系統命名空間並允許用戶數據作為文件存儲。在內部實現上,一個文件會被分割成一個或多個block,這些block存儲在一組DataNode上。NameNode負責執行文件系統命名空間操作,例如打開,關閉,重命名文件和目錄等。此外NameNode還維護著block和DataNode之間的映射關系。DataNode負責處理來自客戶端的讀寫請求,並根據NameNode的指令創建,刪除,備份block。
NameNode和DataNode都是運行在通用機器上的軟體。這些機器通常使用Linux系統。HDFS使用Java構建,任何支持Java的機器都可以運行NameNode和DataNode。一種典型的集群部署方式是使用一台機器運行NameNode,其它機器每台運行一個DataNode實例。
HDFS使用傳統的分層文件結構。用戶可以創建目錄並在目錄下存儲文件。文件系統命名空間結構與傳統文件系統類似,用戶可以創建,刪除文件,將文件從一個目錄移動到另一個目錄,重命名文件。HDFS支持用戶限額和訪問許可權。
NameNode維護整個文件系統命名空間,它會記錄任何對命名空間的修改。應用程序可以指定HDFS中文件的備份數量。文件的拷貝數稱為該文件的備份因子。這個信息也存儲在NameNode中。
HDFS可以跨機器存儲海量文件。每個文件分成一個block的序列存儲。為了容錯,文件的block會被備份。每個文件的block大小和備份因子都是可配置的。
文件中所有block的大小是相等的(除了最後一個),而對append和hsync提供可變長block支持後,用戶可以直接創建一個新block,不必繼續填充最後一個block。
應用程序可以指定文件的備份數。備份因子可在文件創建時指定,也可以稍後修改。HDFS的文件都是一次寫入的(除了append和truncate),並且任何時候都只有一個寫入器。
NameNode決定如何備份block。它周期性的接收來自DataNode的心跳檢測和block報表。收到心跳檢測說明DataNode工作正常,block報表包含該DataNode上的所有block。
備份文件的位置對HDFS的可用性和性能至關重要。對備份的優化讓HDFS從眾多分布式系統中脫穎而出。這個工作需要大量的優化和經驗。機架感知備份放置策略的目的是提高數據的可靠性,可用性和網路帶寬利用率。目前的備份放置策略實現是這個方向上的第一步。短期目標是在生產環境上對其進行驗證,更多的了解它的行為,為測試和研究更復雜的策略奠定基礎。
大型HDFS集群的機器通常隸屬於多個機架。兩個不同機架上的節點進行通信必須通過交換機。一般來說,同一機架機器之間的網路帶寬要優於不同機架機器間的網路帶寬。
NameNode通過Hadoop Rack Awareness進程確定每個DataNode所屬的機架ID。一個簡單但是並非最優的策略是將備份放置在獨立的機架上。這種策略可以避免機架故障時丟失數據,讀數據時也可以利用多個機架的網路帶寬。這種策略在集群中平均分配備份文件,這樣組件發生故障時可以平衡負載。但是這種策略會增加寫入成本,因為數據需要跨機架傳輸。
最常見的情況,備份因子是3。HDFS的放置策略是:如果寫入器位於DataNode上,則將副本放置在本地計算機,否則隨機選擇一個DataNode,另一個副本放置在另一個遠程機架的節點上,最後一個副本放在同一個遠程機架的另一個節點上。這種策略減少了機架間的寫入流量,從而提高寫性能。機架發生故障的幾率遠小於節點故障幾率。這種策略並不影響數據可靠性和可用性,但是它確實減少了讀操作時的聚合網路帶寬,因為一個block被放置到兩個機架上而不是三個。這種策略的文件副本並不是均勻的分布在所有機架上,副本的三分之一位於一個節點,剩下的三分之二位於另一個機架上。這種策略可以提高寫性能,而不會影響數據可靠性和讀性能。
如果備份因子大於3,那麼第四個和之後的副本隨機放置,同時要保證副本數量不能超過機架的上限(公式: (replicas - 1) / racks + 2 )。
由於DataNode不能放置同一個block的多個副本,所以最大備份因子就是最大DataNode數。
在提供了存儲類型和存儲策略的支持之後,除了機架感知,NameNode放置副本時也會考慮放置策略。NameNode首先根據機架感知選擇節點,然後根據備份文件的放置策略檢查該節點的存儲類型,如果該候選節點沒有要求的存儲類型,NameNode會查找下一個節點。如果第一輪沒有找到足夠的節點放置備份,NameNode會使用後備存儲類型開始第二輪查找。
目前,副本放置策略依然在開發中。
為了減少帶寬消耗和讀延遲,HDFS會嘗試找尋一個離讀請求最近的副本。如果讀請求節點所在機架有這樣一個副本,HDFS就優先使用這個副本。如果HDFS集群跨越多個數據中心,則本地數據中心的副本優先於遠程副本。
啟動HDFS時,NameNode會進入一種稱為安全模式的特殊狀態。安全模式下數據block無法備份。NameNode會從DataNode接收心跳檢測和block報表。block報表包含該DataNode下所有數據block的列表信息。每個block都有一個指定的最小備份數。只有block的最小備份數登記到NameNode中後,block才可以備份。備份登記結束後,NameNode退出安全模式。這是如果還有block不滿足最小備份數的條件,NameNode才開始備份這些block。
HDFS命名空間由NameNode保存,NameNode使用一個稱為EditLog的事務日誌記錄對文件系統元數據的所有更改。例如,創建一個新文件會在EditLog中插入一條對應記錄,同樣的,修改文件備份因子也會插入一條記錄。NameNode使用本地文件存儲EditLog。整個文件系統命名空間,包括文件與block之間的映射關系,文件系統數據等,都保存在FsImage文件中。
NameNode在內存中維護文件系統命名空間和文件block映射關系的鏡像。當NameNode啟動,或者某個閾值觸發了檢查點時,NameNode從磁碟上讀取FsImage和EditLog的內容,將所有EditLog中的事務操作應用到FsImage的內存鏡像中,然後在磁碟上生成一個全新的FsImage。之後可以截斷EditLog,因為所有事務都已持久化到FsImage。這個過程稱為檢查點。檢查點的目的是通過獲取文件系統元數據的快照並保存到FsImage來保證HDFS文件系統元數據的一致性。讀取FsImage可能很快,但是持續編輯FsImage就不同了。因此我們將操作記錄到EditLog中,而不是直接修改FsImage。在檢查點期間,所有EditLog操作應用到FsImage。檢查點可以按周期觸發( dfs.namenode.checkpoint.period ),也可以按事務數觸發( dfs.namenode.checkpoint.txns )。如果兩個屬性都設置了,第一個滿足的閾值會觸發檢查點。
DataNode在本地文件系統中存儲HDFS數據。DataNode對HDFS文件一無所知,它以block為單位存儲HDFS數據。DataNode不會在同一個目錄下保存所有文件。相反,它使用啟發式方法來確定每個目錄的最佳文件數,並適時創建子目錄。在同一個目錄下創建所有文件並不是最佳選擇,因為本地文件系統可能無法支持一個目錄下的大量文件。DataNode啟動時,它會掃描整個本地文件系統,生成一個本地文件與數據block之間的關系列表,將其發送給NameNode,這個列表稱為block報告。
所有HDFS通信協議都構建在TCP/IP協議之上。客戶端通過TCP埠與NameNode建立連接,它使用ClientProtocol與NameNode交互。DataNode使用DataProtocol與NameNode交互。一個RPC抽象封裝了客戶端協議和DataNode協議。NameNode從不初始化任何RPC,它只是響應來自的客戶端和DataNode的請求。
HDFS的主要目標是即使出現故障也可以可靠的存儲數據。三種常見的故障分別是:NameNode故障,DataNode故障和網路分區。
DataNode周期性的發送心跳檢測給NameNode。網路分區可能導致某些DataNode無法連接NameNode。NameNode無法收到DataNode的心跳檢測後,它會把這樣的DataNode標記為dead,並不在發送新的I/O請求。注冊到死亡DataNode上的數據對HDFS來說不再可用,也會導致某些block的備份數少於文件指定的最小備份數。NameNode持續追蹤block的備份情況並在必要時初始化備份操作。重備份的原因是多種多樣的:DataNode不可用,某個備份文件損壞,DataNode磁碟故障,或者文件的備份因子增大。
為了避免DataNode狀態抖動引起的備份風暴,標記DataNode死亡的超時時間設置的很長(默認超過10分鍾)。用戶可以設置一個更短的時間將DataNode標記為陳舊(stale),這樣可以避免對性能敏感的工作負載的陳舊DataNode的讀寫操作。
HDFS架構與數據重平衡scheme兼容。scheme可以在DataNode的磁碟空間低於某個閾值時將數據移動到另一個DataNode上。如果對某個文件的需求特別高,scheme還可以動態創建額外的副本並平衡到整個集群中。這些數據平衡scheme還未實現。
從DataNode中讀取的block可能是損壞的。損壞的原因有多種:磁碟故障,網路故障,或者軟體問題。HDFS客戶端會對文件內容進行校驗和檢查。當客戶端創建一個HDFS文件時,它會計算出文件所有block的校驗和並保存在同一個命名空間的一個獨立的隱藏文件中。當客戶單檢索文件時還要檢查對應校驗和文件中的值。如果校驗和不匹配,客戶端會嘗試該block其它節點上的副本。
FsImage和EditLog是HDFS的核心數據結構。如果它們發生損壞,HDFS就無法使用了。因此,可以通過配置讓NameNode維護多個FsImage和EditLog的拷貝。對兩個文件的修改會同步到所有拷貝中。這種同步操作會降低NameNode的TPS,但是這種犧牲是可接受的,因為HDFS是數據密集,不是元數據密集。NameNode重啟時,它會選擇最一致的FsImage和EditLog使用。
另一種減低故障的辦法是使用HA。
(略)
HDFS的目的是支持大型文件。HDFS支持一次寫入多次讀取。一個典型的block大小是128MB。因此,HDFS文件按照128MB的大小分割,每個block可能分布在不同的節點上。
客戶端向HDFS文件寫入數據時,如果備份因子是三,NameNode使用備份目標選擇演算法檢索出一組DataNode。這個列表是可以存儲副本的DataNode。客戶端先向第一個DataNode寫入數據,DataNode接收數據並將數據傳輸到列表中的第二個DataNode。第二個DataNode開始接收數據並繼續傳輸數據到第三個DataNode。這樣,數據通過管道從一個DataNode傳輸到下一個。
(略)
如果開啟了trash配置,從FS shell中刪除的文件並不會立刻從HDFS中刪除,HDFS將它移動到一個trash目錄(每個用戶都有自己的trash目錄, /user/<username>/.Trash )。只要文件還在trash目錄中就可以快速恢復。
最近刪除的文件移動到 /user/<username>/.Trash/Current 目錄中,每隔一段時間,HDFS會為這些文件創建檢查點文件( /user/<username>/.Trash/<date> )並刪除舊檢查點文件。
如果trash中的文件過期了,NameNode將這些文件從命名空間中刪除。與文件關聯的block被釋放。刪除文件和空間釋放之間可能會有延遲。
下面是一個例子,首先創建兩個文件:
然後刪除test1,該文件會被移到Trash目錄:
接著跳過Trash刪除test2:
現在可以查看Trash目錄:
文件的備份因子降低後,NameNode選擇可以刪除的副本,在下次心跳檢測時把信息發送給DataNode,之後DataNode刪除block並釋放空間。