1.HDFS概述
1)數據量越來越多,在一個操作系統管轄的范圍存不下了,那么就分配到更多的操作系統管理的磁盤中,但是不方便管理和維護,因此迫切需要一種系統來管理多台機器上的文件,這就 是分布式文件管理系統。
2)是一種允許文件通過網絡在多台主機上分享的文件系統,可讓多機器上的多用戶分享文件和存儲空間。
3)通透性。讓實際上是通過網絡來訪問文件的動作,由程序與用戶看來,就像是訪問本地的磁盤一般。
4)容錯。即使系統中有某些節點宕機,整體來說系統仍然可以持續運作而不會有數據損失【通過副本機制實現】。
5)分布式文件管理系統很多,hdfs只是其中一種,不合適小文件。
2.hdfs架構
NameNode
NameNode是整個文件系統的管理節點。它維護着整個文件系統的文件目錄樹,文件/目錄的元信息和每個文件對應的數據塊列表。接收用戶的操作請求。
文件包括:
fsimage:元數據鏡像文件。存儲某一時段NameNode內存元數據信息。
edits:操作日志文件,namenode啟動后一些新增元信息日志。
fstime:保存最近一次checkpoint的時間
以上這些文件是保存在linux的文件系統中。
hdfs-site.xml的dfs.namenode.name.dir屬性
secondary namenode
DataNode
提供真實文件數據的存儲服務。
文件塊(block):最基本的存儲單位。對於文件內容而言,一個文件的長度大小是size,那么從文件的0偏移開始,按照固定的大小,順序對文件進行划分並編號,划分好的每一個塊稱一個Block。2.0以后HDFS默認Block大小是128MB,以一個256MB文件,共有256/128=2個Block.
hdfs-site.xml中dfs.blocksize屬性
不同於普通文件系統的是,HDFS中,如果一個文件小於一個數據塊的大小,並不占用整個數據塊存儲空間 Replication。多復本。默認是三個。
hdfs-site.xml的dfs.replication屬性
3.HDFS寫數據流程
(1)客戶端通過Distributed FileSystem模塊向NameNode請求上傳文件,NameNode檢查目標文件是否已存在,父目錄是否存在。
(2)NameNode返回是否可以上傳。
(3)客戶端請求第一個 Block上傳到哪幾個DataNode服務器上。
(4)NameNode返回3個DataNode節點,分別為dn1、dn2、dn3。
(5)客戶端通過FSDataOutputStream模塊請求dn1上傳數據,dn1收到請求會繼續調用dn2,然后dn2調用dn3,將這個通信管道建立完成。
(6)dn1、dn2、dn3逐級應答客戶端。
(7)客戶端開始往dn1上傳第一個Block(先從磁盤讀取數據放到一個本地內存緩存),以Packet (64K)為單位,dn1收到一個Packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答隊列等待應答。
(8)當一個Block傳輸完成之后,客戶端再次請求NameNode上傳第二個Block的服務器。(重復執行3-7步)。
4.HDFS讀數據流程
(1)客戶端通過DistributedFileSystem向NameNode請求下載文件,NameNode通過查詢元數據,找到文件塊所在的DataNode地址。
(2)挑選一台DataNode(就近原則,然后隨機)服務器,請求讀取數據。
(3)DataNode開始傳輸數據給客戶端(從磁盤里面讀取數據輸入流,以Packet為單位來做校驗),先讀距離最近的,然后一次讀,串行讀
(4)客戶端以Packet為單位接收,先在本地緩存,然后寫入目標文件。
5. NameNode和SecondaryNameNode工作機制
1)第一階段:NameNode啟動
(1)第一次啟動NameNode格式化后,創建Fsimage和Edits文件。如果不是第一次啟動,直接加載編輯日志和鏡像文件到內存。
(2)客戶端對元數據進行增刪改的請求。
(3)NameNode記錄操作日志,更新滾動日志。
(4)NameNode在內存中對元數據進行增刪改。
2)第二階段:Secondary NameNode工作
通常情況下,SecondaryNameNode每隔一小時執行一次。
[hdfs-default.xml]
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600s</value>
</property>
(1)Secondary NameNode詢問NameNode是否需要CheckPoint。直接帶回NameNode是否檢查結果。
(2)Secondary NameNode請求執行CheckPoint。
(3)NameNode滾動正在寫的Edits日志。
(4)將滾動前的編輯日志和鏡像文件拷貝到Secondary NameNode。
(5)Secondary NameNode加載編輯日志和鏡像文件到內存,並合並。
(6)生成新的鏡像文件fsimage.chkpoint。
(7)拷貝fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage。
6 DataNode工作機制
(1)一個數據塊在DataNode上以文件形式存儲在磁盤上,包括兩個文件,一個是數據本身,一個是元數據包括數據塊的長度,塊數據的校驗和,以及時間戳。
(2)DataNode啟動后向NameNode注冊,通過后,周期性(1小時)的向NameNode上報所有的塊信息。
(3)心跳是每3秒一次,心跳返回結果帶有NameNode給該DataNode的命令如復制塊數據到另一台機器,或刪除某個數據塊。如果超過10分鍾沒有收到某個DataNode的心跳,則認為該 節點不可用。
(4)集群運行中可以安全加入和退出一些機器。