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