1.Hadoop與HDFS的關系
Hadoop實現了一個分布式文件系統,即Hadoop Distributed File System,簡稱HDFS。對外部客戶機而言,HDFS就像一個傳統的分級文件系統,所以,很多時候,我們也叫它DFS(Distributed File System)。可以理解為HDFS是Hadoop中的一個部件。
文件系統由三部分組成:文件管理軟件、被管理文件、文件存儲結構
2.HDFS存儲(流處理,塊存儲)
HDFS以流處理訪問模式來存儲文件的。分布化的文件系統會因為分布后的結構不完整,導致系統復雜度加大。那么HDFS如何來保證完整性的?HDFS的解決方案是分片冗余,本地校驗。冗余后的分片中只要有一份是完整的,經過多次協同調整之后,其他分片文件也將完整。所以,整個系統里的文件是完整的。
3.元數據
元數據:用於描述要素、數據集或數據集系列的內容、覆蓋范圍、管理方式等相關信息,簡單的說,就是關於數據屬性的數據。
元數據包括:
——文件系統目錄樹信息
*文件名,目錄名
*文件和目錄的大小,創建及最后訪問時間
*權限,文件和目錄的從屬關系
——文件和塊的對應關系
*文件由哪些塊組成
——塊的存放位置
*機器名,塊IP
HDFS就是將巨大的數據變成大量數據的數據。
3.HDFS架構
一個HDFS文件系統包括一個主控節點Namenode和一組從節點DataNode。
Namenode:是一個主服務器,用來管理整個文件系統的命名空間和元數據。
Namenode保存了文件系統的三種元數據:
1)命名空間,整個分布式文件系統的目錄結構
2)數據塊與文件名的映射表
3)每個數據塊副本的位置信息,每個數據塊默認有三個副本
Namenode可以執行文件操作,比如打開、關閉、重命名;同時向DataNode分配數據塊並建立數據塊和DataNode的對應關系。
DataNode:塊的實際數據存放,用來實際存儲和管理文件的數據塊,客戶端讀取寫入的時候直接與DataNode通信。
DataNode處理用戶具體的數據讀寫請求,同時處理Namenode對於數據塊的創建、刪除副本的指令。
4.數據塊
HDFS最大的特點是使用了數據塊的存儲方式。
HDFS中每個塊是一個獨立的存儲單位,以塊為單位在集群服務器上分配存儲。
使用塊的好處:
(1)當一個文件大於集群中任意一個磁盤的時候,文件系統可以充分利用集群中所有的磁盤。
(2)管理塊使底層的存儲子系統相對簡單
(3)塊更加適合備份,為容錯和高可用性的實現帶來方便
(4)實現了名字與位置的分離,存儲位置的獨立性
塊的備份:
(1)每個塊在集群中存儲多份(replica)
(2)某個塊的所有備份都是同一ID
(3)系統可以根據機架的配置自動分配備份位置
5.HDFS客戶端的訪問流程
A. 首先,用戶的應用程序通過HDFS 的客戶端程序將文件名發送至NameNode 。
B. NameNode 接收到文件名之后,在HDFS 目錄中檢索文件名對應的數據塊,再根據數據塊信息找到保存數據塊的DataNode 地址,將這些地址回送給客戶端。
C. 客戶端接收到DataNode 地址之后,與DataNode 並行地進行數據傳輸操作,同時將操作結果的相關日志(比如是否成功,修改后的數據塊信息等)提交到NameNode 。
6.數據的讀取過程
A. 客戶端調用FileSystem 實例的open 方法,獲得這個文件對應的輸入流InputStream
B. 通過RPC 遠程調用NameNode ,獲得NameNode 中此文件對應的數據塊保存位置,包括這個文件的副本的保存位置( 主要是各DataNode的地址) 。
C. 獲得輸入流之后,客戶端調用read 方法讀取數據。選擇最近的DataNode 建立連接並讀取數據。
D. 如果客戶端和其中一個DataNode 位於同一機器(比如MapReduce 過程中的mapper 和reducer),那么就會直接從本地讀取數據。
E. 到達數據塊末端,關閉與這個DataNode 的連接,然后重新查找下一個數據塊。
F. 不斷執行第2 - 5 步直到數據全部讀完
G. 客戶端調用close ,關閉輸入流DF S InputStream
7.數據的寫入過程
A. 客戶端調用Fi leSystem 實例的create 方法,創建文件。NameNode 通過一些檢查,比如文件是否存在,客戶端是否擁有創建權限等;通過檢查之后,在NameNode 添加文件信息。注意,因為此時文件沒有數據,所以NameNode 上也沒有文件數據塊的信息。
B. 創建結束之后, HDFS 會返回一個輸出流DFSDataOutputStream 給客戶端。
C. 客戶端調用輸出流DFSDataOutputStream 的write 方法向HDFS 中對應的文件寫入數據。
D. 數據首先會被分包,這些分包會寫人一個輸出流的內部隊列Data 隊列中,接收完數據分包,輸出流DFSDataOutputStream 會向NameNode 申請保存文件和副本數據塊的若干個DataNode , 這若干個DataNode 會形成一個數據傳輸管道。DFSDataOutputStream 將數據傳輸給距離上最短的DataNode ,這個DataNode 接收到數據包之后會傳給下一個DataNode 。數據在各DataNode之間通過管道流動,而不是全部由輸出流分發,以減少傳輸開銷。
E. 因為各DataNode 位於不同機器上,數據需要通過網絡發送,所以,為了保證所有DataNode 的數據都是准確的,接收到數據的DataNode 要向發送者發送確認包(ACK Packet ) 。對於某個數據塊,只有當DFSDataOutputStream 收到了所有DataNode 的正確ACK. 才能確認傳輸結束。DFSDataOutputStream 內部專門維護了一個等待ACK 隊列,這一隊列保存已經進入管道傳輸數據、但是並未被完全確認的數據包。
F. 不斷執行第3 - 5 步直到數據全部寫完,客戶端調用close 關閉文件。
G. DFSDataInputStream 繼續等待直到所有數據寫人完畢並被確認,調用complete 方法通知NameNode 文件寫入完成。NameNode 接收到complete 消息之后,等待相應數量的副本寫入完畢后,告知客戶端。