學習Hadoop——HDFS 檔案系統管理細說
HDFS 有著高容錯的特點,被設計用來部署在低廉的硬體上,它能夠提供高吞吐量來訪問應用程式·的資料,適合那些有著超大資料集的應用程式。為了做到可靠性,HDFS建立了多份資料塊的副本,並將它們放置在伺服器的群的計算節點中,Mapreduce 可以在它們所在的節點上處理這些資料。
HDFS 的缺點與不足: 運維成本:如果採用" 一個框架,一個叢集” 的模式,則可以需要多個管理員管理這些叢集,進而增加運維成本,而共享模式通常需要少數管理員完成多個框架的統一管理,比如毫秒級的訪問要求不適合小檔案存取。 資料共享:隨著資料量的暴增,跨叢集間的資料移動不僅需花費時間,且硬體成本也會大大增加,而共享叢集 模式,可讓多種框架共享資料和硬體資源,將大大減少資料移動帶來的成本:
HDFS的基本概念
HDFS 特點
1.適合執行在通用硬體,錯誤監測以及快速自動的恢復能力較好;
2.支援大檔案儲存,能提供比較高的資料傳輸頻寬與資料訪問吞吐量;
3.計算環境量移動到資料儲存的地方,而不是把資料傳輸到計算環境的地方,有效減少網路的擁塞,提供系統的吞吐量
HDFS 適用場景
1.儲存並管理PB資料;
2.適合處理非結構結構化資料;
3.注重資料處理的吞吐量
4.應用模式:write-once-read-many 儲存模式
HDFS不適用場景
1.低時間延遲資料訪問的應用,例如幾十秒範圍
原因:HDFS 是為高資料吞吐量應用量優化的,這樣是以高時間延遲為底價
2.大量小檔案
原因:NameNode 將檔案系統的元資料儲存在記憶體中,因此檔案系統所能儲存的檔案總數受限於NameNode 記憶體容量。如果每個檔案目錄和資料塊的儲存資訊大約佔150位元組,那麼對於一百萬個檔案,假如每個檔案僅佔用一個數據塊,則就至少需要300MB的記憶體,假設需要儲存幾十億檔案,這時需要的記憶體量將是非常巨大的。
3.多使用者寫入,任意修改檔案:現在hdfs 檔案可能只有一個 writer ,而且寫操作總是寫在檔案末尾
HDFS 資料塊
在傳統的塊儲存介質中,塊是讀寫的最小資料單位(扇區),傳統檔案系統是基於儲存塊進行操作的,為了節省檔案分配表空間,一般會對物理儲存進行整合,大小設定為4096 位元組
HDFS 也使用了塊概念,但是預設大小設定為64 M位元組。HDFS 可針對每個檔案由客戶端指定配置,每個塊有一個自己的全域性ID,HDFS將一個檔案分為一個或者數個塊來儲存,每個塊是一個獨立的儲存單位,以塊為單位在叢集伺服器中分配儲存。
HDFS 體系結構
之前細說過,這裡就不在細說了
NameNode
Namenode 是HDFS的元資料節點,負責檔案系統的名字空間(Namespace) 管理以及客戶端對檔案的訪問。NameNode 負責文 件元資料操作,DataNode 負責處理檔案內容的讀寫操作,跟檔案內容相關得資料流不經過NameNode,資料塊的副本存放在哪 些DataNode 上是由NameNode決定的,讀取檔案時NameNode 會盡量讓使用者先讀取最近的副本,以降低頻寬消耗和讀取延時。
NameNode 全權管理資料塊複製,它週期性從叢集中的每個DataNode 接受心跳訊號和塊狀態狀態。接收到心跳訊號意味著DataNode節點上工作正常。塊狀態報告包含一個該Datanode 上所有資料塊資訊的列表。
NameSpace 和EditsLog
HDFS 支援傳統的層次型檔案組織結構,使用者可以在HDFS上建立目錄,然後將檔案儲存在這些目錄裡。檔案系統名字空間的 層次結構和大多數現有檔案系統類似:使用者可以建立,刪除,移動或者重新命名。NameNode 負責維護檔案系統的名字空間,任 何對檔案系統名稱空間副本的數目稱為檔案系統的副本系數。這個資訊是由Namenode 儲存的。
Datanode
負責所在物理節點的 儲存管理
一次寫入,多次讀取 (不修改)
檔案由資料塊組成, 典型的塊大小是64MB
資料塊儘量散佈道各 個節點
Secondary NameNode
當NameNode 啟動時,它從映像檔案(fsimage)讀取HDFS 的狀態,然後將EditsLog 檔案中的修改應用在記憶體中,接著將新的HDFS 狀態寫入fsimage,後續的正常操作開始於一個空的EditsLog日誌檔案。由於NameNode 僅僅在啟動時候將fsimage 和EditsLog 合併,因此在一個大的叢集上經過一定執行時間後,EditsLog將會非常大,由此帶來的一個副作用就·是在下次NameNode 重新啟動時將會話費很長時間。Secondary NameNode 通常在一個獨立的機器上執行,它的記憶體要求和主NameNode 一樣的。Secondry NameNode 在配置後通過start-dfs.sh 啟動。
Checkpoint Node
配置Checkpoint Node 和Secondry NameNode 類似,前者是後者的替代方式,不同之處在於它週期性將NameNode 的FsImage 和EditsLog 下載本地合併,然後把合併的結果上傳會NameNode,一個NameNode 可以同時配置多個Checkpoint Node
Backup Node
Backup Node 同樣提供上述Checkpoint 的功能,其維持一份NameNode 同步的同步的記憶體對映。Back Node 接受NameNode 的EditsLog,同時還將其內容更新至自己呢記憶體,相當於做了一個Namespace 的備份。
Backup Node 因為是時刻與NameNode 同步的,所以他不需要從NameNode 下載FsImage 和EditLog ,只需要定期把本機上的FsImage 和EditsLog 儲存即可。
對於每個NameNode ,目前只允許配置Backup Node,而且使用Backup Node 模式就不允許登陸Checkpoint Node。
HDFS High Availability
在Hadoop2.0 之前,每個叢集只能有一個NameNode,如果它出現問題就會導致整個叢集癱瘓掉。因此在NameNode 需要有一定的冗餘,通常的做法是把NameNode 配置成Active/Standby, 在Active 失效的時候能立即切換Standby 機上。現階段Active、Standby 直接的同步兩種方式:
JournalNode(JNS)伺服方式:ActiveNode 持續的將EditsLog 寫入JournalNode 伺服程序,而是StandbyNode 則能實時監測並從讀取相關內容同步。
Share NFS Directory 方式:通過掛接一個主從NameNode 節點都擁有讀寫許可權的共享資料夾方式進行同步。Active 一方面不斷將EditsLog 寫入該資料夾,而Standby 澤監視該檔案的同時同步到自己Namespace 中
讀取資料過程
HDFS的可靠性
.冗餘副本策略
.機架策略
心跳機制
.安全模式
.校驗和
.回收站
.元資料保護
.快照機制
冗餘副本策略
可以在hdfs-site.xml中設定複製因子指定副本數量 所有資料塊都有副本 Datanode啟動時,遍歷本地檔案系統,產生一份hdfs資料塊和本地檔案的對應關係列 表(blockreport)彙報給namenode
機架策略
叢集一般放在不同機架上,機架間頻寬要比機架內頻寬要小
HDFS的“機架感知”
一般在本機架存放一個副本,在其它機架再存放別的副本,這樣可以防止機架失效時 丟失資料,也可以提高頻寬利用率
心跳機制
Namenode週期性從datanode接收心跳訊號和塊報告 Namenode根據塊報告驗證元資料
沒有按時傳送心跳的datanode會被標記為宕機,不會再給它任何I/O請求
如果datanode失效造成副本數量下降,並且低於預先設定的閾值,namenode會檢測 出這些資料塊,並在合適的時機進行重新複製
引發重新複製的原因還包括資料副本本身損壞、磁碟錯誤,複製因子被增大等
安全模式
Namenode啟動時會先經過一個“安全模式”階段
安全模式階段不會產生資料寫
在此階段Namenode收集各個datanode的報告,當資料塊達到最小副本數以上時, 會被認為是“安全”的
在一定比例(可設定)的資料塊被確定為“安全”後,再過若干時間,安全模式結束
當檢測到副本數不足的資料塊時,該塊會被複制直到達到最小副本數
校驗和
在檔案創立時,每個資料塊都產生校驗和
校驗和會作為單獨一個隱藏檔案儲存在名稱空間下
客戶端獲取資料時可以檢查校驗和是否相同,從而發現數據塊是否損壞
如果正在讀取的資料塊損壞,則可以繼續讀取其它副本
回收站
刪除檔案時,其實是放入回收站/trash
回收站裡的檔案可以快速恢復
可以設定一個時間閾值,當回收站裡檔案的存放時間超過這個閾值,就被徹底刪除, 並且釋放佔用的資料塊
元資料保護
映像檔案剛和事務日誌是Namenode的核心資料。可以配置為擁有多個副本
副本會降低Namenode的處理速度,但增加安全性
Namenode依然是單點,如果發生故障要手工切換
快照
支援儲存某個時間點的映像,需要時可以使資料重返這個時間點的狀態
Hadoop目前還不支援快照,已經列入開發計劃
HDFS檔案操作
命令列方式 API方式
怎樣新增節點?
在新節點安裝好hadoop
把namenode的有關配置檔案複製到該節點
修改masters和slaves檔案,增加該節點
設定ssh免密碼進出該節點
單獨啟動該節點上的datanode和tasktracker(hadoop-daemon.sh start datanode/tasktracker)
執行start-balancer.sh進行資料負載均衡