您好,登錄后才能下訂單哦!
HDFS的基本原理有哪些?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
1、NameNode概述
NameNode是HDFS的核心,相信這一點大家都知道,所以NameNode也被稱為Master。NameNode僅存儲HDFS的元數據:文件系統中所有文件的目錄樹,并跟蹤整個集群中的文件。NameNode不存儲實際數據或數據集。數據本身實際存儲在DataNodes中。NameNode知道HDFS中任何給定文件的塊列表及其位置。使用此信息NameNode知道如何從塊中構建文件。NameNode并不持久化存儲每個文件中各個塊所在的 DataNode 的位置信息,這些信息會在系統啟動時從數據節點重建。NameNode對于HDFS至關重要,當NameNode關閉時,HDFS / Hadoop集群無法訪問。總結一下,NameNode是Hadoop集群中的單點故障。NameNode所在機器通常會配置有大量內存(RAM)。
2、DataNode概述
DataNode負責將實際數據存儲在HDFS中。DataNode也稱為Slave。NameNode和DataNode會保持不斷通信。DataNode啟動時,它將自己發布到NameNode并匯報自己負責持有的塊列表。當某個DataNode關閉時,它不會影響數據或群集的可用性。NameNode將安排由其他DataNode管理的塊進行副本復制。DataNode所在機器通常配置有大量的硬盤空間。因為實際數據存儲DataNode中。DataNode會定期向NameNode發送心跳,如果NameNode長時間沒有接受到DataNode發送的心跳, NameNode就會認為該DataNode失效。block匯報時間間隔取參數dfs.blockreport.intervalMsec,參數未配置的話默認為6小時。
3、HDFS的工作機制
NameNode負責管理整個文件系統元數據;DataNode負責管理具體文件數據塊存儲;Secondary NameNode協助NameNode進行元數據的備份。HDFS的內部工作機制對客戶端保持透明,客戶端請求訪問HDFS都是通過向NameNode申請來進行。HDFS寫數據流程和HDFS讀數據流程總結如下:
(1)HDFS寫數據流程
A.client發起文件上傳請求,通過RPC與NameNode建立通訊,NameNode檢查目標文件是否已存在,父目錄是否存在,返回是否可以上傳;
B.client請求第一個block該傳輸到哪些DataNode服務器上;
C.NameNode根據配置文件中指定的備份數量及副本放置策略進行文件分配,返回可用的DataNode的地址,如:A、B、C;
D.client請求3臺DataNode中的一臺A上傳數據(本質上是一個RPC調用,建立pipeline),A收到請求會繼續調用B,然后B調用C,將整個pipeline建立完成,后逐級返回client;
E.client開始往A上傳第一個block,以packet為單位(默認64K),A收到一個packet就會傳給 B,B 傳給 C;A 每傳一個packet會放入一個應答隊列等待應答。
F.數據被分割成一個個packet數據包在pipeline上依次傳輸,在pipeline反方向上,逐個發送ack(命令正確應答),最終由pipeline中第一個DataNode節點A將pipeline ack發送給client;
G.當一個block傳輸完成之后,client再次請求NameNode上傳第二個block到服務器。
(2)HDFS讀數據流程
A、Client 向 NameNode 發起 RPC 請求,來確定請求文件 block 所在的位置;
B.NameNode 會視情況返回文件的部分或者全部block 列表,對于每個block,NameNode 都會返回含有該block副本的DataNode地址;
C.這些返回的DN地址,會按照集群拓撲結構得出 DataNode 與客戶端的距離,然后進行排序,排序兩個規則:網絡拓撲結構中距離 Client 近的排靠前;心跳機制中超時匯報的DN 狀態為STALE,這樣的排靠后;
D.Client 選取排序靠前的DataNode來讀取block,如果客戶端本身就是DataNode,那么將從本地直接獲取數據;
E.底層上本質是建立Socket Stream(FSDataInputStream),重復的調用父類DataInputStream的read方法,直到這個塊上的數據讀取完畢;
F.當讀完列表的block后,若文件讀取還沒有結束,客戶端會繼續向NameNode獲取下一批的block列表;
G.讀取完一個block都會進行checksum驗證,如果讀取DataNode時出現錯誤,客戶端會通知 NameNode,然后再從下一個擁有該block副本的DataNode繼續讀。
H.read 方法是并行的讀取block信息,不是一塊一塊的讀取;NameNode只是返回Client 請求包含塊的DataNode地址,并不是返回請求塊的數據;
I.最終讀取來所有的block會合并成一個完整的最終文件。
看完上述內容,你們掌握HDFS的基本原理有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。