Hadoop系列-HDFS基礎
-
HDFS(Hadoop Distributed File System)是Hadoop的一個基礎的分布式文件系統,這個分布式的概念主要體現在兩個地方:
-
數據分塊存儲在多臺主機
-
數據塊采取冗余存儲的方式提高數據的可用性
針對於以上的分布式存儲概念,HDFS采用了master/slave的主從結構來構建整個存儲系統。之所以可以通過分散的機器組成一個整體式的系統,這其中機器之間的相互通訊必不可少。對於一個程序在不同機器上的通訊,主要是通過遠程系統調用RPC(remote procedure call)實現,不同的語言有不同的實現方式,而HDFS是運行於JVM基礎上的,那麽這裏的通訊就是指不同機器的JVM進程之間的通訊。當然,底層的網絡通訊主要是socket協議,在實際的工業場景中使用對socket進一步封裝的netty實現。接下來,進一步針對數據塊、namenode、datanode等進行說明。
-
-
數據塊
每個計算機的磁盤都有一個默認的數據塊(block)大小,這是進行數據讀寫的最小單位,文件系統通過管理磁盤上的數據塊來管理文件。HDFS的block默認大小為128MB,但是於一般單一的磁盤文件系統不同的是,HDFS中小於一個塊大小的文件不會占用整個block空間。例如:一個大小為1MB的文件存儲在HDFS中時,在默認數據塊是128MB的情況下還是只占用1MB,而不是128MB。決定數據傳輸速度的因素主要是磁盤驅動器的傳輸速率和文件尋址效率,如果數據塊設置的足夠大,那麽文件尋址的效率就會變高,但也不是無限大,具體block的大小還需要根據具體的業務邏輯進行考慮。對文件進行塊抽象的一個明顯優點就是文件的大小不受限於任何一臺單獨的主機的磁盤容量限制,也就使得HDFS更適合數據量比較大的大數據場景。
-
namenode
整個HDFS集群有管理節點(namenode)和工作節點(datanode)。namenode主要維持兩層關系:
-
第一層:整個集群的目錄樹結構以及文件的數據塊列表;
-
第二層:數據塊與各個datanode的映射關系,也包括datanode的一些主機名、磁盤大小等數據。
-
命名空間鏡像文件(FSImage):某一時刻內存元數據的真實組織情況
-
編輯日誌文件(EditsLog):該時刻後所有元數據的改動信息
-
-
-
secondarynamenode
secondarynamenode主要是不定時的觀察EditsLog、FSImage的情況,超過一定的閾值情況下對EditsLog和FSImage進行合並,形成新的FSImage文件。這樣可以盡量減少namenode本身的負載。
-
datanode
datanode是主要的數據存儲節點,這其中涉及了datanode與namenode的通訊情況。
-
register:將datanode所在主機的信息(如主機名、內存、硬盤)告訴namenode,nemenode通過check相應的信息允許其稱為集群中的一員;
-
block report:傳輸block信息給namenode,便於namenode可以維護數據塊和數據節點之間的映射關系;
-
send heartbeat:
-
通過心跳機制保持與namenode的聯系更新存儲容量等信息
-
執行namenode通過heartbeat傳輸來的指令
-
-
federation
上文提到,namenode為了盡可能的使客戶端的訪問效率變高,會將所有的文件系統和數據塊的引用信息保存在內存中,如果集群存儲的文件量足夠多,namenode內存的大小將限制集群的整個性能和可擴展能力。為此,在hadoop2.x中引入了federation機制,通過添加namenode實現擴展。
federation環境下,每隔namenode維護一個命名空間卷(namespace volume)由命名空間的元數據和數據塊池組成,命名空間之間相互獨立,互不通信。在這種情況下datanode被用作通用的數據存儲設備,每個datanode要向集群中所有的namenode註冊,且周期性的向所有namenode發送心跳和報告,並執行來自所有namenode的命令。但是,每個namenode只管理各自的block信息,如果一個namenode掛掉,雖然不會影響到其他的namenode,但是這個namenode管理的數據就不可訪問,還是會存在SPOF(single point of failure,即單點故障問題)。
以上主要是個人對HDFS的一些基本概念的初步理解,如有錯誤還請各位大大們指正。
Hadoop系列-HDFS基礎