Hadoop如何工作? HDFS案例研究
Apache Hadoop軟件庫是一個框架,該框架允許使用簡單的編程模型跨計算機集群對大型數據集進行分布式處理。 它旨在從單個服務器擴展到數千臺機器,每臺機器都提供本地計算和存儲。
庫本身不用于依靠硬件來提供高可用性,而是被設計用來檢測和處理應用程序層的故障,因此可以在計算機集群的頂部提供高可用性服務,每臺計算機都容易出現故障。 Hadoop庫包含兩個主要組件HDFS和MapReduce,在本文中,我們將深入研究HDFS的每個部分,并了解其內部工作方式。
HDFS具有主/從體系結構。 HDFS群集由單個NameNode和管理文件系統名稱空間并控制客戶端對文件的訪問的主服務器組成。 此外,還有許多數據節點,通常是集群中每個節點一個,用于管理與它們所運行的節點相連的存儲。
HDFS公開了文件系統名稱空間,并允許用戶數據存儲在文件中。 在內部,文件被分成一個或多個塊,這些塊存儲在一組DataNode中。 NameNode執行文件系統名稱空間操作,例如打開,關閉和重命名文件和目錄。 它還確定塊到DataNode的映射。 DataNode負責處理來自文件系統客戶端的讀寫請求。 DataNode還根據NameNode的指令執行塊創建,刪除和復制。
HDFS分析
在使用JArchitect分析Hadoop 之后 ,這是hdfs項目的依賴關系圖。
為了完成其工作,hdfs使用了許多第三方庫,例如番石榴,碼頭,杰克遜等。 DSM(設計結構矩陣)為我們提供了有關使用每個庫的權重的更多信息。
HDFS主要使用rt,hadoop-common和protobuf庫。 當使用外部庫時,最好檢查一下我們是否可以輕松地將另一個第三方庫更改為另一個庫而不影響整個應用程序,這有很多原因可以鼓勵我們更改第三方庫。 另一個庫可以:
- 具有更多功能
- 表現更好
- 更安全
讓我們以jetty lib為例,并搜索hdfs中的哪些方法直接使用它。 從方法中的m中,其中m.IsUsing(“ jetty-6.1.26”)&& m.ParentProject.Name ==“ hadoop-hdfs-0.23.6”選擇新的{m,m.NbBCInstructions}
只有很少的方法直接使用jetty lib,而用另一種方法進行更改將非常容易。 通常,當您僅可以在某些類中使用外部庫時,進行隔離非常有趣,它可以幫助輕松地維護和發展項目。 現在讓我們發現主要的HDFS組件:
數據節點
啟動
為了發現如何啟動數據節點,讓我們在hdfs jar的所有入口點之前進行搜索。 從m中的方法中的m.Name.Contains(“ main(String [])”)&& m.IsStatic選擇新的{m,m.NbBCInstructions}
hdfs具有許多條目,例如DFSAdmin,DfSsc,Balancer和HDFSConcat。 對于數據節點,相關的入口點是DataNode類,這是調用其main方法時發生的情況。
main方法調用第一個securemain并將參數securityresources傳遞給它,當在非安全群集中啟動該節點時,此參數為null,但是在安全環境中啟動該節點的情況下,將為該參數分配安全資源。 SecureResources類包含兩個屬性:
這是從DataNode.StartDataNode調用的方法。
此方法初始化IPCServer,DataXceiver(這是用于處理傳入/傳出數據流的線程),創建數據節點度量實例。
如何管理數據?
DataNode類具有名為FSDatasetinterface類型的數據的屬性。 FSDatasetinterface是用于基礎存儲的接口,用于存儲數據節點的塊。 讓我們搜索Hadoop中可用的實現。 從類型為t.Implement(“ org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface”)選擇新的{t,t.NbBCInstructions}的類型中
Hadoop提供了FSDataset,它管理一組數據塊并將其存儲在目錄中。 使用接口可實現低耦合,并使設計非常靈活,但是,如果使用實現而不是接口,我們將失去這一優勢,并且要檢查是否在任何地方都使用interfaceDataSet表示數據,讓我們使用FSDataSet搜索所有方法。 從m.IsUsing(“ org.apache.hadoop.hdfs.server.datanode.FSDataset”)中選擇新的{m,m.NbBCInstructions}的方法中的m
只有FSDataSet內部類直接使用它,而在所有其他地方都使用interfaceDataSet,這使得更改數據集類型的可能性變得非常容易。 但是,如何更改interfaceDataSet并給出自己的實現? 為此,讓我們搜索FSDataSet的創建位置。
從方法的m中開始,讓depth0 = m.DepthOfCreateA(“ org.apache.hadoop.hdfs.server.datanode.FSDataset”),其中depth0 == 1選擇新的{m,depth0}
工廠模式用于創建實例。 問題是,如果該工廠直接在getFactory方法中創建實現,則必須更改Hadoop代碼以為其提供自定義數據集管理器。 讓我們發現getFactory方法使用了哪些方法。 從m.IsUsedBy(“ org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface $ Factory.getFactory(Configuration)”)中選擇新的{m,m.NbBCInstructions}
好消息是工廠使用Configuration來獲取類的實現,因此我們只能通過配置給出自定義的DataSet,我們還可以搜索配置可以提供的所有類。
從m.IsUsing(“ org.apache.hadoop.conf.Configuration.getClass(String,Class,Class)”)中選擇新的{m,m.NbBCInstructions}的方法中的m
可以在不更改其源代碼的情況下將許多類注入Hadoop框架,這使其非常靈活。
名稱節點
NameNode是所有HDFS元數據的仲裁器和存儲庫。 該系統的設計方式是,用戶數據永遠不會流過NameNode。 這是啟動名稱節點時調用的一些方法。
創建了RPC服務器,并加載了fsnamesystem,下面是對這兩個組件的快速瀏覽:
NameNodeRpcServer
NameNodeRpcServer負責處理對NameNode的所有RPC調用。 例如,當啟動一個數據節點時,它必須在NameNode上注冊自己,rpc服務器接收該請求并將其轉發到fsnamesystem,后者將其重定向到dataNodeManager。
另一個示例是當接收到數據塊時。 從m.IsUsedBy(“ org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.blockReceived(DatanodeRegistration,String,Block [],String [])”)中的m中選擇新的{m,m.NbBCInstructions}
圖中的每個矩形與代碼指令的字節數成正比,我們可以觀察到BlockManager.addBlock可以完成大部分工作。 Haddop有趣的是,每個類都有特定的職責,并且任何請求都將重定向到相應的管理器。
FS名稱系統
HDFS支持傳統的分層文件組織。 用戶或應用程序可以創建目錄并將文件存儲在這些目錄中。 文件系統名稱空間層次結構與大多數其他現有文件系統相似。 可以創建和刪除文件,將文件從一個目錄移動到另一個目錄或重命名文件。 例如,這是有關符號鏈接創建的依賴圖。
HDFS客戶端
DFSClient可以連接到Hadoop Filesystem并執行基本文件任務。 它使用ClientProtocol與NameNode守護程序進行通信,并直接連接到DataNode以讀取/寫入塊數據。
Hadoop DFS用戶應獲取DistributedFileSystem的實例,該實例使用DFSClient處理文件系統任務。 DistributedFileSystem充當外觀并將請求重定向到DFSClient類,這是有關創建目錄請求的依賴關系圖。
結論:
以用戶身份使用框架非常有趣,但是深入該框架可以為我們提供更多信息,以便更好地理解它,并輕松地使其適應我們的需求。 Hadoop是許多公司使用的功能強大的框架,其中大多數公司都需要對其進行自定義,所幸的是,Hadoop非常靈活,允許我們在不更改源代碼的情況下更改行為。
翻譯自: https://www.javacodegeeks.com/2013/04/how-hadoop-works-hdfs-case-study.html
總結
以上是生活随笔為你收集整理的Hadoop如何工作? HDFS案例研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大众点评管家电脑版官网(大众点评电脑版登
- 下一篇: 小米电视机评测(小米电视啥样)