1. 程式人生 > >HDFS基本原理

HDFS基本原理

狀態 rep 定期 兩個 report 硬盤空間 返回 文件上傳 時間間隔

1. NameNode概述
a、 NameNode是HDFS的核心。
b、 NameNode也稱為Master。
c、 NameNode僅存儲HDFS的元數據:文件系統中所有文件的目錄樹,並跟蹤整個集群中的文件。
d、 NameNode不存儲實際數據或數據集。數據本身實際存儲在DataNodes中。
e、 NameNode知道HDFS中任何給定文件的塊列表及其位置。使用此信息NameNode知道如何從塊中構建文件。
f、 NameNode並不持久化存儲每個文件中各個塊所在的DataNode的位置信息,這些信息會在系統啟動時從數據節點重建。
g、 NameNode對於HDFS至關重要,當NameNode關閉時,HDFS / Hadoop集群無法訪問。
h、 NameNode是Hadoop集群中的單點故障。
i、 NameNode所在機器通常會配置有大量內存(RAM)。
技術分享圖片

2. DataNode概述
a、 DataNode負責將實際數據存儲在HDFS中。
b、 DataNode也稱為Slave。
c、 NameNode和DataNode會保持不斷通信。
d、 DataNode啟動時,它將自己發布到NameNode並匯報自己負責持有的塊列表。
e、 當某個DataNode關閉時,它不會影響數據或群集的可用性。NameNode將安排由其他DataNode管理的塊進行副本復制。
f、 DataNode所在機器通常配置有大量的硬盤空間。因為實際數據存儲在DataNode中。

g、 DataNode會定期(dfs.heartbeat.interval配置項配置,默認是3秒)向NameNode發送心跳,如果NameNode長時間沒有接受到DataNode發送的心跳, NameNode就會認為該DataNode失效。
h、 block匯報時間間隔取參數dfs.blockreport.intervalMsec,參數未配置的話默認為6小時.

3. HDFS的工作機制
NameNode負責管理整個文件系統元數據;DataNode負責管理具體文件數據塊存儲;Secondary NameNode協助NameNode進行元數據的備份。
HDFS的內部工作機制對客戶端保持透明,客戶端請求訪問HDFS都是通過向NameNode申請來進行。

技術分享圖片

3.1. HDFS寫數據流程
詳細步驟解析:
1、 client發起文件上傳請求,通過RPC與NameNode建立通訊,NameNode檢查目標文件是否已存在,父目錄是否存在,返回是否可以上傳;
2、 client請求第一個 block該傳輸到哪些DataNode服務器上;
3、 NameNode根據配置文件中指定的備份數量及機架感知原理進行文件分配,返回可用的DataNode的地址如:A,B,C;
註:Hadoop在設計時考慮到數據的安全與高效,數據文件默認在HDFS上存放三份,存儲策略為本地一份,同機架內其它某一節點上一份,不同機架的某一節點上一份。
4、 client請求3臺DataNode中的一臺A上傳數據(本質上是一個RPC調用,建立pipeline),A收到請求會繼續調用B,然後B調用C,將整個pipeline建立完成,後逐級返回client;
5、 client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet為單位(默認64K),A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答。
6、 數據被分割成一個個packet數據包在pipeline上依次傳輸,在pipeline反方向上,逐個發送ack(命令正確應答),最終由pipeline中第一個DataNode節點A將pipeline ack發送給client;
7、 當一個block傳輸完成之後,client再次請求NameNode上傳第二個block到服務器。

3.2. HDFS讀數據流程
詳細步驟解析:
1、 Client向NameNode發起RPC請求,來確定請求文件block所在的位置;
2、 NameNode會視情況返回文件的部分或者全部block列表,對於每個block,NameNode都會返回含有該block副本的DataNode地址;
3、 這些返回的DN地址,會按照集群拓撲結構得出DataNode與客戶端的距離,然後進行排序,排序兩個規則:網絡拓撲結構中距離Client近的排靠前;心跳機制中超時匯報的DN狀態為STALE,這樣的排靠後;
4、 Client選取排序靠前的DataNode來讀取block,如果客戶端本身就是DataNode,那麽將從本地直接獲取數據;
5、 底層上本質是建立Socket Stream(FSDataInputStream),重復的調用父類DataInputStream的read方法,直到這個塊上的數據讀取完畢;
6、 當讀完列表的block後,若文件讀取還沒有結束,客戶端會繼續向NameNode獲取下一批的block列表;
7、 讀取完一個block都會進行checksum驗證,如果讀取DataNode時出現錯誤,客戶端會通知NameNode,然後再從下一個擁有該block副本的DataNode繼續讀。
8、 read方法是並行的讀取block信息,不是一塊一塊的讀取;NameNode只是返回Client請求包含塊的DataNode地址,並不是返回請求塊的數據;
9、 最終讀取來所有的block會合並成一個完整的最終文件。

HDFS基本原理