1、概念
hadoop從廣義上說指的是依托于Apache Hadoop項目的整個生態(tài)圈,包括hdfs、spark、sqoop、flume等等。狹義上說就是指的是Apache Hadoop這一個項目?,F(xiàn)階段學習的內(nèi)容以hadoop這一個項目為核心,所以下面的內(nèi)容都基于狹義上的hadoop,其實更準確的描述就是基于HDFS。
2、HDFS框架
??????? HDFS 采用Master/Slave的架構來存儲數(shù)據(jù),這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和SecondaryNameNode.

3、HDFS組成進程簡介
HDFS(Hadoop分布式文件系統(tǒng))包括NameNode、DataNode、SecondaryNode三個進程。?????
?NameNode
??????? NameNode是HDFS的命名空間,里面存儲著整個HDFS的所有文件的元數(shù)據(jù)信息,這些信息都會加載到內(nèi)存中,元數(shù)據(jù)信息分為兩部分,第一部分是文件系統(tǒng)樹及整棵樹內(nèi)所有的文件和目錄,第二部分是每個文件的各個組成塊所在的數(shù)據(jù)節(jié)點信息。第一部分會落地形成文件(命名空間鏡像文件和編輯日志文件)永久保存,第二部分的信息是在HDFS啟動時,DataNode自動報送給NameNode,所以這個不會永久保存。元數(shù)據(jù)格式如下(/test/a.log是在hdfs文件系統(tǒng)中的路徑,3是這個文件的副本數(shù)(副本數(shù)可以通過在配置文件中的配置來修改的)。在hdfs中,文件是進行分塊存儲的,如果文件過大,就要分成多塊存儲,每個塊在文件系統(tǒng)中存儲3個副本,以上圖為例,就是分成blk_1和blk_2兩個塊,每個塊在實際的節(jié)點中有3個副本,比如blk_1的3個副本分別存儲在h0,h1,h3中):

簡單元數(shù)據(jù)存儲邏輯圖(不用較真,只是為了表達為什么元數(shù)據(jù)的存儲邏輯是現(xiàn)在這樣):

DataNode
文件塊( block): 最基本的存儲單位。 對于文件內(nèi)容而言,一個文件的長度大小是size,那么從文件的0偏移開始,按照固定的大小,順序?qū)ξ募M行劃分并編號,劃分好的每一個塊稱一個Block。 HDFS默認Block大小是128MB, 因此,一個256MB文件,共有256/128=2個Block.?
與普通文件系統(tǒng)不同的是,在 HDFS中,如果一個文件小于一個數(shù)據(jù)塊的大小,并不占用整個數(shù)據(jù)塊存儲空間, 但是會占用一個塊。
? ? ? ? DataNode是文件系統(tǒng)的工作節(jié)點,它會根據(jù)需要存儲并檢索數(shù)據(jù)塊,受NameNode調(diào)度,并且定期向NameNode發(fā)送該DataNode上存儲的塊的列表信息。一個數(shù)據(jù)塊在Datanode以文件存儲在磁盤上,包括兩個文件,一個是數(shù)據(jù)本身,一個是元數(shù)據(jù)包括數(shù)據(jù)塊的長度,塊數(shù)據(jù)的校驗和,以及時間戳。

SecondaryNode
???????????? SecondaryNode是輔助NameNode,它是用來定期合并NameNode產(chǎn)生的編輯日志(edits.log)和命名空間鏡像文件(fsImage),以防止edits.log過大。SecondaryNameNode一般要在另一臺機器上運行,因為它需要占用大量的CPU時間與namenode相同容量的內(nèi)存才可以進行合并操作。它會保存合并后的命名空間鏡像的副本,并在namenode發(fā)生故障時啟用。
