Hadoop之HDFS01【介紹】
1063
2022-05-29
Hadoop主要由HDFS和MapReduce 兩個核心部分組成。其中最底部就是HDFS,它被用來存儲Hadoop 集群中所有存儲節點上的文件。 那么在這個學習任務中,小講就跟大家一起來學習hadoop的核心子項目——HDFS(分布式文件系統),我們將從HDFS的背景、基本概念開始,步步深入了解HDFS的設計目標、HDFS的基本結構以及HDFS的相關操作等核心知識。
(一)HDFS 的產生背景?
隨著數據量越來越大,在一個操作系統管轄的范圍內存不下了,那么就分配到更多的操作系統管理的磁盤中,但是不方便管理和維護,迫切需要一種系統來管理多臺機器上的文件,這就是分布式文件管理系統。HDFS只是分布式文件管理系統中的一種。
(二)HDFS 到底是什么?
HDFS(Hadoop Distributed File System)是Hadoop的核心子項目,是一個可以運行在普通硬件設備上的分布式文件系統,是分布式計算中數據存儲和管理的基礎,是基于流數據模式訪問和處理超大文件的需求而開發的。它所具有的高容錯、高可靠性、高可擴展性、高吞吐率等特征為海量數據提供了不怕故障的存儲,給超大數據集(Large Data Set)的應用處理帶來了很多便利。
(三)HDFS 從何而來?
HDFS 源于 Google 在2003年10月份發表的GFS(Google File System) 論文。 它其實就是 GFS 的一個克隆版本。
(四)HDFS的設計目標
1、硬件故障是常態,而不是異常
2、適合流式數據訪問
3、適合大規模數據集
4、簡單的一致性模型
5、移動計算比移動數據更劃算
6、輕便的訪問異構的軟硬件平臺
(五)HDFS的架構和數據存儲原理
HDFS是一個主/從(Mater/Slave)體系結構,從最終用戶的角度來看,它就像傳統的文件系統一樣,可以通過目錄路徑對文件執行CRUD(Create、Read、Update和Delete)操作。但由于分布式存儲的性質,HDFS集群擁有一個NameNode和一些DataNode。NameNode管理文件系統的元數據,DataNode存儲實際的數據。客戶端通過同NameNode和DataNodes的交互訪問文件系統。客戶端聯系NameNode以獲取文件的元數據,而真正的文件I/O操作是直接和DataNode進行交互的。
這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。下面我們分別介紹這四個組成部分。
Client:就是客戶端。
1、文件切分。文件上傳 HDFS 的時候,Client 將文件切分成 一個一個的Block,然后進行存儲。
2、與 NameNode 交互,獲取文件的位置信息。
3、與 DataNode 交互,讀取或者寫入數據。
4、Client 提供一些命令來管理 HDFS,比如啟動或者關閉HDFS。
5、Client 可以通過一些命令來訪問 HDFS。
NameNode:就是 master,它是一個主管、管理者。
1、管理 HDFS 的名稱空間。
2、管理數據塊(Block)映射信息
3、配置副本策略
4、處理客戶端讀寫請求。
DataNode:就是Slave。NameNode 下達命令,DataNode 執行實際的操作。
1、存儲實際的數據塊。
2、執行數據塊的讀/寫操作。
Secondary NameNode:并非 NameNode 的熱備。當NameNode 掛掉的時候,它并不能馬上替換 NameNode 并提供服務。
1、輔助 NameNode,分擔其工作量。
2、定期合并 fsimage和fsedits,并推送給NameNode。
3、在緊急情況下,可輔助恢復 NameNode。
(六)為什么選擇 HDFS 存儲數據?
1、之所以選擇 HDFS 存儲數據,是因為 HDFS 具有以下優點:
(1)高容錯性
1)數據自動保存多個副本。它通過增加副本的形式,提高容錯性。
2)某一個副本丟失以后,它可以自動恢復,這是由 HDFS 內部機制實現的,我們不必關心。
(2)適合批處理
1)它是通過移動計算而不是移動數據。
2)它會把數據位置暴露給計算框架。
(3)適合大數據處理
1)數據規模:能夠處理數據規模達到 GB、TB、甚至PB級別的數據。
2)文件規模:能夠處理百萬規模以上的文件數量,數量相當之大。
3)節點規模:能夠處理10K節點的規模。
(4)流式數據訪問
1)一次寫入,多次讀取,不能修改,只能追加。
2)它能保證數據的一致性。
(5)可構建在廉價機器上
1)它通過多副本機制,提高可靠性。
2)它提供了容錯和恢復機制。比如某一個副本丟失,可以通過其它副本來恢復。
2、當然 HDFS 也有它的劣勢,并不適合所有的場合:
(1)不適合低延時數據訪問
1)比如毫秒級的來存儲數據,這是不行的,它做不到。
2)它適合高吞吐率的場景,就是在某一時間內寫入大量的數據。但是它在低延時的情況下是不行的,比如毫秒級以內讀取數據,這樣它是很難做到的。
改進策略
(2)無法高效的對大量小文件進行存儲
1)存儲大量小文件的話,它會占用 NameNode大量的內存來存儲文件、目錄和塊信息。這樣是不可取的,因為NameNode的內存總是有限的。
2)小文件存儲的尋道時間會超過讀取時間,它違反了HDFS的設計目標。
改進策略
(3)并發寫入、文件隨機修改
1)一個文件只能有一個寫,不允許多個線程同時寫。
2)僅支持數據 append(追加),不支持文件的隨機修改。
(七)HDFS 如何讀取文件?
HDFS的文件讀取原理,主要包括以下幾個步驟:
1、首先調用FileSystem對象的open方法,其實獲取的是一個DistributedFileSystem的實例。
2、DistributedFileSystem通過RPC(遠程過程調用)獲得文件的第一批block的locations,同一block按照重復數會返回多個locations,這些locations按照hadoop拓撲結構排序,距離客戶端近的排在前面。
3、前兩步會返回一個FSDataInputStream對象,該對象會被封裝成 DFSInputStream對象,DFSInputStream可以方便的管理datanode和namenode數據流。客戶端調用read方 法,DFSInputStream就會找出離客戶端最近的datanode并連接datanode。
4、數據從datanode源源不斷的流向客戶端。
5、如果第一個block塊的數據讀完了,就會關閉指向第一個block塊的datanode連接,接著讀取下一個block塊。這些操作對客戶端來說是透明的,從客戶端的角度來看只是讀一個持續不斷的流。
6、如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然后繼續讀,如果所有的block塊都讀完,這時就會關閉掉所有的流。
(八)HDFS 如何寫入文件?
HDFS的文件寫入原理,主要包括以下幾個步驟:
1.客戶端通過調用 DistributedFileSystem 的create方法,創建一個新的文件。
2.DistributedFileSystem 通過 RPC(遠程過程調用)調用 NameNode,去創建一個沒有blocks關聯的新文件。創建前,NameNode 會做各種校驗,比如文件是否存在,客戶端有無權限去創建等。如果校驗通過,NameNode 就會記錄下新文件,否則就會拋出IO異常。
3.前兩步結束后會返回 FSDataOutputStream 的對象,和讀文件的時候相似,FSDataOutputStream 被封裝成 DFSOutputStream,DFSOutputStream 可以協調 NameNode和 DataNode。客戶端開始寫數據到DFSOutputStream,DFSOutputStream會把數據切成一個個小packet,然后排成隊列 data queue。
4.DataStreamer 會去處理接受 data queue,它先問詢 NameNode 這個新的 block 最適合存儲的在哪幾個DataNode里,比如重復數是3,那么就找到3個最適合的 DataNode,把它們排成一個 pipeline。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode 中,第一個 DataNode又把 packet 輸出到第二個 DataNode 中,以此類推。
5.DFSOutputStream 還有一個隊列叫 ack queue,也是由 packet 組成,等待DataNode的收到響應,當pipeline中的所有DataNode都表示已經收到的時候,這時akc queue才會把對應的packet包移除掉。
6.客戶端完成寫數據后,調用close方法關閉寫入流。
7.DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一個 ack 后,通知 DataNode 把文件標示為已完成。
(九)HDFS 副本存放策略
namenode 如何選擇在哪個 datanode 存儲副本(replication)?這里需要對可靠性、寫入帶寬和讀取帶寬進行權衡。 Hadoop 對 datanode 存儲副本有自己的副本策略,在其發展過程中一共有兩個版本的副本策略,分別如下所示。
Hadoop 0.17之前的副本策略
第一個副本:存儲在同機架的不同節點上。
第二個副本:存儲在同機架的另外一個節點上。
第三個副本:存儲在不同機架的另外一個節點。
其它副本:選擇隨機存儲。
Hadoop 0.17 之后的副本策略
第一個副本:存儲在同 Client 相同節點上。
第二個副本:存儲在不同機架的節點上。
第三個副本:存儲在第二個副本機架中的另外一個節點上。
其它副本:選擇隨機存儲。
分布式 Hadoop
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。