1 HDFS 架構
HDFS作為分布式文件管理系統,Hadoop的基礎。HDFS整體架構包括:NameNode、DataNode、Secondary NameNode,如圖:
HDFS采用主從式的分布式架構。
- Namenode:是主節點,負責存儲文件的元數據,包括目錄、文件、權限等信息和文件分塊、副本存儲等。Namenode會對HDFS的全局情況進行管理。
- Datanode:是從節點,負責自身存儲的數據塊(block),根據Namenode的指令,對本身存儲的文件數據塊進行讀寫,並且對數據塊進行定期自檢,向Namenode上報節點與數據的健康情況,Namenode根據Datenode的上報信息,決定是否對數據存儲狀況進行調整,並將超時(默認是10分鍾)未上報數據的Datanode標記為異常狀態。一台主機只部署一個Datanode角色。
Hadoop shell上傳的文件是存放在DataNode的block中,通過linux shell只能看到block,不能看到文件。
HBase、Hive、Solr等分布式數據庫或數據倉庫均使用HDFS作為其底層存儲系統。
以下是本章的重點:
- 分布式文件系統與HDFS
- HDFS體系結構與基本概念
- HDFS的shell操作
2 分布式文件系統與HDFS
DFS:Distributed File System
分布式文件管理系統:數據量越來越多,在一個操作系統管轄的范圍存不下,那么就分配到更多的操作系統管理的磁盤中,但是不方便管理和維護,因此迫切需要一種系統來管理多台機器上的文件。分布式文件管理系統就是一種允許文件通過網絡在多台主機上分享的文件系統,可讓多機器上的多用戶分享文件和存儲空間。
HDFS只是DFS中的一種,適應於一次寫、多次查詢的情況,不支持並發寫情況,小文件不合適。HDFS:把客戶端的大文件存放在很多節點的數據塊中,記住三個關鍵詞:文件、節點、數據塊。
從分布式存儲的角度看,HDFS的主要優勢在於:
- 將大文件分塊,實現元數據統一管理,數據分布式存儲,且具有良好的橫向擴展性.
- 實現數據的多副本存儲,不必擔心由於節點或網絡故障造成的數據不可用.
- 隱藏分塊,副本等存儲細節,上層應用可以通過類POSIX接口實現文件讀寫.
更簡單的一點來說:HDFS就是windows中存在的文件系統。
3 HDFS的shell操作
HDFS是存取數據的分布式文件系統,對HDFS的操作,就是文件系統的基本操作,比如文件的創建、修改、刪除、修改權限等,文件夾的創建、刪除、重命名等。對HDFS的操作命令類似於linux的shell對文件的操作,如ls、mkdir、rm等。
對hdfs的操作方式:hadoop fs xxx
- hadoop fs -ls / ----查看hdfs根目錄下的內容的
- hadoop fs -lsr / ----遞歸查看hdfs的根目錄下的內容的
- hadoop fs -mkdir /d1 ----在hdfs上創建文件夾d1
- hadoop fs -put <linux source > <hdfs destination> ----把數據從linux上傳到hadfs的特定路徑中
- hadoop fs -get <hdfs source> <linux destination>----把數據從hdfs下載到linux的特定路徑下
- hadoop fs -text <hdfs文件> ----查看hdfs文件
- hadoop fs -rm 刪除具體的文件 ----刪除hdfs中文件
- hadoop fs -rmr 刪除具體的文件夾 ----刪除hdfs中的文件夾
具體命令:
注意:以上表格中對於路徑,包括 hdfs 中的路徑和 linux 中的路徑。對於容易產生歧義的地方,會特別指出“linux 路徑”或者“hdfs 路徑”。如果沒有明確指出,意味着是 hdfs路徑。
比如:
紅框內-內容格式如下:l
-首字母表示文件夾(如果是“d”)還是文件(如果是“-”);
-后面的 9 位字符表示權限;
-后面的數字或者“-”表示副本數。如果是文件,使用數字表示副本數;文件夾沒有副本;
-后面的“root”表示屬主;
-后面的“supergroup”表示屬組;
-后面的“0”、“6176”、“37645”表示文件大小,單位是字節;
-后面的時間表示修改時間,格式是年月日時分;
-最后一項表示文件路徑。
hdfs幫助文檔:hadoop fs -help +具體的命令
4 NameNode(管理節點)的數據結構
NameNode:將文件系統的元數據信息存儲為fsimage文件。該文件在Namenode啟動時被加載到內存中,之后該文件(及內存文件)一直保持只讀狀態。在fsimage文件中,每一條目錄、文件或數據塊信息基於大約占用150個字節。
查詢時,直接從內存查;修改時,則不能直接從內存或磁盤中修改fsimage文件,而是將修改事務寫到一系列新的editlog文件中。editlog文件會定期合並,形成新的fsimage文件,例如在Namenode再次啟動時。
Namenode各個角色部署在linux系統之上,一般文件都存在linux本地文件系統中。
NameNode作用是管理文件目錄結構,是管理數據節點。
名字節點維護兩套數據,一套是文件目錄與數據塊之間的關系,另一套是數據塊與節點之間的關系。前一套數據是靜態的,是存放在磁盤上的,通過fsimage和edits文件來維護;后一套數據是動態的,不持久化到磁盤的,每當集群啟動的時候,會自動建立這些信息。
NameNode包含整個文件系統的文件目錄樹,文件/目錄的元信息和每個文件對應的數據塊列表,接收用戶的操作請求。core-default.xml中的dfs.name.dir屬性、dfs.name.edits.dir屬性,配置的是NameNode的核心文件fsimage、edits的存放位置。
文件包括:
- fsimage:元數據鏡像文件,存儲某一時段NameNode內存元數據信息。
- edits:操作日志文件
- fstime:保存最近一次checkpoint的時間
以上這些文件是保存在linux的文件系統中。
具體路徑:/usr/local/hadoop/tmp、/usr/local/hadoop/tmp/dfs/name目錄下。
5 SecondaryNameNode
SecondaryNameNode作用:為了降低Namenode的壓力,SecondaryNameNode角色可以負責將fsimage和editlog文件進行合並,形成新的fsimage文件。
執行過程:Secondary NameNode會通知Namenode暫停使用當前的editlog,Namenode會將新紀錄寫入一系列新的editlog文件。Secondary NameNode將fsimage和editlog文件通過HTTP協議復制到本地,進行合並后,再將新的fsimage文件通過HTTP Post方式復制到Namenode。Namenode會用新的fsimage代替舊的文件,將其讀入內存。
或者從NameNode上下載元數據信息(fsimage,edits),然后把二者合並,生成新的fsimage,在本地保存,並將其推送到NameNode,同時重置NameNode的edits.
默認在安裝在NameNode節點上。
合並原理:
6 Datanode(存儲數據)
DataNode作用:HDFS中真正存儲數據的。
提供真實文件數據的存儲服務:
- 文件塊(block):最基本的存儲單位。對於文件內容而言,一個文件的長度大小是size,那么從文件的0偏移開始,按照固定的大小,順序對文件進行划分並編號,划分好的每一個塊稱一個Block.HDFS默認Block大小是64MB,以一個256MB文件,共有256/64=4個Block。core-default.xml中找到參數ds.block.name去修改block的大小。
- 不同於普通文件系統的是,HDFS中,如果一個文件小於一個數據塊的大小,並不占用整個數據塊存儲空間。
- replication,多復本。默認是三個。hdfs-site.xml的dfs.replication屬性。
DataNode存放的目錄:core-default.xml中參數dfs.data.dir的值就是block存放在linux文件系統中的位置。
7 數據分塊和多副本機制
HDFS采用了數據分塊(block)存儲和分塊多副本兩種重要的機制。
7.1 數據分塊
文件分塊機制使HDFS可以利用分布式方法存儲大於單節點或單磁盤存儲容量的文件。
HDFS將文件分割成數據塊,具體大小視用戶配置而定,一般64~256MB。寫入文件時,Namenode會指示客戶端將文件切成小塊,並且將數據塊存儲在多個Datanode上,Namenode會記錄文件的分塊存儲情況。讀取文件時,Namenode會根據客戶端到相應的Datanode讀取所需的數據塊。
數據分塊存儲在各個Datanode的本地文件系統中,路徑由用戶配置文件指定。
其中.meta的文件為分塊的元數據信息,blk_xxx即為分塊文件,除此之外,Datanode還可以本地保存若干集群信息、版本信息或臨時文件等。
HDFS分塊目的:一方面是有利於分布式環境下的均勻存儲和分區容錯,另一方面是MapReduce等分布式架構進行數據處理時,方便將數據一次性讀入內存,當Map出現故障時,也有利於任務恢復。
7.2 數據多副本機制
HDFS默認情況下,可以將數據塊復制為三個副本。
8 HDFS存在的問題
- HDFS不支持隨機改寫,數據都是一次寫入,多次讀取的.
- HDFS沒有表的概念,無法定義列名等信息
- HDFS無法針對行數統計,過濾掃描等常見數據查詢功能實現快捷操作,需要通過MapReduce編程實現,且無法實現實時檢索.