HDFS(Hadoop Distributed File System)
(1) HDFS--Hadoop分布式文件存儲系統
源自於Google的GFS論文,HDFS是GFS的克隆版
HDFS是Hadoop中數據存儲和管理的基礎
他是一個高容錯的系統,能夠自動解決硬件故障,eg:硬盤損壞,HDFS可以自動修復,可以運行於低成本的通用硬件上(低廉的硬盤,4TB是1200元左右)
一次寫入多次讀取,不支持修改操作,數據按塊切分(按128M切塊),按位存儲(就近原則)
(2) HDFS底層架構 - 分布式文件存儲系統
基於物理層存儲的分布式(用多台虛擬機來存儲咱們的存在)
基於客戶端/服務器模式
通常情況下HDFS都會提供容錯和備份機制
通常情況下:HDFS都是基於本地系統的文件存儲系統
(3) 分布式文件系統的特點(優缺點)
優點:
高可靠:
按位存儲,數據分配就近原則,會把數據分配到離他最近的DataNode,所以值得人們信賴
高擴展:
集群節點可以根據業務需求隨時擴展和縮減
高效性:
可以在各個集群集群節點之間動態的移動數據,並且保證集群間各節點之間的動態平衡,因此處理速度非常快
高容錯:
Hadoop能夠自動保存多個副本(默認3份,可修改),並且能夠將失敗的任務自動重新分配,解決硬件故障
成本低:
不適合高效存儲大量小文件
不適合低延遲的數據訪問
不支持多用戶的寫入和修改操作,支持單用戶的寫入
(4) HDFS基本概念
HDFS是一個分布式文件存儲系統(NDFS、GFS)
HDFS是用Java語言實現的、分布式的、可擴展的文件系統
HDFS是Hadoop的三大核心和四大模塊之一
HDFS主要應用於海量數據的存儲
HDFS是*nix(eg:Linux,Unix)
(5) HDFS的前提和設計目標
硬件問題
錯誤檢測和快速、自動的恢復是HDFS最核心的架構目標
存儲超大文件,存儲量可以達到PB、EB級別(單個文件一般至少是百MB以上)
數據訪問:流式訪問(不支持隨機訪問)
HDFS的簡單一致性模型:
HDFS需要對它的應用程序實行一次寫入、多次讀取的訪問模式
(6) HDFS的基本概念
HDFS的基本存儲單位:塊,塊是最小的數據讀寫單位
Hadoop1.0*默認存儲塊大小:64M
Hadoop2.0*默認存儲塊大小:128M
塊大小可以在配置文件hdfs-site.xml修改(1.0參數dfs.block.size/2.0參數dfs.blocksize)
塊的默認單位:byte
每個塊都有自己的全局(唯一)ID
以塊為單位在集群服務器上分配存儲
塊的好處:
一個文件的大小可以大於集群中任一磁盤的容量
塊適合於數據備份,通過了容錯能力和可用性
(7) HDFS 底層架構
NameNode:
集群的老大,主節點,存放元數據(Metedata)信息
元數據:命名空間,塊的生成時間,塊的大小,文件目錄,最后訪問時間等。。。
記錄每一條數據塊在各個DataNode上的位置和副本信息
協調客戶端對文件的訪問
NameNode使用事物日志(EditsLog)記錄元數據的變化信息,使用映像文件(FsImageLog)來存儲系統的命名空間,包括:文件映射、文件屬性等;
通說檢查點(Checkpoint)更新映像文件
SecondaryNameNode:
NameNode的小秘書,排行老二,協助NameNode
是NameNode的備份,實質上相當於虛擬機的快照
盡量不要把SecondaryNameNode和NameNode放在同一台機器上
DataNode:
小弟,負責存儲數據的
一次寫入,多次讀取(不支持數據修改操作)
數據文件是以塊存儲的
數據塊盡量分布在不同節點的不同DataNode上(保證讀取效率大大提升)
(8) HDFS讀文件流程
-
先通過客戶端調用FileSyStem對象的.open()方法打開HDFS中需要讀取的文件
-
FileSyStem通過遠程協議調用NameNode,確定要訪問的文件的數據塊的位置;NameNode返回一個含有數據塊的“元數據”信息(即文件的基本信息);然后,DataNode按照NameNode定義的距離值進行排序,如果客戶端本身就是一個DataNode,那么會優先從本地的DataNode節點上進行數據讀取返回一個InputStream給客戶端,讓其從FSDataInputStream中讀取數據,FSDataInputStream接着包裝一個DInputStream,用來用來管理DataNode和NameNode的I/O
-
NameNode向客戶端返回一個包含數據塊信息的地址,客戶端會根據創建一個FSDataInputStream,開始對數據進行讀取
-
FSDataInputStream根據開始時候存放的位置,連接到離它最近的DataNode,對其上數據進行從頭讀取操作。讀取過程中客戶端會反復調 用.read()方法,以I/O的(流式方式)從DataNode上訪問讀取數據
-
當讀取到Block的最后一塊時,FSDataInputStream會關閉掉當前DataNode的連接,然后查找能夠讀取的下一個Block所在的距離當前最近的DataNode
-
讀取完之后調用.close()方法,關閉FSDataInputStream8
(9) HDFS寫文件流程
-
客戶端調用FileSyStem的.create()方法來請求創建文件
-
FileSyStem通過NameNode發送請求,創建一個新文件,但此時並不關聯其它任何數據塊。NameNode進行很多檢查保證不存在要創建文件已經在與HDFS系統當中,同時檢查是否有相應的權限來創建這個文件。如果這些檢查都已完成,那么NameNode就會記錄下來這個新建的文件的信息。FileSyStem就返回一個FSDataOutputStream給客戶端讓他來寫數據。和讀的情況一樣,FSDataOutputStream將會包裝一個DFSOutputStream用於和DataNode和NameNode進行通訊的。一旦文件創建失敗,客戶端會接收到一個IOException,表示文件創建失敗,停止后續的所有任務
-
客戶端開始寫數據。FSDataOutputStream把要寫入的數據分成塊的形式,將其寫入到隊列中。其中的數據有DataStream讀取(DataStream的職責:讓NameNode分配新的塊--通過找到合適的DataNode來存儲備份的副本數據)這些DataNode組成一條流水線,假設是一個三級流水線,那么里面含有三個節點。此時DataStream把數據首先寫入到離他最近的DataNode上(第一個節點);然后由第一個節點將數據塊寫入到第二個節點,第二個節點繼續把數據塊傳送到第三個節點上
-
FSDataOutputStream維護了一個內部關於write packet的隊列,里面存放了等待DataNode確認無誤的packets信息。這個隊列稱為等待隊列。一個packet的信息被移出本隊列並且當packet流水線中的所有節點確認無誤
-
當完成數據寫入操作后,客戶端會調用.close()方法,在通知NameNode它些數據完成之前,這個方法將Flush(刷新)殘留的packets,並且等待信息確認,NameNode已經知道了文件由哪些數據塊,通過DataStream詢問數據塊的分配,所以它在返回成功之前必須要完成配置文件中配置的最小副本數的復制操作
(10) HDFS-可靠性
按位存儲 -- 就近原則
(11) HDFS -- 容錯率
冗(rong)余副本策略
可以在hdfs-site中指定副本數
所有的數據塊都有副本數
DataNode啟動時便利本地文件系統,產生一份hdfs數據塊和本地文件系統對應的數據隊列進行數據效驗,然后匯報給NameNode,NameNode負責管理
(12) HDFS的機架策略
集群的節點一般是放在不同的機架上,機架之間帶寬要比機架內帶寬要小(這樣做的話傳輸速度)
默認一個機架內存兩個副本,然后再在另一個機架存放一個副本,這樣可以防止機架失效數據的丟失,同時他也能夠提高帶寬利用率
0.17版之前
默認存3個副本
第一個副本放在與客戶端同一個機架的距離最近的機器中
第二個副本放在同一個機架
第三個副本放到不同機架的某一設備中
0.17版之后
默認存3個副本
第一個副本放在與客戶端同一個機架的機器中
第二個 副本放到不同機架的某一設備中
第三個副本放到與第二個副本同一機架的不同設備中
(13) 心跳機制
心跳 3秒一次
塊報告 5分鍾一次
判斷DataNode是否死亡
10*3+2*5+60=630秒
NameNode周期性從DataNode接收心跳報告(3s)和塊報告(5min)《用來監控集群狀態;如果出現錯誤 -- 自動修復
NameNode根據塊報告驗證元數據信息
沒有按時發送心跳報告的DataNode,會被NameNode標記為死亡狀態(宕《dang》機),不會再給DataNode分配任何I/O請求,如果DataNode失效(死亡或者假死)了,NameNode發現DataNode的副本數降低,低於之前設定的副本因子值(副本數),NameNode在檢測出這些數據塊丟失之后會在何時的時間自動修復
自動修復數據的原因:
數據副本本身損壞,磁盤故障,修改系統配文件導致副本因子增大,斷電等等
(14) 安全模式(SafeInMode)
NameNode啟動的時候會先經過一個"安全模式"(保證數據安全)
安全模式下不會產生數據寫入操作,因為NameNode驗證數據,不支持此操作;支持讀取
在此階段NameNode收集各個DataNode節點的報告,當數據塊的最小副本數=配置文件中設置的值時,認為他是“安全式”
此時退出安全模式,才可以進行數據寫入操作
當檢測到副本數不足的數據塊時,該數據塊會被HDFS自動復制直到達到配置文件中設置的最小副本數時停止復制
安全模式(SadeInMode)下了可以進行的操作:
只能夠查詢,不支持任何對於數據改動(增加,刪除)
如何進入安全模式?
進入| 離開 | 下載
hdfs dfsadmin -safemode enter|leave|get
進入時的情景:
-
NameNode啟動過程中進入
-
手動進入 hdfs dfsadmin -safemode enter
-
閥值計算公式:已經啟動的DataNode節點數 / 總數、
閥值為1的進入安全模式
<0 永遠不安全
0.999和1之間 離開安全模式
0~0.999之間 處於安全模式
(15) HDFS的校驗和
HDFS的客戶端軟件實現了對於HDFS文件內容的效驗和(Chechsum)的檢查(提高可靠性)
在文件創建時(調用。creat()),會計算出每個數據塊的校驗和
校驗和會作為一個單獨的隱藏文件保存在命名空間NameSpace下
獲取文件時會檢查數據塊對應的校驗和是否和隱藏文件(NameSpace下的文件)相同,值相同數據塊未發生丟失,值不同數據塊丟失,如果損壞或丟失NameNode會自動修復數據塊
正在讀取數據時發生丟失,不會進行數據修復,不影響數據讀取,可以正常操作
(16) 回收站(類似於windows的回收站,防止誤刪除操作)
刪除文件時,實際上是吧他放入了回收站(trash)
如果誤刪除文件可以進行還原
可以在集群配置文件中設置一個時間閥值,當回收站的文件存放時間達到此時間閥值時會自動清空,徹底刪除文件,並且徹底釋放原來文件占用的DataNode節點中的數據塊
默認是關閉狀態,可以通過core-site.xml添加fs.trash.interval來打開並配置時間閥值,時間以分鍾為單位
(17) 元數據 -- 保護
影響文件和事物日志是NameNode的核心數據
NameNode會因為副本數的增加而大大降低它的處理速度,但是可以增加它的安全性(即可靠性)
Hadoop1.0*中NameNode依然只有一個,NameNode死掉之后必須手動啟動
Hadoop2.0*中集群配置高可用,使其擁有多個NameNode,一個處於Active狀態的NameNode節點死掉之后,HA會自動通過SecondaryNameNode啟動處於StandBy(准備)狀態的NameNode,集群可以正常運行
Hadoop3.0*中擁有多個NameNode,無需進行高可用HA集群配置,StandBy狀態的NameNode立刻自動切換為Active狀態
(18) HDFS常用命令
hadoop/hdfs/yarn fs -cmd <args>
1)文件操作
列出hdfs文件系統中根目錄
hdfs dfs -ls / //列出hdfs下的二級目錄
hdfs dfs -ls -R / //會列出hdfs的所有文件詳細信息
2)上傳文件(hdfs測試命令)
hadoop/hdfs/yarn dfs -put ./test1 ./test
|上傳文件路徑 目標位置路徑
<local src><hdfs src>
3)將hdfs的文件下載到本地並且重名
hadoop/hdfs/yarn dfs -get in getin(in:下載文件的地址 getin:下載下來的文件放在的地址)
<hdfs src> <local src>
先是hdfs文件路徑,后是本地文件路徑
4)copyToLocal命令 復制
hdfs dfs -copyToLocal <hdfs src> <local src>
作用與-get命令一樣
5)copyFromLocal命令 復制
hdfs dfs -copyFromLocal <local src><hdfs src>
作用與-put命令一樣
moveFromLocal 移動
hdfs dfs -moveFromLocal <local src><hdfs src>
6)刪除文檔
hdfs dfs -rmr <hdfs file>
hdfs dfs -rm
hdfs dfs -rm -r
7)查看文件內容
hdfs dfs -cat 文件
8)建目錄
hdfs dfs -mkdir 目錄名
建立多級目錄時父目錄不存在會報錯,目錄需要一級一級創建
9)合並多個文件
hdfs dfs -getmerge 多個文件路徑空格隔開 合並之后文件名
10)執行基本信息
hdfs dfsadmin -report
11)進入/查看/退出安全模式
hdfs dfsadmin -safemode enter|get |leave
12)添加節點
start-all.sh
13)負載均衡
start-balancer.sh
掃碼關注,一起學習進步,回復'分享',會有驚喜等着你~
