版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章
Hadoop分布式文件系統(tǒng)
01Hadoop簡介02HDFS體系結(jié)構(gòu)目錄Contents03HDFS初探04HDFS常用CLI命令05利用pyhdfs實(shí)現(xiàn)HDFS的文件訪問06Pyhdfs應(yīng)用實(shí)戰(zhàn)Hadoop簡介011HadoopApacheHadoop項(xiàng)目是Apache軟件基金會(huì)下的一個(gè)頂級項(xiàng)目,致力于可靠、可擴(kuò)展、分布式計(jì)算開發(fā)的開源軟件。ApacheHadoop系統(tǒng)是一個(gè)允許使用簡單的編程模型實(shí)現(xiàn)跨計(jì)算機(jī)集群的大型數(shù)據(jù)集的分布式處理框架,它可以從單個(gè)服務(wù)器擴(kuò)展到數(shù)千臺(tái)機(jī)器,且每臺(tái)機(jī)器都提供本地計(jì)算和存儲(chǔ)。1Hadoop—發(fā)展歷史1Hadoop—優(yōu)勢快速:數(shù)據(jù)分布在集群中的各個(gè)節(jié)點(diǎn),由各節(jié)點(diǎn)分別進(jìn)行處理,這有助于利用集群上各節(jié)點(diǎn)的計(jì)算能力更快地進(jìn)行數(shù)據(jù)檢索和處理??缮炜s性:Hadoop的擴(kuò)展非常方便,只要在集群中添加節(jié)點(diǎn),就可以擴(kuò)展Hadoop集群。經(jīng)濟(jì)高效:Hadoop是開源的,使用普通硬件來存儲(chǔ)數(shù)據(jù),因此與傳統(tǒng)的關(guān)系數(shù)據(jù)庫管理系統(tǒng)相比,它具有成本效益優(yōu)勢。故障恢復(fù)能力:HDFS具有在網(wǎng)絡(luò)上復(fù)制數(shù)據(jù)的特性,如果一個(gè)節(jié)點(diǎn)出現(xiàn)故障或發(fā)生網(wǎng)絡(luò)故障,Hadoop可以從其他DataNode中獲取另一個(gè)數(shù)據(jù)副本并使用它。通常情況下,數(shù)據(jù)被重復(fù)復(fù)制、存儲(chǔ)三次,副本數(shù)量是可配置的。1Hadoop—生態(tài)Hadoop生態(tài)系統(tǒng)是一個(gè)提供各種服務(wù)來解決大數(shù)據(jù)問題的平臺(tái)或套件,它包括Apache項(xiàng)目和各種商業(yè)工具和解決方案。除了Hadoop的四個(gè)核心組件(HDFS、MapReduce、YARN和HadoopCommon)外,大多數(shù)工具和解決方案都用于補(bǔ)充或支持這些主要組件。1Hadoop—生態(tài)系統(tǒng)1Hadoop—生態(tài)系統(tǒng)組件HDFS:Hadoop分布式文件系統(tǒng),Hadoop核心組件之一;Yarn:分布式資源管理與調(diào)度器,Hadoop核心組件之一;MapReduce:基于編程的數(shù)據(jù)處理,Hadoop核心組件之一;Zookeeper:分布式一致性服務(wù)組件,提供分布式協(xié)調(diào)一致性服務(wù);HBase:一種非關(guān)系型(NoSQL)數(shù)據(jù)庫;HIVE:一種基于Hadoop的數(shù)據(jù)倉庫系統(tǒng);Spark:一種流式數(shù)據(jù)處理計(jì)算框架;PIG:一種基于查詢的數(shù)據(jù)處理服務(wù);Mahout,SparkMLLib:機(jī)器學(xué)習(xí)算法庫;Solar,Lucene:基于Hadoop框架的搜索和索引;1Hadoop—核心組件1Hadoop—核心組件1.HDFS(Hadoop分布式文件系統(tǒng))Hadoop系統(tǒng)最核心的組件。HDFS可以支持?jǐn)?shù)據(jù)的分布式存儲(chǔ)、訪問,使得由分布式異構(gòu)計(jì)算機(jī)組成的網(wǎng)絡(luò)集群可以提供更加強(qiáng)大的服務(wù)。HDFS將文件分成塊存儲(chǔ)在分布式體系結(jié)構(gòu)的節(jié)點(diǎn)中,并通過冗余存儲(chǔ)的方式提高整個(gè)文件系統(tǒng)的容錯(cuò)。HDFS還允許連接到其他核心組件,如MapReduce。1Hadoop—核心組件2.MapReduceHadoop的另一個(gè)核心組件,它結(jié)合了兩個(gè)獨(dú)立的功能:Map和Reduce,并使用鍵值對實(shí)現(xiàn)數(shù)據(jù)并行計(jì)算的框架。Map任務(wù)接受輸入數(shù)據(jù)并將其轉(zhuǎn)換為可以在鍵值對中計(jì)算的數(shù)據(jù)集,Map任務(wù)的輸出作為Reduce的輸入,Reduce運(yùn)算后輸出得到期望的結(jié)果。從本質(zhì)上看,Map允許一個(gè)平臺(tái)以一種通用格式為進(jìn)一步進(jìn)行數(shù)據(jù)分析提供數(shù)據(jù)支持;Reduce則將可用的映射關(guān)系數(shù)據(jù)約簡為一組定義良好的統(tǒng)計(jì)值。1Hadoop—核心組件3.YarnYarn是Hadoop2中引入的核心組件,它是管理網(wǎng)絡(luò)集群中可用資源的系統(tǒng)(資源管理器),并為系統(tǒng)上的每個(gè)大數(shù)據(jù)需求調(diào)度處理任務(wù),以提出一個(gè)智能調(diào)度方案。4.HadoopCommonHadoopCommon由其他Hadoop模塊調(diào)用,用于支持Hadoop的運(yùn)行。HadoopCommon帶來的應(yīng)用、工具使得任何計(jì)算機(jī)都可以成為Hadoop網(wǎng)絡(luò)的一部分,從而消除了可能在任何給定時(shí)間連接到網(wǎng)絡(luò)的不同硬件節(jié)點(diǎn)之間的差異。1Hadoop—Hadoop1.0集群組成Hadoop1.0集群由一個(gè)主節(jié)點(diǎn)(master)和多個(gè)從節(jié)點(diǎn)(slave)組成:主節(jié)點(diǎn)包括JobTracker、TaskTracker、NameNode和DataNode;從節(jié)點(diǎn)包括DataNode和TaskTrackerJobTracker1Hadoop—Hadoop1.0集群組成NameNodeNameNode常被稱為名字節(jié)點(diǎn)、元數(shù)據(jù)節(jié)點(diǎn)、主節(jié)點(diǎn)等,它是HDFS集群中的主服務(wù)器;Hadoop集群通常還會(huì)設(shè)立備用NameNode,稱為“SecondaryNameNode”,一旦NameNode不能使用,可以用備用NameNode提供服務(wù)支持;NameNode通過執(zhí)行諸如打開、重命名和關(guān)閉文件之類的操作來管理文件系統(tǒng)命名空間;NameNode統(tǒng)一提供系統(tǒng)的對外接口,簡化了整個(gè)系統(tǒng)的體系結(jié)構(gòu)和使用模式。
1Hadoop—Hadoop1.0集群組成DataNodeHDFS集群可以包含多個(gè)DataNode;每個(gè)DataNode包含多個(gè)數(shù)據(jù)塊,這些數(shù)據(jù)塊用于存儲(chǔ)數(shù)據(jù);DataNode負(fù)責(zé)根據(jù)文件系統(tǒng)客戶端的請求讀取和寫入數(shù)據(jù);DataNode根據(jù)NameNode的指令執(zhí)行塊創(chuàng)建、刪除和復(fù)制;1Hadoop—Hadoop1.0集群組成JobTracker和TaskTrackerJobTracker和TaskTracker用于任務(wù)調(diào)度;JobTracker負(fù)責(zé)資源管理、任務(wù)調(diào)度TaskTracker負(fù)責(zé)管理被分到DataNode的計(jì)算任務(wù)、資源匯報(bào)TaskTracker與JobTracker之間維持心跳,實(shí)時(shí)匯報(bào)當(dāng)前DataNode資源所剩情況。1Hadoop—Hadoop1.0集群組成JobTracker(作業(yè)追蹤器)JobTracker的作用是接受來自客戶端的MapReduce作業(yè),并使用NameNode處理數(shù)據(jù)。
作為響應(yīng),NameNode向JobTracker提供元數(shù)據(jù)。
TaskTracker(任務(wù)追蹤)TaskTracker作為JobTracker的從屬節(jié)點(diǎn)。TaskTracker從JobTracker接收任務(wù)和代碼,并將這些代碼用于處理文件數(shù)據(jù),這個(gè)過程也可以稱為Mapper。1Hadoop—Hadoop1.0集群組成Hadoop1.0的JobTracker存在的問題:JobTracker是單點(diǎn)的,必然存在單點(diǎn)故障問題;因?yàn)镴obTracker集成了資源管理和任務(wù)調(diào)度,存在壓力過大的問題;若有新的非MapReduce計(jì)算框架,則不能復(fù)用資源管理,新的計(jì)算框架必將各自實(shí)現(xiàn)自己的資源管理,從而造成資源競爭。1Hadoop—Hadoop2.0中Yarn模型Hadoop2.x中引入了全新的資源調(diào)度方案Yarn,Yarn將資源管理和任務(wù)調(diào)度分開,解耦了JobTracker的功能。Yarn與MapReduce無關(guān),Yarn是獨(dú)立的資源層,除了支持MapReduce計(jì)算框架,還支持Spark等其他計(jì)算模型,從而增強(qiáng)了資源的統(tǒng)一管理和調(diào)度。Yarn從整體上還是屬于master/slave模型,主要依賴于ResourceManager、NodeManager、ApplicationMaster三個(gè)組件來實(shí)現(xiàn)功能JobTrackeTaskTracker作業(yè)小組長1Hadoop—Hadoop2.0中Yarn模型1.client提交作業(yè)給Yarn后,RM首先和NM進(jìn)行通信,通信的目的是為了給APPMater分配第一個(gè)容器2.APPMaster啟動(dòng)之后會(huì)對任務(wù)進(jìn)行拆分,需要多個(gè)container(因?yàn)橐粋€(gè)container無法完全執(zhí)行一個(gè)Task)在多個(gè)容器中執(zhí)行。因此APPMaster要向RM發(fā)送心跳,向RM進(jìn)行申請運(yùn)行程序的一些容器3.AM要和運(yùn)行任務(wù)的container保持心跳因?yàn)槿蝿?wù)運(yùn)行的成功/失敗的狀態(tài)AM必須要知道,知道的前提就是AM和container保持心跳關(guān)系。當(dāng)任務(wù)執(zhí)行完成后,AM會(huì)像RM進(jìn)行申請,注銷container,該container所處的NM的資源就得到了釋放如果任務(wù)執(zhí)行失敗,AM會(huì)像RM進(jìn)行申請,在另外的節(jié)點(diǎn)上啟動(dòng)一個(gè)container運(yùn)行任務(wù)(新的container只會(huì)運(yùn)行還未運(yùn)行的任務(wù),運(yùn)行完的任務(wù)是已經(jīng)得到保存的)1Hadoop—Hadoop2.0中Yarn模型ResourceManagerResourceManager擁有系統(tǒng)所有資源分配的決定權(quán),負(fù)責(zé)集群中所有應(yīng)用程序的資源分配,擁有集群資源的全局視圖,為用戶提供公平的、基于容量的、本地化的資源調(diào)度,根據(jù)程序的需求、調(diào)度優(yōu)先級以及可用資源情況,動(dòng)態(tài)分配特定節(jié)點(diǎn)運(yùn)行應(yīng)用程序。它與每個(gè)節(jié)點(diǎn)上的NodeManager和每個(gè)應(yīng)用程序的ApplicationMaster協(xié)調(diào)工作。1Hadoop—Hadoop2.0中Yarn模型ResourceManager主要包含兩個(gè)組件:Scheduler和ApplicationManager:Scheduler是一個(gè)可插拔的插件,負(fù)責(zé)運(yùn)行中的各個(gè)應(yīng)用程序的資源分配,受資源容量、隊(duì)列以及其他因素的影響;在Hadoop中資源調(diào)度器有三種,默認(rèn)的調(diào)度器是原始的基于隊(duì)列的先入先出調(diào)度器(FIFOScheduler);還有兩個(gè)多用戶調(diào)度器:公平調(diào)度器(FairScheduler)、計(jì)算能力調(diào)度器(CapacityScheduler);1Hadoop—Hadoop2.0中Yarn模型ApplicationMasterApplicationMaster負(fù)責(zé)與Scheduler協(xié)商合適的Container,跟蹤應(yīng)用程序的狀態(tài),以及監(jiān)控它們的進(jìn)度,ApplicationMaster是協(xié)調(diào)集群中應(yīng)用程序執(zhí)行的進(jìn)程。每個(gè)應(yīng)用程序都有自己的ApplicationMaster,負(fù)責(zé)與ResourceManager協(xié)商資源(Container)和NodeManager協(xié)同工作來執(zhí)行和監(jiān)控任務(wù)。當(dāng)一個(gè)ApplicationMaster啟動(dòng)后,會(huì)周期性的向ResourceManager發(fā)送心跳報(bào)告來確認(rèn)其健康和所需的資源情況。根據(jù)ResourceManager發(fā)來的Container,ApplicationMaster可以更新它的執(zhí)行計(jì)劃以適應(yīng)資源不足或者過剩,Container可以動(dòng)態(tài)的分配和釋放資源。1Hadoop—Hadoop2.0中Yarn模型Container是Yarn框架的計(jì)算單元,是具體執(zhí)行應(yīng)用task的基本單位。Container和集群節(jié)點(diǎn)的關(guān)系是:一個(gè)節(jié)點(diǎn)會(huì)運(yùn)行多個(gè)Container,但一個(gè)Container只運(yùn)行在一個(gè)節(jié)點(diǎn)上。每個(gè)應(yīng)用程序從ApplicationMaster開始,它本身就是一個(gè)Container(第0個(gè)),一旦啟動(dòng),ApplicationMaster就會(huì)根據(jù)任務(wù)需求與ResourceManager協(xié)商更多的Container,在運(yùn)行過程中可以動(dòng)態(tài)釋放和申請Container。1Hadoop—Hadoop2.0中Yarn模型NodeManagerNodeManager是Yarn節(jié)點(diǎn)的一個(gè)工作代理,管理Hadoop集群中獨(dú)立的計(jì)算節(jié)點(diǎn),主要負(fù)責(zé)與ResourceManager通信,負(fù)責(zé)啟動(dòng)和管理應(yīng)用程序的Container的生命周期,監(jiān)控它們的資源使用情況(CPU和內(nèi)存),跟蹤節(jié)點(diǎn)的監(jiān)控狀態(tài)、管理日志等,并將這些信息報(bào)告給RM。HDFS體系結(jié)構(gòu)022HDFS體系結(jié)構(gòu)HDFS(Hadoop分布式文件系統(tǒng))是一種運(yùn)行在通用計(jì)算機(jī)(commodityhardware)上的分布式文件系統(tǒng),與現(xiàn)有的分布式文件系統(tǒng)有顯著的差異。HDFS設(shè)計(jì)用于部署在低成本硬件上,具有高容錯(cuò)性。HDFS提供對應(yīng)用程序數(shù)據(jù)的高吞吐量訪問,適合處理超大數(shù)據(jù)集的應(yīng)用程序。2HDFS體系結(jié)構(gòu)—HDFS的設(shè)計(jì)目標(biāo)1.克服硬件故障一個(gè)HDFS實(shí)例可能由成百上千臺(tái)服務(wù)器組成,每臺(tái)服務(wù)器都存儲(chǔ)文件系統(tǒng)的部分?jǐn)?shù)據(jù),而每臺(tái)服務(wù)器都是由大量的組件組成,每個(gè)組件都有一定的故障概率,這就意味著HDFS實(shí)例中總有些組件可能產(chǎn)生故障。因此,檢測故障并快速、自動(dòng)地從故障中恢復(fù)是HDFS架構(gòu)的核心目標(biāo)。2.支持大數(shù)據(jù)集運(yùn)行在HDFS上的應(yīng)用程序通常都以處理大數(shù)據(jù)集為目標(biāo),HDFS中的文件大小一般為千兆字節(jié)到T字節(jié),因此HDFS被設(shè)計(jì)為支持大文件。HDFS應(yīng)該提供高聚合數(shù)據(jù)帶寬,并且可以擴(kuò)展到單個(gè)集群中的數(shù)百個(gè)節(jié)點(diǎn),一個(gè)HDFS實(shí)例應(yīng)可以支持?jǐn)?shù)千萬個(gè)文件。2HDFS體系結(jié)構(gòu)—HDFS的設(shè)計(jì)目標(biāo)3.簡單一致性模型HDFS應(yīng)用程序需要滿足write-once-read-many的文件存取模型。文件一旦創(chuàng)建、寫入后,除了擴(kuò)展文件和截?cái)辔募?,不需要其他更改方式。擴(kuò)展文件是指將內(nèi)容附加到文件末尾,而不是更新文件任意位置的數(shù)據(jù),簡化了數(shù)據(jù)一致性問題,并實(shí)現(xiàn)了高吞吐量的數(shù)據(jù)存取。這種文件系統(tǒng)的存取模型非常符合MapReduce應(yīng)用程序或web爬蟲應(yīng)用程序的需求。2HDFS體系結(jié)構(gòu)—HDFS的設(shè)計(jì)目標(biāo)4.計(jì)算移動(dòng)或數(shù)據(jù)移動(dòng)如果應(yīng)用程序?qū)?shù)據(jù)的操作能夠離數(shù)據(jù)更近些,那么其執(zhí)行效率會(huì)高得多,當(dāng)數(shù)據(jù)集非常大時(shí),這種優(yōu)勢更加明顯。這種計(jì)算移動(dòng)到離數(shù)據(jù)更近的模式可以最大限度地減少網(wǎng)絡(luò)擁塞并提高系統(tǒng)的總體吞吐量。通常最好將計(jì)算遷移到數(shù)據(jù)所在的位置,而不是將數(shù)據(jù)移動(dòng)到應(yīng)用程序運(yùn)行的位置。HDFS為應(yīng)用程序提供接口,使它們能夠更靠近數(shù)據(jù)所在的位置。5.異構(gòu)硬件的兼容性和軟件平臺(tái)的可移植性HDFS被設(shè)計(jì)成易于從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái),這有助于采用HDFS作為應(yīng)用程序的平臺(tái)。2HDFS體系結(jié)構(gòu)—Namenode和DatanodeHDFS是一種主/從體系結(jié)構(gòu),HDFS集群由一個(gè)NameNode和一個(gè)主服務(wù)器以及多個(gè)Datanode組成。主服務(wù)器管理文件系統(tǒng)命名空間并控制客戶端對文件的訪問。一般情況下,集群的每個(gè)節(jié)點(diǎn)都有一個(gè)DataNode,它們負(fù)責(zé)管理連接到它們所在節(jié)點(diǎn)上的存儲(chǔ)。HDFS通過一個(gè)統(tǒng)一的文件系統(tǒng)命名空間展示系統(tǒng)文件結(jié)構(gòu),并允許用戶提交數(shù)據(jù)存儲(chǔ)到文件中。在系統(tǒng)內(nèi)部,文件被分成一個(gè)或多個(gè)塊,這些塊存儲(chǔ)在一組DataNode中。NameNode執(zhí)行文件系統(tǒng)命名空間的相關(guān)操作,如打開、關(guān)閉和重命名文件和目錄等;除此之外,它還確定文件塊到數(shù)據(jù)節(jié)點(diǎn)的映射。DataNode負(fù)責(zé)處理來自文件系統(tǒng)客戶端的讀寫請求,并根據(jù)NameNode的指令執(zhí)行塊創(chuàng)建、刪除和復(fù)制。2HDFS體系結(jié)構(gòu)—Namenode和DatanodeHDFS體系結(jié)構(gòu)(主—從結(jié)構(gòu))示意圖2HDFS體系結(jié)構(gòu)—Namenode和DatanodeNamenode的元數(shù)據(jù)信息:文件屬性信息:文件名稱、權(quán)限、時(shí)間、大小、復(fù)制因子、數(shù)據(jù)塊大小;文件塊位置信息:文件塊與Datanode間的映射信息;以fsimage和edits將內(nèi)存中的數(shù)據(jù)存入磁盤,再次啟動(dòng)時(shí)會(huì)讀取這些信息;Namenode和Datanode之間維持心跳信息,Datanode隔一段時(shí)間向Namenode發(fā)送心跳包,告訴Namenode它還存在。2HDFS體系結(jié)構(gòu)—讀取數(shù)據(jù)原理HDFS讀取數(shù)據(jù)的過程客戶端軟件通過DistrubutedFileSystem和FSDataInputStream實(shí)現(xiàn)與HDFS系統(tǒng)的交互,從而隔離了用戶程序與HDFS文件系統(tǒng)的復(fù)雜交互過程,大大簡化了Hadoop分布式文件系統(tǒng)的應(yīng)用。2HDFS體系結(jié)構(gòu)—寫數(shù)據(jù)原理HDFS寫入數(shù)據(jù)過程客戶端只在開始和結(jié)束時(shí)與NameNode交互,大大減輕NameNode的負(fù)擔(dān)。在具體的寫入過程中,由FSDataOutputStream實(shí)現(xiàn)與各數(shù)據(jù)節(jié)點(diǎn)的交互,大大簡化了用戶對文件的操作。ACK應(yīng)答機(jī)制:Datanode保存一個(gè)packet成功后,回給一個(gè)應(yīng)答寫文件的過程中會(huì)與Namenode通信,報(bào)告寫的情況2HDFS體系結(jié)構(gòu)—文件系統(tǒng)命名空間HDFS支持傳統(tǒng)的分層文件組織,用戶或應(yīng)用程序可以創(chuàng)建目錄并在這些目錄中存儲(chǔ)文件。文件系統(tǒng)命名空間(TheFileSystemNamespace)層次結(jié)構(gòu)與大多數(shù)現(xiàn)有文件系統(tǒng)相似,可以創(chuàng)建和刪除文件、移動(dòng)文件或重命名文件。NameNode維護(hù)文件系統(tǒng)命名空間,對文件系統(tǒng)命名空間或其屬性的任何更改都由NameNode加以記錄。文件副本數(shù)稱為文件的復(fù)制因子,應(yīng)用程序可以指定由HDFS維護(hù)的文件副本數(shù)量,這些信息由NameNode存儲(chǔ)和維護(hù)。2HDFS體系結(jié)構(gòu)—數(shù)據(jù)容錯(cuò)HDFS可以在大型集群中跨機(jī)器可靠地存儲(chǔ)大型文件,它將每個(gè)文件存儲(chǔ)為一個(gè)塊序列,通過復(fù)制文件塊來實(shí)現(xiàn)容錯(cuò)。一個(gè)文件中除最后一個(gè)塊以外,所有塊都具有相同的大小。每個(gè)文件都可以配置塊大小和復(fù)制因子,應(yīng)用程序可以指定文件的副本數(shù)。HDFS中的文件只寫一次,之后可以利用appends和truncates對文件進(jìn)行擴(kuò)展和截?cái)?。HDFS嚴(yán)格限定同時(shí)只能有一個(gè)應(yīng)用程序?qū)崿F(xiàn)文件的寫入操作。NameNode做出關(guān)于塊復(fù)制的所有決策,它定期從集群中的每個(gè)DataNode接收心跳和文件數(shù)據(jù)塊報(bào)告(BlockReport)。接收到心跳意味著DataNode運(yùn)行正常,BlockReport則包含DataNode上所有塊的列表。2HDFS體系結(jié)構(gòu)—副本的管理與使用副本的放置對HDFS的可靠性和性能至關(guān)重要?;跈C(jī)架感知的副本放置策略可以提高數(shù)據(jù)可靠性、可用性和網(wǎng)絡(luò)帶寬利用率。大型HDFS實(shí)例通常運(yùn)行于分布在多個(gè)機(jī)架上的計(jì)算機(jī)集群上。不同機(jī)架上的兩個(gè)節(jié)點(diǎn)之間必須通過交換機(jī)進(jìn)行通信。在大多數(shù)情況下,同一機(jī)架中的計(jì)算機(jī)之間的網(wǎng)絡(luò)帶寬大于不同機(jī)架上計(jì)算機(jī)之間的網(wǎng)絡(luò)帶寬。NameNode通過Hadoop機(jī)架感知過程確定每個(gè)DataNode所屬的機(jī)架id。一個(gè)簡單但非最佳的策略是將副本放在不同的機(jī)架上,這可以防止整個(gè)機(jī)架發(fā)生故障時(shí)丟失數(shù)據(jù),并允許在讀取數(shù)據(jù)時(shí)使用多個(gè)機(jī)架的帶寬。2HDFS體系結(jié)構(gòu)—副本的管理與使用當(dāng)復(fù)制因子為3時(shí),HDFS的放置策略是:如果writer位于DataNode上,則將一個(gè)副本放在本地計(jì)算機(jī)上;否則,將一個(gè)副本放在與writer相同機(jī)架(機(jī)架A)上隨機(jī)的DataNode上;另外一個(gè)副本放在另一個(gè)機(jī)架的節(jié)點(diǎn)上。此策略可減少機(jī)架間的寫入流量,從而提高寫入性能。由于機(jī)架故障的概率遠(yuǎn)小于節(jié)點(diǎn)故障的概率,因此,該策略不會(huì)影響數(shù)據(jù)可靠性和可用性。如果復(fù)制因子大于3,則隨機(jī)確定第4個(gè)和后續(xù)副本的位置,同時(shí)將每個(gè)機(jī)架的副本數(shù)保持在上限以下(例如:(副本數(shù)-1)/機(jī)架+2)。由于NameNode不允許一個(gè)DataNode擁有同一塊的多個(gè)副本,所以創(chuàng)建的最大副本數(shù)就是此時(shí)DataNode的總數(shù)。2HDFS體系結(jié)構(gòu)—副本的管理與使用將存儲(chǔ)介質(zhì)和存儲(chǔ)策略的支持添加到HDFS之后,除了機(jī)架感知策略外,NameNode還將考慮到副本放置。NameNode首先根據(jù)機(jī)架感知選擇節(jié)點(diǎn),然后檢查其是否具有與文件關(guān)聯(lián)的策略所需的存儲(chǔ)空間,如果沒有,NameNode將查找另一個(gè)節(jié)點(diǎn)。如果在第一條路徑中找不到足夠的節(jié)點(diǎn)來放置副本,NameNode會(huì)在第二條路徑中查找具有后備存儲(chǔ)介質(zhì)的節(jié)點(diǎn)。為了最小化全局帶寬消耗和讀取延遲,HDFS首先嘗試最接近讀請求位置的副本。如果在與讀請求節(jié)點(diǎn)相同的機(jī)架上存在一個(gè)副本,則首選該副本來滿足讀取請求。如果HDFS集群跨越多個(gè)數(shù)據(jù)中心,那么駐留在本地?cái)?shù)據(jù)中心的副本比任何遠(yuǎn)程副本都要優(yōu)先考慮。2HDFS體系結(jié)構(gòu)—特性總結(jié)從主結(jié)構(gòu):一主多從,各司其職,互相配合;分塊存儲(chǔ)機(jī)制:文件物理被拆分,放在多臺(tái)機(jī)器上,可以并行處理,負(fù)載均衡;副本機(jī)制:數(shù)據(jù)存儲(chǔ)安全,如設(shè)dfs.replication的值為3,也就是會(huì)額外再復(fù)制2份,連同本身共3份副本。Namespace:層次型的文件組織結(jié)構(gòu),與本地文件系統(tǒng)類似。HDFS初探033HDFS初探—開始HDFS旅程在使用HDFS文件系統(tǒng)前,需要先對文件系統(tǒng)進(jìn)行格式化。在NameNode(HDFS服務(wù)器)上輸入并執(zhí)行“hadoopnamenode-format”命令,其執(zhí)行過程如下:3HDFS初探—開始HDFS旅程格式化HDFS后,便可以啟動(dòng)Hadoop分布式文件系統(tǒng),執(zhí)行如下命令將會(huì)啟動(dòng)NameNode以及DataNode。3Hadoop初探—命令結(jié)構(gòu)Hadoop命令都遵循相同的命令格式:Usage:shellcommand[SHELL_OPTIONS][COMMAND][GENERIC_OPTIONS][COMMAND_OPTIONS]Hadoop命令的各個(gè)部分對應(yīng)描述如下:Shellcommand:不同的Hadoop子項(xiàng)目都有不同的命令名稱,例如,HadoopCommon對應(yīng)hadoop,HDFS對應(yīng)hdfs,YARN對應(yīng)yarn;SHELL_OPTIONS:Shell在執(zhí)行Java前需執(zhí)行的選項(xiàng),例如加載配置文件,其可設(shè)置參數(shù)如表4.2所示。COMMAND:具體的命令;GENERIC_OPTIONS:多數(shù)命令都支持的一些可選項(xiàng)設(shè)置;COMMAND_OPTIONS:各種命令特有的一些可選設(shè)置項(xiàng)。3HDFS初探—開始HDFS旅程使用“l(fā)s”命令可以查看文件系統(tǒng)中的文件信息,格式如下:“$HADOOP_HOME”是Hadoop安裝目錄,可以將”$HADOOP_HOME/bin”加入$PATH中,即可以直接執(zhí)行hadoop命令。例如,使用“hadoopfs-ls”查看根目錄信息:3HDFS初探—添加數(shù)據(jù)文件將本地?cái)?shù)據(jù)文件“file.txt”存儲(chǔ)到HDFS中的“/user/input”文件夾下,可按下述操作執(zhí)行:
創(chuàng)建存儲(chǔ)文件夾
使用put命令上傳文件
查看操作是否成功3HDFS初探—添加數(shù)據(jù)文件例如:創(chuàng)建一個(gè)文件夾,再利用touch命令創(chuàng)建一個(gè)空的文件,往該文件中寫入“helloworld”,上傳文件至HDFS并查看,其執(zhí)行過程如下:3HDFS初探—從HDFS中下載文件將HDFS中的數(shù)據(jù)文件“/user/output/outfile”下載到本地文件系統(tǒng),操作如下:“cat”命令查看文件:“get”命令把文件從HDFS中下載到本地文件系統(tǒng):3HDFS初探—關(guān)閉HDFS若要關(guān)閉HDFS,可以使用stop-dfs.sh命令3HDFS初探—利用WebConsole訪問HDFSHDFS啟動(dòng)后,可以直接通過WebConsole訪問HDFS。在瀏覽器中輸入:http://ip:50070,如果修改了端口號,則利用修改后的端口號訪問。Web控制臺(tái)提供了最基本的文件操作。3HDFS初探—利用WebConsole訪問HDFS選擇Utilities->Browsethefilesystem選項(xiàng)可以進(jìn)入HDFS文件系統(tǒng)進(jìn)行文件的查看和管理操作。文件管理主界面如圖所示3HDFS初探—利用WebConsole訪問HDFSHDFS啟動(dòng)后,可以直接通過WebConsole訪問HDFS。在瀏覽器中輸入:http://ip:50070,如果修改了端口號,則利用修改后的端口號訪問。Web控制臺(tái)提供了最基本的文件操作。HDFS常用CLI命令044HDFS常用CLI命令—HDFS
CLI總覽CLI(交互式命令行界面)下,用戶通過命令行直接連接HDFS,實(shí)現(xiàn)文件系統(tǒng)的各種操作。CLI是訪問和操作HDFS系統(tǒng)最常用的方式。FSshell命令將路徑URI作為參數(shù)。URI格式為“scheme://權(quán)限/路徑”。對于HDFS,scheme為“hdfs”,對于本地文件系統(tǒng),scheme為“file”。scheme和權(quán)限是可選的,在未指定的情況下,使用默認(rèn)scheme設(shè)置。4HDFS常用CLI命令—HDFS
CLI總覽查看HDFS中文件夾“/data”的幾種方式:在本機(jī)中訪問時(shí),缺省的端口號、甚至HDFS服務(wù)器地址都可以自動(dòng)補(bǔ)全。本書中“hadoopfs…”等同于“hdfsdfs…”,系統(tǒng)執(zhí)行效果是一致的4HDFS常用CLI命令—HDFS
CLI總覽例如:在HDFS根文件夾下存在目錄“data”,查看結(jié)果如下:文件系統(tǒng)操作命令的幫助信息可以使用“hadoopfs–help”查看4常用HDFS文件操作命令訪問本地文件時(shí)可以使用直接路徑訪問方式,如“/home/Hadoop/localfile”;也可以顯式指明該文件為本地文件,例如“file:///home/Hadoop/localfile”。利用SSH登錄到目標(biāo)節(jié)點(diǎn)后,訪問HDFS文件系統(tǒng)中的文件可以使用直接路徑的模式“/user/Hadoop/hdfsfile”,若要訪問遠(yuǎn)程的HDFS系統(tǒng)中的文件,則可以增加主機(jī)名和端口號,例如“hdfs://Node01:9000/user/Hadoop/hdfsfile”。4常用HDFS文件操作命令1.a(chǎn)ppendToFile用法:hadoopfs-appendToFile<localsrc>...<dst>說明:用于把本地文件系統(tǒng)的一個(gè)或者若干個(gè)文件附加到目標(biāo)文件系統(tǒng)的指定文件后。其輸入源也可以是“STDIN”中的輸入數(shù)據(jù)。4常用HDFS文件操作命令附加單個(gè)本地文件到HDFS文件后,遠(yuǎn)程HDFS文件可用主機(jī):端口方式指定,Node01表示NameNode的ip地址或者主機(jī)名:附加多個(gè)文件的命令模式,遠(yuǎn)程文件采用簡單表示模式:本地文件名指定為“-”表示從“STDIN”輸入數(shù)據(jù)附加到HDFS文件中,其命令模式如下:4常用HDFS文件操作命令【例4.1】展示appendfile命令附加多個(gè)文件的應(yīng)用4常用HDFS文件操作命令2.cat用法:hadoopfs-cat[-ignoreCrc]URI[URI...]說明:把指定的文件輸出到STDOUT,在沒有其他設(shè)定的情況下,STDOUT對應(yīng)屏幕輸出。-ignoreCrc:用于指定是否要進(jìn)行CRC校驗(yàn)。其中URI缺省情況為HDFS系統(tǒng)中的文件,若指定本地文件系統(tǒng)中的文件,則使用“file://”表示。4常用HDFS文件操作命令【例4.2】在終端顯示HDFS上根目錄下的文件file1和file2?!纠?.3】在終端顯示本地文件系統(tǒng)“/usr/home/localfile”和HDFS上的文件“/usr/Hadoop/hadoopfile”。需要注意的是,“hadoopfs-cat”命令缺省目標(biāo)文件系統(tǒng)為HDFS,若用其打印輸出本地文件系統(tǒng)文件,則需完整的URI。4常用HDFS文件操作命令3.copyFromLocal用法:hadoopfs-copyFromLocal[-f][-p][-l][-d]<localsrc>URI說明:把本地文件系統(tǒng)中的文件復(fù)制到HDFS文件系統(tǒng)中。其功能類似于put命令,只是要求源文件來自本地文件系統(tǒng)。-f:設(shè)定當(dāng)目標(biāo)文件已經(jīng)存在時(shí),強(qiáng)行覆蓋;-p:設(shè)定保持存取和修改的時(shí)間,文件擁有者以及各種權(quán)限;-l:允許數(shù)據(jù)節(jié)點(diǎn)采用惰性存儲(chǔ)方式(延遲將文件持久化寫入磁盤),強(qiáng)制重復(fù)因子為1,該參數(shù)可能導(dǎo)致文件的容錯(cuò)性降低;-d:跳過創(chuàng)建臨時(shí)文件步驟,該臨時(shí)文件以“._COPYING_“為后綴。4常用HDFS文件操作命令【例4.4】把本地文件當(dāng)前文件夾下的文件localfile1復(fù)制到HDFS的“/user/hadoop/”文件夾中。4常用HDFS文件操作命令4.cp用法:hadoopfs-cp[-f][-p|-p[topax]]URI[URI...]<dest>說明:文件復(fù)制。<dest>是文件路徑時(shí),源文件可以是多個(gè)文件,或者通配符匹配的文件列表。-f:設(shè)定當(dāng)目標(biāo)文件已經(jīng)存在時(shí),強(qiáng)行覆蓋;-p:設(shè)定在目標(biāo)文件中保持源文件的一些屬性,包括時(shí)間、擁有者、權(quán)限等?!纠?.5】把HDFS文件系統(tǒng)中的文件“/user/hadoop/file1”復(fù)制到指定文件夾下,目標(biāo)文件名為file2。4常用HDFS文件操作命令5.df用法:hadoopfs-df[-h]URI[URI...]說明:顯示可用空間的大小。-h:用于設(shè)定空間大小的顯示方式是否為適合人類閱讀模式。【例4.6】顯示/user/hadoop/dir1文件夾下的相關(guān)信息4常用HDFS文件操作命令6.du用法:hadoopfs-du[-s][-h]URI[URI...]說明:顯示指定目錄中包含的文件和目錄的大小,如果是文件,則顯示文件的長度。-s:設(shè)置顯示文件總體摘要,而不僅僅是單個(gè)文件信息。-h:設(shè)定空間大小的顯示方式是否為適合人類閱讀模式?!纠?.7】展示HDFS文件夾/user/hadoop/dir1的目錄信息。4常用HDFS文件操作命令7.find用法:hadoopfs-find<path>...[-name|-iname<pattern>]-print<expression>...說明:查找與指定表達(dá)式匹配的所有文件,并對其執(zhí)行選定的操作。如果未指定路徑,則默認(rèn)為當(dāng)前工作目錄。如果未指定表達(dá)式,則默認(rèn)為-print。-namepattern:指定查找文件的匹配模式;-inamepattern:作用同上,不區(qū)分文件大小寫;-print:在標(biāo)準(zhǔn)輸出上輸出查找結(jié)果;expression:表達(dá)式<expression>可以是多個(gè)表達(dá)式的and,以此加強(qiáng)過濾條件4常用HDFS文件操作命令【例4.8】查找HDFS文件夾/user下是否存在myhadoop.cfg文件4常用HDFS文件操作命令8.get用法:hadoopfs-get[-ignorecrc][-crc][-p][-f]<src><localdst>說明:將文件復(fù)制到本地文件系統(tǒng)。-p:保持存取、修改的時(shí)間、文件所有者、權(quán)限等信息;-f:若目標(biāo)文件已經(jīng)存在,則覆蓋;-ignorecrc:設(shè)置為在復(fù)制文件到本地時(shí)不進(jìn)行CRC校驗(yàn),CRC檢查失敗的文件可以使用此選項(xiàng)進(jìn)行復(fù)制,-crc:同時(shí)進(jìn)行CRC校驗(yàn);4常用HDFS文件操作命令【例4.9】把HDFS文件夾“/user/hadoop/”下的文件file4下載到本地,本地文件命名為localfile,其中第二命令詳細(xì)指定了HDFS文件系統(tǒng)的節(jié)點(diǎn)名稱和端口號。4常用HDFS文件操作命令9.help用法:hadoopfs-help說明:查看fs的幫助【例4.10】查看ls的幫助信息。4常用HDFS文件操作命令10.ls用法:hadoopfs-ls[-d][-h][-R]<args>說明:查看文件信息。若是文件,則輸出信息為“permissions(權(quán)限)、number_of_replicas(副本數(shù))、userid(所屬用戶)、groupid(所屬組)、filesize(文件大小)、modification_date(最近修改日期)、modification_time(最近修改時(shí)間)、filename(文件名)”;若是文件夾,則輸出信息為“permissions(權(quán)限)、userid(所屬用戶)、groupid(所屬組)、modification_date(最近修改日期)、modification_time(最近修改時(shí)間)、dirname(文件夾名稱)”。-d:目錄當(dāng)成普通文件列出;-h:用于設(shè)定空間大小的顯示方式是否為適合人類閱讀模式;-R:遞歸地列出所有文件和目錄。4常用HDFS文件操作命令【例4.11】列出HDFS上“/user/hadoop/file1”文件信息。4常用HDFS文件操作命令11.mkdir用法:hadoopfs-mkdir[-p]<paths>說明:創(chuàng)建文件夾。-p:設(shè)定為是否創(chuàng)建目標(biāo)路徑path中途的文件夾;【例4.12】創(chuàng)建兩個(gè)文件夾。【例4.13】創(chuàng)建文件夾“/user/hadoop/dir/subdir”,設(shè)置了參數(shù)“-p”,則若“/user/hadoop/dir”不存在,先自動(dòng)創(chuàng)建該文件夾,之后再創(chuàng)建subdir。4常用HDFS文件操作命令12.mv用法:hadoopfs-mvURI[URI...]<dest>說明:將文件從源移動(dòng)到目標(biāo),當(dāng)源包含多個(gè)文件時(shí),目標(biāo)應(yīng)是一個(gè)目錄。不允許跨文件系統(tǒng)移動(dòng)文件。若目標(biāo)和源文件在同一文件夾,mv實(shí)際上實(shí)現(xiàn)了文件的改名操作。【例4.14】把HDFS中的文件file1重命名為file2。【例4.15】把HDFS中的文件/user/hadoop/file1移動(dòng)到/dir1文件夾下4常用HDFS文件操作命令13.put用法:hadoopfs-put[-f][-p][-l][-d][-|<localsrc1>..].<dst>說明:將單個(gè)文件或多個(gè)文件從本地文件系統(tǒng)復(fù)制到目標(biāo)文件系統(tǒng)。如果源設(shè)置為“-”,則從STDIN讀取輸入并寫入目標(biāo)文件系統(tǒng)-p:保持存取、修改的時(shí)間、文件所有者、權(quán)限等信息;-f:若目標(biāo)文件已經(jīng)存在,則覆蓋;-l:允許數(shù)據(jù)節(jié)點(diǎn)采用惰性存儲(chǔ)方式(延遲將文件持久化寫入磁盤),強(qiáng)制重復(fù)因子為1,該參數(shù)可能導(dǎo)致文件的容錯(cuò)性降低;-d:跳過創(chuàng)建臨時(shí)文件步驟,該臨時(shí)文件以“._COPYING_“為后綴。4常用HDFS文件操作命令【例4.16】把本地文件localfile上傳到HDFS系統(tǒng)“/user/hadoop/”并命名為hadoopfile。4常用HDFS文件操作命令14.rm用法:hadoopfs-rm[-f][-r|-R][-skipTrash]URI[URI...]說明:刪除指定文件。如果啟用了垃圾箱,文件系統(tǒng)會(huì)將刪除的文件移到垃圾箱目錄。默認(rèn)情況下已禁用垃圾箱功能,用戶可以通過在配置文件“core-site.xml”設(shè)置大于零的間隔值來啟用垃圾箱。-f:該參數(shù)將關(guān)閉一些錯(cuò)誤信息的顯示,例如文件不存在等;-R:遞歸刪除文件夾中內(nèi)容;-r:等價(jià)于參數(shù)“-R”;-skipTrash:若設(shè)置該選項(xiàng),則直接刪除該文件,否則,在垃圾箱啟用情況下,將會(huì)把要?jiǎng)h除文件放入垃圾箱。4常用HDFS文件操作命令14.rm用法:hadoopfs-rm[-f][-r|-R][-skipTrash]URI[URI...]說明:刪除指定文件。如果啟用了垃圾箱,文件系統(tǒng)會(huì)將刪除的文件移到垃圾箱目錄。默認(rèn)情況下已禁用垃圾箱功能,用戶可以通過在配置文件“core-site.xml”設(shè)置大于零的間隔值來啟用垃圾箱。-f:該參數(shù)將關(guān)閉一些錯(cuò)誤信息的顯示,例如文件不存在等;-R:遞歸刪除文件夾中內(nèi)容;-r:等價(jià)于參數(shù)“-R”;-skipTrash:若設(shè)置該選項(xiàng),則直接刪除該文件,否則,在垃圾箱啟用情況下,將會(huì)把要?jiǎng)h除文件放入垃圾箱。4常用HDFS文件操作命令【例4.17】刪除HDFS中/dir1/file1文件以及/user/dir2文件夾下所有文件4常用HDFS文件操作命令15.rmdir用法:hadoopfs-rmdir[--ignore-fail-on-non-empty]URI[URI...]說明:刪除指定文件夾。--ignore-fail-on-non-empty:在使用通配符時(shí),如果一個(gè)文件夾包含文件,忽略錯(cuò)誤信息?!纠?.18】刪除HDFS中/user/hadoop/emptydir文件夾。利用pyhdfs實(shí)現(xiàn)HDFS的文件訪問055利用pyhdfs實(shí)現(xiàn)HDFS的文件訪問為了便于用戶編寫程序,Hadoop提供了豐富的API支持。Hadoop提供了JavaAPI供Java程序調(diào)用,這也是最重要的一種方式,大量二次開發(fā)的底層都是采用這種方式。Hadoop也針對其他語言開發(fā)了API支持,例如官方提供的CAPI的libhdfs。Hadoop也有支持Python開發(fā)的pyhdfs等。pyhdfs是對libhdfs的Python封裝庫。它提供了一些常用方法來處理HDFS上的文件和目錄,如:讀寫文件、枚舉目錄文件、顯示HDFS可用空間、顯示文件的復(fù)制塊數(shù)等。pyhdfs使用swig技術(shù),對libhdfs提供的絕大多數(shù)函數(shù)進(jìn)行了封裝,目的是提供更簡單的調(diào)用方式。5pyhdfs的安裝與應(yīng)用案例安裝pyhdfspyhdfs可以直接通過pip進(jìn)行安裝,操作命令如下:安裝完成后,可以啟動(dòng)Python,通過“importpyhdfs”驗(yàn)證是否安裝成功。5pyhdfs的安裝與應(yīng)用案例2.編寫Python程序新建HDFS的客戶端程序文件hello-pyhdfs.py,代碼如下:該程序首先引入pyhdfs庫,使用主機(jī)地址、端口號和用戶構(gòu)建HDFS文件系統(tǒng)的客戶端,然后利用client進(jìn)行各種文件的操作。首先創(chuàng)建根文件夾“/data”,然后列出根文件夾下的所有內(nèi)容,并逐一打印輸出。importpyhdfsclient=pyhdfs.HdfsClient(hosts="localhost:9870",user_name="root")client.mkdirs("/data")#創(chuàng)建文件夾forfileinclient.listdir("/"):print(file)5pyhdfs的安裝與應(yīng)用案例3.執(zhí)行Python程序在運(yùn)行程序前,先查看HDFS的根文件夾下已有文件,執(zhí)行“hello-pyhdfs.py”后,對比“hadoopfs-ls/”查看文件夾的情況。5pyhdfs的HdfsClient類pyhdfs中包含HdfsClient和其他相關(guān)輔助類,其中HdfsClient是整個(gè)pyhdfs的核心所在,是最關(guān)鍵的類。連接HDFS的Namenode,對HDFS上的文件進(jìn)行查詢、讀、寫操作等都是通過HdfsClient的實(shí)例完成。除了一些關(guān)鍵字參數(shù)外,所有函數(shù)都會(huì)將任意查詢參數(shù)直接傳遞給WebHDFS。特別的,任何函數(shù)都將接受用戶名或者user_name。對于Python語言,其函數(shù)經(jīng)常使用“**kwarg”來傳遞不常用、且個(gè)數(shù)可變的參數(shù)。在本節(jié)的剩余部分,部分函數(shù)參數(shù)說明中列出了可用的關(guān)鍵參數(shù),其用法為"參數(shù)名=參數(shù)值"的模式。5pyhdfs的HdfsClient類HdfsClient類對象的構(gòu)造函數(shù):參數(shù)說明:Hosts:NameNode的HTTP主機(jī)列表,主機(jī)名或IP地址與端口號之間需要用":"隔開,例如:hosts="37:9870";當(dāng)有多個(gè)主機(jī)時(shí)可以傳入字符串列表,例如:["54:9870","35:9870"]。randomize_hosts:是否可以隨機(jī)選擇host進(jìn)行連接,默認(rèn)為True;5pyhdfs的HdfsClient類user_name:連接的Hadoop平臺(tái)的用戶名,如果有設(shè)置環(huán)境變量HADOOP_USER_NAME,則缺省使用該變量,否則調(diào)用getpass.getuser()獲取用戶名;timeout:每個(gè)Namenode的HTTP主機(jī)連接等待的秒數(shù),默認(rèn)為20秒;該設(shè)置為了避免有些主機(jī)沒有響應(yīng)情況下導(dǎo)致的阻塞。max_tries:每個(gè)Namenode節(jié)點(diǎn)嘗試連接的次數(shù),默認(rèn)為2次;retry_delay:在嘗試連接一個(gè)Namenode節(jié)點(diǎn)失敗后,嘗試連接下一個(gè)Namenode的時(shí)間間隔,默認(rèn)5秒;requests_session:連接HDFS的HTTPrequest請求使用的session,默認(rèn)為None,為每個(gè)HTTP請求使用一個(gè)新的session,調(diào)用者需要負(fù)責(zé)session的關(guān)閉;requests_kwargs:其他需要傳遞給WebHDFS的參數(shù)。5pyhdfs的HdfsClient類【例4.19】利用HdfsClient構(gòu)造一個(gè)客戶端對象client,其設(shè)置可連接主機(jī)為namenode以及second_namenode。這兩個(gè)主機(jī)按照順序建立連接,先連接主namenode,連接不成功時(shí)再連接second_namenode,連接用戶名為”root”。該操作將返回一個(gè)HdfsClient對象。Client=pyhdfs.HdfsClient(hosts=["namenode:9870","second_namenode:9870"],randomize_hosts=False,user_name="root")5pyhdfs的HdfsClient類接下來介紹類庫中一些常用方法的功能及用法。特別注意,假設(shè)后續(xù)應(yīng)用實(shí)例中使用的/dir/file文件的初始內(nèi)容為:5pyhdfs的HdfsClient類1.方法append()方法語法:append(path:str,data:Union[bytes,IO[bytes]],**kwargs)→None方法描述:該方法的功能是向一個(gè)文件末尾追加內(nèi)容。參數(shù)說明:path(str):目標(biāo)文件名;data:需要追加的數(shù)據(jù),可以是bytes列表數(shù)據(jù),也可以是類似file的對象;buffersize(int):進(jìn)行數(shù)據(jù)傳輸時(shí)利用的緩沖區(qū)大小。5pyhdfs的HdfsClient類【例4.20】編寫程序Append1.py,將本地文件“/home/hadoop/bigdata/pyhdfsTest/file1”的內(nèi)容追加到HDFS中的/dir/file文件的末尾,程序代碼如下。程序執(zhí)行及運(yùn)行結(jié)果5pyhdfs的HdfsClient類2.方法concat()方法語法:concat(target:str,sources:List[str],**kwargs)→None方法描述:該方法的功能是將源文件列表中的文件合并為一個(gè)文件,將合并后的數(shù)據(jù)存放在目標(biāo)文件中。若目標(biāo)文件不存在,則拋出FileNotFoundException,若源文件列表為空,則拋出IllegalArgumentException;所有的源文件要和目標(biāo)文件在同一個(gè)文件夾中,否則拋出IllegalArgumentException;所有源文件的塊大?。╞locksizes)都必須與目標(biāo)文件塊大小一致;除最后一個(gè)文件外,其余所有源文件必須是一個(gè)完整的塊;源文件不能重復(fù)。參數(shù)說明:target:目標(biāo)文件,用于存放合并后的最終數(shù)據(jù);source(list):需要合并的源文件列表;5pyhdfs的HdfsClient類【例4.22】編寫程序hdfs_concat.py,該程序?qū)崿F(xiàn)將文件file1和文件file2的內(nèi)容合并后存放到文件newfile中,其程序源碼如下:5pyhdfs的HdfsClient類3.方法copy_from_local()方法語法:copy_from_local(localsrc:str,dest:str,**kwargs)→None方法描述:該方法的功能是從本地文件系統(tǒng)復(fù)制一個(gè)文件到目標(biāo)文件系統(tǒng)的指定目錄下。參數(shù)說明:localsrc(str):本地文件系統(tǒng)中的文件名;dest(str):目標(biāo)系統(tǒng)中的文件名;5pyhdfs的HdfsClient類【例4.23】編寫程序copy_from_local1.py,該程序?qū)崿F(xiàn)將本地文件系統(tǒng)中的文件"/home/hadoop/bigdata/pyhdfsTest/file1"復(fù)制到目標(biāo)文件系統(tǒng)中“/dir/”目錄下,目標(biāo)文件名為file1,其程序源碼如下:5pyhdfs的HdfsClient類4.方法copy_to_local()方法語法:copy_to_local(src:str,localdest:str,**kwargs)→None方法描述:該方法的功能是從源文件系統(tǒng)src復(fù)制文件到本地文件系統(tǒng)localdest。參數(shù)說明:localsrc(str):本地文件系統(tǒng)中的文件名;dest(str):目標(biāo)系統(tǒng)中的文件名;data:可以是一個(gè)文件對象,也可以字節(jié)列表(bytes)等;overwrite(bool):若目標(biāo)文件已經(jīng)存在,是否覆蓋?blocksize(long):文件的塊大小;replication(short):副本數(shù)設(shè)置;permission(octal):文件/目錄的權(quán)限,八進(jìn)制數(shù),如“700”表示所有者可讀、寫、執(zhí)行,所在組和其他用戶沒有任何權(quán)限;buffersize(int):傳輸數(shù)據(jù)過程中的緩沖區(qū)大小。5pyhdfs的HdfsClient類【例4.24】把HDFS文件系統(tǒng)的文件“/dir/file1”拷貝到本地,并存儲(chǔ)為文件"/home/hadoop/bigdata/pyhdfsTest/file1"。5pyhdfs的HdfsClient類5.方法create()方法語法:create(path:str,data:Union[IO[bytes],bytes],**kwargs)→None方法描述:該方法的功能是在指定路徑位置創(chuàng)建一個(gè)文件。參數(shù)說明:path(str):目標(biāo)文件名;data:可以是一個(gè)文件對象,也可以是字節(jié)列表(bytes)等;overwrite(bool):若目標(biāo)文件已經(jīng)存在,是否覆蓋?blocksize(long):文件的塊大??;replication(short):副本數(shù)設(shè)置;permission(octal):文件/目錄的權(quán)限,八進(jìn)制數(shù),如“700”表示所有者可讀、寫、執(zhí)行,所在組和其他用戶沒有任何權(quán)限;buffersize(int):傳輸數(shù)據(jù)過程中的緩沖區(qū)大小。5pyhdfs的HdfsClient類【例4.25】編寫程序hdfs_create.py,該程序?qū)崿F(xiàn)在指定目錄“/dir/”下創(chuàng)建一個(gè)新文件newfile,并讀取文件file1中的數(shù)據(jù)寫入新文件newfile中,如果newfile已經(jīng)存在則覆蓋。其具體源碼如下:5pyhdfs的HdfsClient類執(zhí)行程序hdfs_create.py,然后再次查看指定“/dir/”目錄下的文件列表,可見已經(jīng)創(chuàng)建了新文件newfile,其內(nèi)容大小與file1相同,說明在創(chuàng)建文件過程中寫入了file1文件的內(nèi)容。pyhdfs應(yīng)用實(shí)戰(zhàn)066pyhdfs應(yīng)用實(shí)戰(zhàn)數(shù)據(jù)中心在接收各數(shù)據(jù)采集站的數(shù)據(jù)時(shí),通常不是直接把數(shù)據(jù)寫入HDFS對應(yīng)的文件中,因?yàn)轭l繁打開HDFS文件進(jìn)行小規(guī)模數(shù)據(jù)的讀寫工作會(huì)極大降低Hadoop系統(tǒng)數(shù)據(jù)處理的效率。
因此,數(shù)據(jù)中心首先把各數(shù)據(jù)采集站發(fā)送的數(shù)據(jù)存儲(chǔ)在文件中,每個(gè)文件對應(yīng)一個(gè)數(shù)據(jù)采集站,等到當(dāng)天24時(shí)接收完所有數(shù)據(jù)采集站發(fā)送的數(shù)據(jù)后,再統(tǒng)一把數(shù)據(jù)與HDFS的數(shù)據(jù)文件進(jìn)行整合。現(xiàn)請你完成這一數(shù)據(jù)整合的過程。6pyhdfs應(yīng)用實(shí)戰(zhàn)輸入:每個(gè)數(shù)據(jù)采集站上報(bào)的數(shù)據(jù)都統(tǒng)一存儲(chǔ)在一個(gè)本地系統(tǒng)的文件夾中,文件夾中的每個(gè)文件對應(yīng)一個(gè)數(shù)據(jù)采集站上報(bào)的當(dāng)天數(shù)據(jù)信息。例如今天是2021年1月1日,那么當(dāng)天所有上報(bào)數(shù)據(jù)都存儲(chǔ)在“20210101”的文件夾中,如圖4.13所示;文件夾中的每個(gè)文件都是一個(gè)逗號隔開的“.csv”文件,如圖4.14所示。在HDFS系統(tǒng)中,專門用來存儲(chǔ)數(shù)據(jù)的文件為“/user/Hadoop/CityAQ/city-data.csv”6pyhdfs應(yīng)用實(shí)戰(zhàn)6pyhdfs應(yīng)用實(shí)戰(zhàn)輸出:把指定日期對應(yīng)的文件夾中的數(shù)據(jù)整合到HDFS的“/city-data.csv”文件中。思路分析:基于上述要求,我們將通過以下幾個(gè)步驟完成指定任務(wù):(1)根據(jù)輸入的日期確定對應(yīng)文件夾,利用pyhdfs建立HDFS客戶端;(2)獲取文件夾內(nèi)的文件列表,逐個(gè)讀取文件內(nèi)容,并利用append方法把數(shù)據(jù)添加到指定文件末尾;(3)完成上述任務(wù)后,斷開與HDFS的鏈接。6pyhdfs應(yīng)用實(shí)戰(zhàn)參考程序:MergeAQData.py#!/usr/bin/python3.6importpyhdfsimportosclient=pyhdfs.HdfsClient(hosts="localhost:9870",user_name="root")defread(dir):root=r'/home/hadoop/bigdata/pyhdfsTest/data/CityAQ'dir=os.path.join(root,dir)forfilesinos.listdir(dir):files=os.path.join(dir,files)withopen(files,'r',encoding='utf-8')asdata:forlineindata.readlines():client.append('/user/Hadoop/CityAQ/city-data.csv',\line.encode("utf-8").decode("latin-1"))defmain():dir='20200101'#指定的日期
read(dir)if__name__=="__main__":main()6pyhdfs應(yīng)用實(shí)戰(zhàn)編寫完成上述Python程序后,利用Python執(zhí)行該程序。之后把HDFS上的數(shù)據(jù)文件下載到本地,查看部分?jǐn)?shù)據(jù)信息,其具體執(zhí)行過程如下所示。本章小結(jié)077本章小結(jié)Hadoop是一個(gè)由Apache基金會(huì)所開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu)。他以HDFS(DistributedFileSystem)為其文件系統(tǒng)、支持MapReduce分布式程序設(shè)計(jì)和運(yùn)行框架,讓用戶可以在不了解分布式底層細(xì)節(jié)的情況下,開發(fā)分布式程序,從而能夠充分利用集群的威力進(jìn)行高速運(yùn)算和存儲(chǔ)。Hadoop具有高容錯(cuò)性的特點(diǎn),可以用來部署在低廉的硬件上,并提供高吞吐量來訪問應(yīng)用程序的數(shù)據(jù),非常適合處理具有超大規(guī)模數(shù)據(jù)。本章首先介紹了Hadoop的發(fā)展歷史、軟件生態(tài)、核心組件和Hadoop命令結(jié)構(gòu);之后以HDFS為重點(diǎn)介紹了其體系結(jié)構(gòu)和特點(diǎn),并詳細(xì)介紹了HDFS的交互式命令。基于Python的廣泛應(yīng)用,所以本章基于pyhdfs介紹了利用Pyhon實(shí)現(xiàn)對HDFS文件的操作,詳細(xì)介紹了pyhdfs的類庫和相關(guān)方法。最后,通過一個(gè)具體的實(shí)例展示了pyhdfs應(yīng)用的便捷性。PPT模板下載:/moban/行業(yè)PPT模板:/hangye/節(jié)日PPT模板:/jieri/PPT素材下載:/sucai/PPT背景圖片:/beijing/PPT圖表下載:/tubiao/優(yōu)秀PPT下載:/xiazai/PPT教程:/powerpoint/Word教程:/word/Excel教程:/excel/資料下載:/ziliao/PPT課件下載:/kejian/范文下載:/fanwen/試卷下載:/shiti/教案下載:/jiaoan/字體下載:/ziti/
謝謝聆聽
第5章HBase基礎(chǔ)與應(yīng)用本章學(xué)習(xí)目標(biāo)了解HBase的產(chǎn)生的背景、與Hadoop其他組件的關(guān)系以及生態(tài)環(huán)境;了解HBase的體系結(jié)構(gòu)和工作原理;掌握HBase的常用命令;掌握利用Jython實(shí)現(xiàn)HBase數(shù)據(jù)庫系統(tǒng)的操作;01HBase簡介02HBase安裝目錄Contents03HBase初探04HBase的數(shù)據(jù)模型05HBaseShell06利用Jython實(shí)現(xiàn)HBase的訪問HBase簡介01HBase簡介HBase是一個(gè)構(gòu)建在HDFS之上、分布式、面向列的開源數(shù)據(jù)庫;該技術(shù)來源于FayChang所撰寫的Google論文“Bigtable:ADistributedStorageSystemforStructuredData”;HBase是ApacheHadoop項(xiàng)目的子項(xiàng)目(/);HBase適合于非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)庫,主要用來存儲(chǔ)非結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù);與Hadoop一樣,HBase的目標(biāo)主要依靠橫向擴(kuò)展,通過不斷增加廉價(jià)的服務(wù)器來增加計(jì)算和存儲(chǔ)能力。HBase在Hadoop生態(tài)系統(tǒng)中的位置HBase概述122/28HBase初識(shí)123/28大面向列稀疏數(shù)據(jù)類型單一無模式數(shù)據(jù)多版本HBase特點(diǎn)124/28核心術(shù)語主鍵:rowkey列族:column
family列:column時(shí)間戳:timestamp
存儲(chǔ)單元:cellHBase數(shù)據(jù)模型125/28HBase數(shù)據(jù)模型126/28Table中的所有行都按照rowkey的字典序排列Table在行的方向上分割為多個(gè)Region一個(gè)Region在同一時(shí)刻只能被同一個(gè)RegionServer管理RegionServer能管理多個(gè)RegionHBase物理模型127/28HBase物理模型128/10Region按大小分割,每個(gè)表開始只有一個(gè)Region,隨著數(shù)據(jù)增多,Region不斷增大,當(dāng)增大到一個(gè)閥值的時(shí)候,Region就會(huì)等分會(huì)兩個(gè)新的Region,之后會(huì)有越來越多的RegionHBase物理模型129/28Region是HBase中分布式存儲(chǔ)和負(fù)載均衡的最小單元不同Region分布到不同RegionServer上HBase物理模型130/28Region雖然是分布式存儲(chǔ)的最小單元,但并不是存儲(chǔ)的最小單元Region由一個(gè)或者多個(gè)Store組成,每個(gè)Store保存一個(gè)ColumnFamily;每個(gè)Store又由一個(gè)MemStore和0至多個(gè)StoreFile組成;MemStore存儲(chǔ)在內(nèi)存中,StoreFile存儲(chǔ)在HDFS上HBase物理模型131/28HBase物理模型132/28HBase體系結(jié)構(gòu)HBase體系結(jié)構(gòu)HBase以HadoopHDFS作為其文件存儲(chǔ)系統(tǒng),利用HadoopMapReduce來處理HBase中的海量數(shù)據(jù),利用Zookeeper作為協(xié)同服務(wù);HBase體系結(jié)構(gòu)HBase由中心節(jié)點(diǎn)HMaster存儲(chǔ)元數(shù)據(jù),為RegionServer分配Region,維護(hù)整個(gè)集群的負(fù)載均衡。在每個(gè)分布式節(jié)點(diǎn)中運(yùn)行的HRegionServer實(shí)現(xiàn)本地HBase數(shù)據(jù)的管理,直接對接用戶的讀寫請求,HRegionServer管理Master為其分配的Region,處理來自客戶端的讀寫請求,負(fù)責(zé)和底層HDFS的交互和存儲(chǔ)數(shù)據(jù)。Master容錯(cuò)RegionServer容錯(cuò)ZooKeeper容錯(cuò)HBase容錯(cuò)性136/28HBase的訪問方式最直接的方式是通過HBase的Shell實(shí)現(xiàn)與HBase的交互操作Pig和Hive還為HBase提供了高層語言支持,使得在HBase上進(jìn)行數(shù)據(jù)統(tǒng)計(jì)處理變的非常簡單Sqoop則為HBase提供了方便的RDBMS數(shù)據(jù)導(dǎo)入功能,使得傳統(tǒng)數(shù)據(jù)庫數(shù)據(jù)向HBase中遷移變的非常方便HBase為Java提供了豐富的類庫以實(shí)現(xiàn)與HBase的交互操作,為了能夠適應(yīng)更加廣泛的程序語言支持,HBase還提供C/C++語言的類庫支持,提供了Jython與HBase的交互支持。HBase體系結(jié)構(gòu)Phoenix:由
開源的一個(gè)項(xiàng)目。相當(dāng)于外套一個(gè)SQL的皮膚。ApachePhoenix與其他Hadoop產(chǎn)品完全集成,如Spark,Hive,Pig,F(xiàn)lume和MapReduce。Hbase安裝02安裝前的準(zhǔn)備確保已經(jīng)安裝好JDK環(huán)境登錄Apache網(wǎng)站下載HBase(/),其中”src.tar.gz”結(jié)尾的文件表示HBase的源碼,若用戶僅僅要使用HBase,而不進(jìn)行HBase的改進(jìn)和開發(fā),則只需下載”tar.gz“結(jié)尾的文件。HBase的安裝步驟1:下載并解壓文件下載了HBase3.0版本,其對應(yīng)文件為”HBase-3.0.0-SNAPSHOT-bin.tar.gz”,利用下面的命令進(jìn)行解壓。$tarxzvfHBase-3.0.0-SNAPSHOT-bin.tar.gz$cdHBase-3.0.0-SNAPSHOT/2.步驟2:配置HBase環(huán)境假設(shè)Java的安裝路徑為“/usr/local/servers/jdk”,那么修改HBase的配置文件“conf/HBase-env.sh”如下所示。#Thejavaimplementationtouse.exportJAVA_HOME=/usr/local/servers/jdkHBase的安裝3.步驟3:啟動(dòng)HBase運(yùn)行HBase的啟動(dòng)腳本文件”bin/start-hbase.sh”啟動(dòng)HBase,啟動(dòng)完成后,HBase將會(huì)顯示成功運(yùn)行信息,也可以登錄”http://localhost:16010“查看HBase的運(yùn)行信息。HBase初探03HBase初探假設(shè)HBase的安裝目錄為$HBase_HOME,該示例具體操作步驟包括HBase的連接、HBase數(shù)據(jù)表的創(chuàng)建、查看、添加數(shù)據(jù)等。HBase初探步驟1:連接到HBase進(jìn)入$HBase_HOME/bin文件夾,啟動(dòng)HBaseHBase初探步驟2:創(chuàng)建數(shù)據(jù)表數(shù)據(jù)表示例:示例:Student數(shù)據(jù)表行鍵列族StuInfo列族Grades時(shí)間戳NameAgeSexClassBigDataComputerMath0001TomGreen18Male
809085T20002Amy19
0195
89T10003Allen19Male0290
88T1
HBase初探步驟2:創(chuàng)建數(shù)據(jù)表使用CREATE命令創(chuàng)建一個(gè)新的數(shù)據(jù)表create'Student','StuInfo','Grades'create'Student',{NAME=>'Stulnfo',VERSIONS=>3},{NAME=>'Grades',VERSIONS=>3}大括號內(nèi)是對列族的定義,NAME和VERSION是參數(shù)名,無須使用單引號,符號=>表示將后面的值賦給指定參數(shù)。例如,VERSIONS=>3是指此單元格內(nèi)的數(shù)據(jù)可以保留最近的3個(gè)版本。HBase初探
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024抵押借貸合同范文
- 2024咨詢服務(wù)合同范本標(biāo)準(zhǔn)范文
- 廣東省珠海市七年級上學(xué)期語文期中試卷7套【附答案】
- 2024藥品代理合同范本
- 單位團(tuán)購房產(chǎn)轉(zhuǎn)讓合同范本
- 企業(yè)財(cái)產(chǎn)出售協(xié)議樣式
- 2024年農(nóng)村房屋轉(zhuǎn)讓協(xié)議范本
- 七年級地理上冊5.1《世界的人口》教案粵教版
- 2024版標(biāo)準(zhǔn)家庭裝修協(xié)議
- 建筑外墻保溫工程施工合同
- 品牌授權(quán)協(xié)議書
- 藝術(shù)設(shè)計(jì)就業(yè)職業(yè)生涯規(guī)劃
- 《狙擊手》和《新神榜楊戩》電影賞析
- 槍庫應(yīng)急處置預(yù)案
- 老年患者術(shù)后譫妄的護(hù)理干預(yù)
- 《凸透鏡成像的規(guī)律》課件
- 倉庫管理中的客戶服務(wù)和溝通技巧
- 規(guī)劃選址及用地預(yù)審
- 土砂石料廠項(xiàng)目融資計(jì)劃書
- 2024年給藥錯(cuò)誤護(hù)理不良事件分析持續(xù)改進(jìn)
- 郵政營銷策劃方案
評論
0/150
提交評論