《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》課件教學(xué)課件-第2章HDFS實(shí)戰(zhàn)_第1頁
《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》課件教學(xué)課件-第2章HDFS實(shí)戰(zhàn)_第2頁
《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》課件教學(xué)課件-第2章HDFS實(shí)戰(zhàn)_第3頁
《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》課件教學(xué)課件-第2章HDFS實(shí)戰(zhàn)_第4頁
《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》課件教學(xué)課件-第2章HDFS實(shí)戰(zhàn)_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

【第1章回顧】1.了解Hadoop功能、起源和版本。2.理解Hadoop生態(tài)系統(tǒng)組成及各組件作用。(重點(diǎn))3.理解Hadoop體系架構(gòu)。(重點(diǎn))4.掌握Hadoop部署要點(diǎn),包括運(yùn)行環(huán)境、運(yùn)行模式和主要配置文件(hadoop-env.sh、yarn-env.sh、mapred-env.sh、core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、slaves)等。(重點(diǎn))5.熟練掌握在Linux環(huán)境下部署全分布模式Hadoop集群:規(guī)劃集群、準(zhǔn)備機(jī)器及軟件環(huán)境、安裝和配置Hadoop集群、關(guān)閉防火墻、格式化文件系統(tǒng)、啟動和驗(yàn)證Hadoop、關(guān)閉Hadoop。(重點(diǎn))【課程內(nèi)容】開學(xué)第一課(理論1學(xué)時)第1章部署全分布模式Hadoop集群(理論3學(xué)時+實(shí)驗(yàn)2學(xué)時)第2章HDFS實(shí)戰(zhàn)(理論4學(xué)時+實(shí)驗(yàn)2學(xué)時)第3章MapReduce編程(理論4學(xué)時+實(shí)驗(yàn)2學(xué)時)第4章部署ZooKeeper集群和ZooKeeper實(shí)戰(zhàn)(理論4學(xué)時+實(shí)驗(yàn)2學(xué)時)第5章部署本地模式Hive和Hive實(shí)戰(zhàn)(理論4學(xué)時+實(shí)驗(yàn)2學(xué)時)第6章Flume實(shí)戰(zhàn)(理論4學(xué)時+實(shí)驗(yàn)2學(xué)時)第7章Kafka實(shí)戰(zhàn)(理論4學(xué)時+實(shí)驗(yàn)2學(xué)時)第8章Spark集群部署和基本編程(理論4學(xué)時+實(shí)驗(yàn)2學(xué)時)第9章Flink集群部署和基本編程(選修)第2章HDFS實(shí)戰(zhàn)2.1初識HDFS2.2HDFS體系架構(gòu)(重點(diǎn))2.3HDFS文件存儲原理(重點(diǎn))2.4HDFS接口(重點(diǎn),難點(diǎn))2.5HDFS高可靠性機(jī)制2.6綜合實(shí)戰(zhàn):HDFS實(shí)戰(zhàn)(實(shí)驗(yàn))2.1初識HDFSHDFS(HadoopDistributedFileSystem)是Hadoop分布式文件系統(tǒng),是Hadoop三大核心之一,是針對谷歌文件系統(tǒng)GFS(GoogleFileSystem)的開源實(shí)現(xiàn)。HDFS是一個具有高容錯性的文件系統(tǒng),適合部署在廉價的機(jī)器上,HDFS能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。大數(shù)據(jù)處理框架如MapReduce、Spark等要處理的數(shù)據(jù)源大部分都存儲在HDFS上,Hive、HBase等框架的數(shù)據(jù)通常也存儲在HDFS上。簡而言之,HDFS為大數(shù)據(jù)的存儲提供了保障。經(jīng)過多年的發(fā)展,HDFS自身已經(jīng)十分成熟和穩(wěn)定,且用戶群愈加廣泛,HDFS逐漸成為分布式存儲的事實(shí)標(biāo)準(zhǔn)。2.1初識HDFSHDFS文件系統(tǒng)的基本特征包括以下幾個方面。(1)高容錯性:把硬件出錯看做一種常態(tài),HDFS設(shè)計(jì)了相應(yīng)機(jī)制能夠快速自動進(jìn)行錯誤檢測和恢復(fù)。例如,一個節(jié)點(diǎn)出現(xiàn)故障,它上面的數(shù)據(jù)在其它節(jié)點(diǎn)存在備份,并且會被自動補(bǔ)充。(2)數(shù)據(jù)容量大:HDFS每個集群可以支持?jǐn)?shù)百個節(jié)點(diǎn),以支持應(yīng)用程序的大數(shù)據(jù)需求。(3)可擴(kuò)展性:水平擴(kuò)展性強(qiáng),數(shù)據(jù)節(jié)點(diǎn)可以根據(jù)需要進(jìn)行增刪。(4)高吞吐量:數(shù)據(jù)傳輸速率高,支持高并發(fā)大數(shù)據(jù)應(yīng)用程序。(5)就近計(jì)算:客戶請求盡可能在數(shù)據(jù)節(jié)點(diǎn)上直接完成計(jì)算任務(wù),這樣在大數(shù)據(jù)的業(yè)務(wù)中可以降低網(wǎng)絡(luò)負(fù)擔(dān),增加吞吐量。2.2HDFS體系架構(gòu)HDFS采用Master/Slave架構(gòu)模型,一個HDFS集群包括一個NameNode和多個DataNode。名稱節(jié)點(diǎn)NameNode為主節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)DataNode為從節(jié)點(diǎn),文件被劃分為一系列的數(shù)據(jù)塊(Block)存儲在從節(jié)點(diǎn)DataNode上,NameNode是中心服務(wù)器,不存儲數(shù)據(jù),負(fù)責(zé)管理文件系統(tǒng)的命名空間(Namespace)以及客戶端對文件的訪問。2.2HDFS體系架構(gòu)1.NameNodeNameNode運(yùn)行在日常硬件上,通常只有一個,是整個文件系統(tǒng)的管理節(jié)點(diǎn)。它維護(hù)著整個文件系統(tǒng)的文件目錄樹,包括文件/目錄的元數(shù)據(jù)和每個文件對應(yīng)的數(shù)據(jù)塊列表,它負(fù)責(zé)接收用戶的操作請求。作為HDFS主服務(wù)節(jié)點(diǎn)的核心,它主要完成下面任務(wù):(1)管理命名空間(Namespace)。(2)控制客戶端對文件的讀寫。(3)執(zhí)行常見文件系統(tǒng)操作,比如文件的重命名、復(fù)制、移動、打開、關(guān)閉以及目錄操作。2.2HDFS體系架構(gòu)1.NameNodeHDFS命名空間(NameSpace)支持傳統(tǒng)的層次型文件組織結(jié)構(gòu),與大多數(shù)現(xiàn)有文件系統(tǒng)類似,用戶可以創(chuàng)建、刪除、移動或重命名文件。在HDFS中,NameNode負(fù)責(zé)管理分布式文件系統(tǒng)的命名空間,保存了兩個核心數(shù)據(jù)結(jié)構(gòu):FsImage和EditLog。其中,F(xiàn)sImage用于維護(hù)文件系統(tǒng)樹以及文件樹中所有文件和目錄的元數(shù)據(jù);操作日志文件EditLog記錄了所有針對文件的創(chuàng)建、刪除、重命名等操作。NameNode記錄了每個文件中各個塊所在的數(shù)據(jù)節(jié)點(diǎn)的位置信息,但是并不持久化存儲這些信息,而是在系統(tǒng)每次啟動時掃描所有數(shù)據(jù)節(jié)點(diǎn)重構(gòu)得到這些信息。2.2HDFS體系架構(gòu)2.DataNodeDataNode也運(yùn)行在日常硬件上,通常有多個,它為HDFS提供真實(shí)文件數(shù)據(jù)的存儲服務(wù)。HDFS數(shù)據(jù)存儲在DataNode上,數(shù)據(jù)塊的創(chuàng)建、復(fù)制和刪除都在DataNode上執(zhí)行。DataNode將HDFS數(shù)據(jù)以文件的形式存儲在本地的文件系統(tǒng)中,但并不知道有關(guān)HDFS文件的信息。DataNode把每個HDFS數(shù)據(jù)塊存儲在本地文件系統(tǒng)的一個單獨(dú)的文件中,并不在同一個目錄創(chuàng)建所有的文件,實(shí)際上,它用試探的方法來確定每個目錄的最佳文件數(shù)目,并且在適當(dāng)?shù)臅r候創(chuàng)建子目錄。在同一個目錄中創(chuàng)建所有的本地文件并不是最優(yōu)的選擇,這是因?yàn)楸镜匚募到y(tǒng)可能無法高效地在單個目錄中支持大量的文件。當(dāng)一個DataNode啟動時,它會掃描本地文件系統(tǒng),產(chǎn)生一個這些本地文件對應(yīng)的所有HDFS數(shù)據(jù)塊的列表,然后作為報(bào)告發(fā)送到NameNode,這個報(bào)告就是塊狀態(tài)報(bào)告。2.2HDFS體系架構(gòu)嚴(yán)格地說,客戶端并不算是HDFS的一部分。客戶端可以支持打開、讀取、寫入等常見操作,并且提供了類似Shell的命令行方式來訪問HDFS中的數(shù)據(jù),也提供了API作為應(yīng)用程序訪問文件系統(tǒng)的客戶端編程接口。2.3HDFS文件存儲原理2.3.1數(shù)據(jù)塊Block2.3.2副本存放策略2.3.3數(shù)據(jù)讀取2.3.4數(shù)據(jù)寫入2.3.1數(shù)據(jù)塊BlockHDFS中的數(shù)據(jù)以文件塊Block的形式存儲,Block是最基本的存儲單位,每次讀寫的最小單元是一個Block。對于文件內(nèi)容而言,一個文件的長度大小是N,那么從文件的0偏移開始,按照固定的大小,順序?qū)ξ募M(jìn)行劃分并編號,劃分好的每一個塊稱一個Block。Hadoop2.0中默認(rèn)Block大小是128MB。不同于普通文件系統(tǒng),HDFS中如果一個文件小于一個數(shù)據(jù)塊的大小,并不占用整個數(shù)據(jù)塊存儲空間。Block的大小可以根據(jù)實(shí)際需求進(jìn)行配置,可以通過HDFS配置文件hdfs-site.xml中的參數(shù)dfs.blocksize來定義塊大小,但要注意,數(shù)字必須是2K,文件的大小可以不是Block大小的整數(shù)倍,這時最后一個塊可能存在剩余。2.3.1數(shù)據(jù)塊Block為什么HDFS數(shù)據(jù)塊設(shè)置的這么大呢?原因是和普通的本地磁盤文件系統(tǒng)不同,HDFS存儲的是大數(shù)據(jù)文件,通常會有TB甚至PB的數(shù)據(jù)文件需要管理,所以數(shù)據(jù)的基本單元必須足夠大才能提高管理效率。而如果還使用像Linux本地文件系統(tǒng)EXT3的4KB單元來管理數(shù)據(jù),則會非常低效,同時會浪費(fèi)大量的元數(shù)據(jù)空間。2.3.2副本存放策略HDFS采用多副本方式對數(shù)據(jù)進(jìn)行冗余存儲,通常一個數(shù)據(jù)塊的多個副本會被分布到不同的DataNode上。HDFS提供可靠的算法實(shí)現(xiàn)在分布式環(huán)境中存儲大量數(shù)據(jù)。簡單來說,每個數(shù)據(jù)塊Block都存在副本以提高容錯性。默認(rèn)情況下每個塊存在3個副本。數(shù)據(jù)塊的信息會定期由DataNode報(bào)送給NameNode,任何時候,當(dāng)NameNode發(fā)現(xiàn)一個塊的副本個數(shù)少于3個或者多于3個時都會進(jìn)行補(bǔ)充或者刪除。副本放置的基本原則是保證并非所有的副本都在同一個機(jī)架(Rack)上。這樣放置的好處在于提供高容錯性的同時降低延時,注意一個Rack可能包含多個DataNode,而數(shù)據(jù)分布在不同DataNode可以提高數(shù)據(jù)讀寫并發(fā)。對于多于3個副本的情況,其它副本將會隨機(jī)分布在不同DataNode,同時保證同一個機(jī)架中最多存在兩個副本??梢酝ㄟ^配置文件hdfs-site.xml中的參數(shù)dfs.replication來定義Block副本數(shù)。2.3.2副本存放策略Block副本在機(jī)架中的放置策略Block:123機(jī)架1121機(jī)架2232機(jī)架33312.3.2副本存放策略

Hadoop0.17之前:副本1:同機(jī)架的其它節(jié)點(diǎn)副本2:同機(jī)架的另一個節(jié)點(diǎn)副本3:不同機(jī)架的節(jié)點(diǎn)其它副本:隨機(jī)選擇Hadoop0.17之后:副本1:同Client的節(jié)點(diǎn)副本2:不同機(jī)架的節(jié)點(diǎn)副本3:同副本2機(jī)架中的另一個節(jié)點(diǎn)其它副本:隨機(jī)選擇機(jī)架1機(jī)架22.3.3數(shù)據(jù)讀取客戶端JVM1352數(shù)據(jù)節(jié)點(diǎn)DataNode23515312客戶端DistributedFileSytemFSDataInputStreamDFSInputStream名稱節(jié)點(diǎn)NameNode(2)獲取數(shù)據(jù)塊信息(4)讀取請求(7)關(guān)閉文件(3)生成對象實(shí)例(5)讀取數(shù)據(jù)6.讀取數(shù)據(jù)元數(shù)據(jù)(名稱,塊個數(shù),地址,……)(1)打開文件(6)讀取數(shù)據(jù)…數(shù)據(jù)節(jié)點(diǎn)DataNode數(shù)據(jù)節(jié)點(diǎn)DataNode2.3.3數(shù)據(jù)讀取客戶端讀取HDFS上的文件時,需要調(diào)用HDFSJavaAPI一些類的方法,從編程角度來看,主要經(jīng)過以下幾個步驟。(1)客戶端生成一個FileSystem實(shí)例(DistributedFileSystem對象),并使用此實(shí)例的open()方法打開HDFS上的一個文件。(2)分布式文件系統(tǒng)(DistributedFileSystem)通過遠(yuǎn)程過程調(diào)用(RemoteProcedureCall,RPC)向NameNode發(fā)出請求,獲得文件第一批塊的位置信息,即數(shù)據(jù)塊編號和所在DataNode地址,同一數(shù)據(jù)塊按照副本數(shù)會返回多個位置信息,這些位置信息按照Hadoop拓?fù)浣Y(jié)構(gòu)排序,距離客戶端近的排在前面。(3)FileSystem實(shí)例獲得地址信息后,生成一個文件系統(tǒng)數(shù)據(jù)輸入流(FSDataInputStream)對象實(shí)例返回給客戶端,此實(shí)例封裝了一個分布式文件系統(tǒng)數(shù)據(jù)輸入流(DFSInputStream)對象,負(fù)責(zé)存儲數(shù)據(jù)塊信息和DataNode地址信息,并負(fù)責(zé)后續(xù)的文件內(nèi)容讀取工作。(4)客戶端向FSDataInputStream發(fā)出讀取數(shù)據(jù)的read()調(diào)用。(5)FSDataInputStream收到read()調(diào)用請求后,F(xiàn)SDataInputStream封裝的DFSInputStream選擇與第一個數(shù)據(jù)塊最近的DataNode,并讀取相應(yīng)的數(shù)據(jù)信息返回給客戶端,在第一個數(shù)據(jù)塊讀取完成后,DFSInputStream負(fù)責(zé)關(guān)閉指向第一個塊的DataNode連接,接著讀取下一個塊。這些操作從客戶端的角度來看只是在讀一個持續(xù)不斷的數(shù)據(jù)流。(6)DFSInputStream依次選擇后續(xù)數(shù)據(jù)塊的最近DataNode節(jié)點(diǎn),并讀取數(shù)據(jù)返回給客戶端,直到最后一個數(shù)據(jù)塊讀取完畢。DFSInputStream從DataNode讀取數(shù)據(jù)時,可能會遇到某個DataNode失效的情況,則會自動選擇下一個包含此數(shù)據(jù)塊的最近的DataNode去讀取。(7)客戶端讀取完所有數(shù)據(jù)塊,然后調(diào)用FSDataInputStream的close()方法關(guān)閉文件。2.3.4數(shù)據(jù)寫入HDFS的設(shè)計(jì)遵循“一次寫入,多次讀取”的原則,所有數(shù)據(jù)只能添加不能更新。數(shù)據(jù)會被劃分為等尺寸的塊寫入不同的DataNode中。每個塊通常保存指定數(shù)量的副本(默認(rèn)3個)。HDFS數(shù)據(jù)寫入基本過程為:客戶端向NameNode發(fā)送文件寫請求,NameNode給客戶分配寫權(quán)限,并分配塊的寫入地址——DataNode的IP,兼顧副本數(shù)量和塊Rack自適應(yīng)算法,例如副本因子是3,則每個塊會分配到三個不同的DataNode,為了提高傳輸效率,客戶端只會向其中一個DataNode復(fù)制一個副本,另外兩個副本則由DataNode傳輸?shù)较噜廌ataNode。2.3.4數(shù)據(jù)寫入客戶端JVM1352數(shù)據(jù)節(jié)點(diǎn)DataNode23515312客戶端DistributedFileSytemFSDataOutputStreamDFSOutputStream(2)創(chuàng)建文件元數(shù)據(jù)(3)寫入數(shù)據(jù)(6)關(guān)閉文件(4)寫入數(shù)據(jù)包(1)創(chuàng)建文件請求(5)接收確認(rèn)包(4)(5)(5)(5)(7)寫操作完成元數(shù)據(jù)(名稱,塊個數(shù),地址,……)名稱節(jié)點(diǎn)NameNode數(shù)據(jù)節(jié)點(diǎn)DataNode數(shù)據(jù)節(jié)點(diǎn)DataNode2.3.4數(shù)據(jù)寫入從編程角度來說,將數(shù)據(jù)寫入HDFS主要經(jīng)過以下幾個步驟。(1)客戶端通過調(diào)用分布式文件系統(tǒng)DistributedFileSytem的create()方法創(chuàng)建新文件。(2)DistributedFileSytem通過RPC調(diào)用NameNode,在文件系統(tǒng)的命名空間中創(chuàng)建一個沒有塊關(guān)聯(lián)的新文件。創(chuàng)建前,NameNode會做各種校驗(yàn),例如文件是否存在、客戶端有無創(chuàng)建文件的權(quán)限等,若校驗(yàn)通過,NameNode會記錄下新文件,否則會拋出I/O異常。(3)FileSystem返回文件系統(tǒng)數(shù)據(jù)輸出流(FSOutputStream)的對象,與數(shù)據(jù)讀取相似,F(xiàn)SOutputStream被封裝成分布式文件系統(tǒng)數(shù)據(jù)輸出流(DFSOutputStream),DFSOutputStream可以協(xié)調(diào)NameNode和DataNode之間的協(xié)同工作??蛻舳碎_始寫數(shù)據(jù)到DFSOutputStream。(4)DFSOutputStream將數(shù)據(jù)切成一個個小的數(shù)據(jù)包(Packet),然后排成數(shù)據(jù)隊(duì)列(DataQueue)。DataQueue由DataStreamer讀取,并通知NameNode分配DataNode,用來存儲數(shù)據(jù)塊(每塊默認(rèn)復(fù)制3塊)。分配的DataNode放在一個數(shù)據(jù)流管道(Pipeline)里。DataStreamer將數(shù)據(jù)塊寫入Pipeline中的第一個DataNode,第一個DataNode將數(shù)據(jù)塊發(fā)送給第二個DataNode,以此類推。(5)DFSOutputStream還維護(hù)著一個被稱為響應(yīng)隊(duì)列(AckQueue)的隊(duì)列,這個隊(duì)列也由數(shù)據(jù)包組成,用于等待DataNode收到數(shù)據(jù)后返回響應(yīng)數(shù)據(jù)包,當(dāng)數(shù)據(jù)流管道中的所有DataNode都表示已經(jīng)收到響應(yīng)信息時,AckQueue才會把對應(yīng)的數(shù)據(jù)包移除掉。(6)客戶端完成寫數(shù)據(jù)后,調(diào)用close()方法關(guān)閉寫入流。(7)客戶端通知NameNode把文件標(biāo)記為已完成,然后NameNode把文件寫成功的結(jié)果反饋給客戶端,此時就表示客戶端已完成了整個HDFS的數(shù)據(jù)寫入過程。2.3.4數(shù)據(jù)寫入數(shù)據(jù)寫入可以看作是一個流水線Pipeline過程,具體來說,客戶端收到NameNode發(fā)送的塊存儲位置DataNode列表后,將做如下工作。(1)選擇DataNode列表中的DataNode1,通過IP地址建立TCP連接。(2)客戶端通知DataNode1準(zhǔn)備接收塊數(shù)據(jù),同時發(fā)送后續(xù)DataNode的IP地址給DataNode1,副本隨后會拷貝到這些DataNode。(3)DataNode1連接DataNode2,并通知DataNode2連接DataNode3,前一個DataNode發(fā)送副本數(shù)據(jù)給后一個DataNode,依次類推。(4)Ack確認(rèn)消息遵從相反的順序,即DataNode3收到完整塊副本后返回確認(rèn)給DataNode2,DataNode2收到完整塊副本后返回確認(rèn)給DataNode1。而DataNode1最后通知客戶端所有數(shù)據(jù)塊已經(jīng)成功復(fù)制。對于三個副本,DataNode1會發(fā)送三個Ack給客戶端表示三個DataNode都成功接收。隨后,客戶端通知NameNode,完整文件寫入成功,NameNode更新元數(shù)據(jù)。(5)當(dāng)客戶端接到流水線已經(jīng)建立完成的通知后,將會準(zhǔn)備發(fā)送數(shù)據(jù)塊到流水線中,然后各個數(shù)據(jù)塊按序在流水線中傳輸。這樣以來,客戶端只需要發(fā)送一次,所有備份將在不同DataNode之間自動完成,提高了傳輸效率。2.4HDFS接口2.4.1HDFSWebUI2.4.2HDFSShell2.4.3HDFSJavaAPI2.4.1HDFSWebUIHDFSWebUI主要面向管理員,提供服務(wù)器基礎(chǔ)統(tǒng)計(jì)信息和文件系統(tǒng)運(yùn)行狀態(tài)的查看功能,不支持配置更改操作。地址為http://NameNodeIP:50070。2.4.2HDFSShell1.HDFS文件系統(tǒng)命令2.HDFS系統(tǒng)管理命令1.HDFS文件系統(tǒng)命令方法1:hadoopfs[genericoptions]推薦,使用面最廣,可以操作任何文件系統(tǒng),比如本地文件、HDFS文件、HFTP文件及S3文件系統(tǒng)等。方法2:hdfsdfs[genericoptions]專門針對HDFS文件系統(tǒng)的操作。1.HDFS文件系統(tǒng)命令[xuluhui@master~]$hadoopfsUsage:hadoopfs[genericoptions] [-appendToFile<localsrc>...<dst>] [-cat[-ignoreCrc]<src>...] [-checksum<src>...] [-chgrp[-R]GROUPPATH...] [-chmod[-R]<MODE[,MODE]...|OCTALMODE>PATH...] [-chown[-R][OWNER][:[GROUP]]PATH...] [-copyFromLocal[-f][-p][-l][-d]<localsrc>...<dst>] [-copyToLocal[-f][-p][-ignoreCrc][-crc]<src>...<localdst>] [-count[-q][-h][-v][-t[<storagetype>]][-u][-x]<path>...] [-cp[-f][-p|-p[topax]][-d]<src>...<dst>] [-createSnapshot<snapshotDir>[<snapshotName>]] [-deleteSnapshot<snapshotDir><snapshotName>] [-df[-h][<path>...]] [-du[-s][-h][-x]<path>...] [-expunge] [-find<path>...<expression>...] [-get[-f][-p][-ignoreCrc][-crc]<src>...<localdst>] [-getfacl[-R]<path>] [-getfattr[-R]{-nname|-d}[-een]<path>] [-getmerge[-nl][-skip-empty-file]<src><localdst>] [-help[cmd...]] [-ls[-C][-d][-h][-q][-R][-t][-S][-r][-u][<path>...]] [-mkdir[-p]<path>...] [-moveFromLocal<localsrc>...<dst>] [-moveToLocal<src><localdst>] [-mv<src>...<dst>] [-put[-f][-p][-l][-d]<localsrc>...<dst>] [-renameSnapshot<snapshotDir><oldName><newName>] [-rm[-f][-r|-R][-skipTrash][-safely]<src>...] [-rmdir[--ignore-fail-on-non-empty]<dir>...] [-setfacl[-R][{-b|-k}{-m|-x<acl_spec>}<path>]|[--set<acl_spec><path>]] [-setfattr{-nname[-vvalue]|-xname}<path>] [-setrep[-R][-w]<rep><path>...] [-stat[format]<path>...] [-tail[-f]<file>] [-test-[defsz]<path>] [-text[-ignoreCrc]<src>...] [-touchz<path>...] [-truncate[-w]<length><path>...] [-usage[cmd...]]1.HDFS文件系統(tǒng)命令命令選項(xiàng)功能-ls顯示文件的元數(shù)據(jù)信息或者目錄包含的文件列表信息-mv移動HDFS文件到指定位置-cp將文件從源路徑復(fù)制到目標(biāo)路徑-rm刪除文件,“-rm-r”或者“-rm-R”可以遞歸刪除文件夾,文件夾可以包含子文件夾和子文件-rmdir刪除空文件夾,注意:如果文件夾非空,則刪除失敗-put從本地文件系統(tǒng)復(fù)制單個或多個源路徑上傳到HDFS,同時支持從標(biāo)準(zhǔn)輸入讀取源文件內(nèi)容后寫入目標(biāo)位置-get復(fù)制源路徑指定的文件到本地文件系統(tǒng)目標(biāo)路徑指定的文件或文件夾-cat將指定文件內(nèi)容輸出到標(biāo)準(zhǔn)輸出stdout-mkdir創(chuàng)建指定目錄-setrep改變文件的副本系數(shù),選項(xiàng)-R用于遞歸改變目錄下所有文件的副本系數(shù),選項(xiàng)-w表示等待副本操作結(jié)束才退出命令2.HDFS系統(tǒng)管理命令[xuluhui@master~]$hdfsdfsadminUsage:hdfsdfsadminNote:AdministrativecommandscanonlyberunastheHDFSsuperuser. [-report[-live][-dead][-decommissioning][-enteringmaintenance][-inmaintenance]] [-safemode<enter|leave|get|wait>] [-saveNamespace] [-rollEdits] [-restoreFailedStoragetrue|false|check] [-refreshNodes] [-setQuota<quota><dirname>...<dirname>] [-clrQuota<dirname>...<dirname>] [-setSpaceQuota<quota>[-storageType<storagetype>]<dirname>...<dirname>] [-clrSpaceQuota[-storageType<storagetype>]<dirname>...<dirname>] [-finalizeUpgrade] [-rollingUpgrade[<query|prepare|finalize>]] [-refreshServiceAcl] [-refreshUserToGroupsMappings] [-refreshSuperUserGroupsConfiguration] [-refreshCallQueue] [-refresh<host:ipc_port><key>[arg1..argn] [-reconfig<namenode|datanode><host:ipc_port><start|status|properties>] [-printTopology] [-refreshNamenodesdatanode_host:ipc_port] [-getVolumeReportdatanode_host:ipc_port] [-deleteBlockPooldatanode_host:ipc_portblockpoolId[force]] [-setBalancerBandwidth<bandwidthinbytespersecond>] [-getBalancerBandwidth<datanode_host:ipc_port>] [-fetchImage<localdirectory>] [-allowSnapshot<snapshotDir>] [-disallowSnapshot<snapshotDir>] [-shutdownDatanode<datanode_host:ipc_port>[upgrade]] [-evictWriters<datanode_host:ipc_port>] [-getDatanodeInfo<datanode_host:ipc_port>] [-metasavefilename] [-triggerBlockReport[-incremental]<datanode_host:ipc_port>] [-listOpenFiles] [-help[cmd]]2.4.3HDFSJavaAPI類名說明org.apache.hadoop.fs.FileSystem通用文件系統(tǒng)基類,用于與HDFS文件系統(tǒng)交互,編寫的HDFS程序都需要重寫FileSystem類,通過該類,可以方便地像操作本地文件系統(tǒng)一樣操作HDFS集群文件org.apache.hadoop.fs.FSDataInputStream文件輸入流,用于讀取HDFS文件org.apache.hadoop.fs.FSDataOutputStream文件輸出流,向HDFS順序?qū)懭霐?shù)據(jù)流org.apache.hadoop.fs.Path文件與目錄定位類,用于定義HDFS集群中指定的目錄與文件絕對或相對路徑org.apache.hadoop.fs.FileStatus文件狀態(tài)顯示類,可以獲取文件與目錄的元數(shù)據(jù)、長度、塊大小、所屬用戶、編輯時間等信息;同時可以設(shè)置文件用戶、權(quán)限等內(nèi)容官網(wǎng)/docs/r2.9.2/api/index.html

2.5HDFS高可靠性機(jī)制2.5.1HDFSNameNodeHA高可用機(jī)制2.5.2HDFSNameNodeFederation聯(lián)邦機(jī)制2.5.1HDFSNameNodeHA高可用機(jī)制在Hadoop2.0中,HDFSNameNode的單點(diǎn)故障問題得到了解決,這就是HDFSNameNodeHighAvailability(HDFSNameNode高可用機(jī)制,簡稱HDFSNameNodeHA)。HDFSNameNode高可用機(jī)制體系架構(gòu)心跳心跳監(jiān)視名稱節(jié)點(diǎn)健康狀態(tài)提交EditLog通過共享存儲系統(tǒng)(NFS、QJM或ZooKeeper)同步狀態(tài)向主、備名稱節(jié)點(diǎn)上報(bào)數(shù)據(jù)塊的位置信息主備切換控制器主備切換控制器

ZooKeeper集群ZooKeeperZooKeeperZooKeeper主名稱節(jié)點(diǎn)(活躍)備名稱節(jié)點(diǎn)(待命)數(shù)據(jù)節(jié)點(diǎn)1數(shù)據(jù)節(jié)點(diǎn)2數(shù)據(jù)節(jié)點(diǎn)3數(shù)據(jù)節(jié)點(diǎn)4數(shù)據(jù)節(jié)點(diǎn)N讀取EditLog監(jiān)視名稱節(jié)點(diǎn)健康狀態(tài)…NameNode主備切換流程圖ZKFC進(jìn)程7.切換主備狀態(tài)4.通過ZK選舉主備1.主備狀態(tài)監(jiān)控ZooKeeper集群主名稱節(jié)點(diǎn)2.狀態(tài)變化回調(diào)HealthMonitorZKFailoverControllerActiveStandbyElector3.需要主備選舉5.返回ZK選舉結(jié)果6.返回主備狀態(tài)ZKFC進(jìn)程7.切換主備狀態(tài)4.通過ZK選舉主備1.主備狀態(tài)監(jiān)控備名稱節(jié)點(diǎn)2.狀態(tài)變化回調(diào)HealthMonitorZKFailoverControllerActiveStandbyElector3.需要主備選舉5.返回ZK選舉結(jié)果6.返回主備狀態(tài)JournalNode集群寫入EditLog讀取EditLog2.5.2HDFSNameNodeFederation聯(lián)邦機(jī)制在Hadoop2.0中引入了HDFSFederation聯(lián)邦機(jī)制,可以解決如下問題。(1)集群擴(kuò)展性。多個NameNode分管一部分目錄,使得一個集群可以擴(kuò)展到更多節(jié)點(diǎn),不再像Hadoop1.0中由于內(nèi)存的限制而制約文件存儲數(shù)目。(2)性能更高效。多個NameNode管理不同的數(shù)據(jù),且同時對外提供服務(wù),將為用戶提供更高的讀寫吞吐率。(3)良好隔離性。用戶可以根據(jù)需要將不同業(yè)務(wù)數(shù)據(jù)交由不同NameNode管理,這樣可以大大降低不同業(yè)務(wù)之間的影響。2.5.2HDFSNameNodeFederation聯(lián)邦機(jī)制在Hadoop2.0中引入了HDFSFederation聯(lián)邦機(jī)制,可以解決如下問題。(1)集群擴(kuò)展性。多個NameNode分管一部分目錄,使得一個集群可以擴(kuò)展到更多節(jié)點(diǎn),不再像Hadoop1.0中由于內(nèi)存的限制而制約文件存儲數(shù)目。(2)性能更高效。多個NameNode管理不同的數(shù)據(jù),且同時對外提供服務(wù),將為用戶提供更高的讀寫吞吐率。(3)良好隔離性。用戶可以根據(jù)需要將不同業(yè)務(wù)數(shù)據(jù)交由不同NameNode管理,這樣可以大大降低不同業(yè)務(wù)之間的影響。HDFS數(shù)據(jù)管理體系架構(gòu)塊存儲服務(wù)名稱節(jié)點(diǎn)

塊管理NS

存儲數(shù)據(jù)節(jié)點(diǎn)數(shù)據(jù)節(jié)點(diǎn)…命名空間HDFSNameNodeFederation體系架構(gòu)塊存儲名稱節(jié)點(diǎn)-1

塊池1NS1

公共存儲數(shù)據(jù)節(jié)點(diǎn)1

命名空間名稱節(jié)點(diǎn)-k

塊池kNSk名稱節(jié)點(diǎn)-n

塊池nNSn

塊池…數(shù)據(jù)節(jié)點(diǎn)2

…數(shù)據(jù)節(jié)點(diǎn)m

………2.6綜合實(shí)戰(zhàn):HDFS實(shí)戰(zhàn)啟動HDFS集群使用HDFSShell命令使用HDFSWebUI界面搭建HDFS開發(fā)環(huán)境Eclipse使用HDFSJavaAPI編程關(guān)閉HDFS集群2.6.1啟動HDFS集群在使用HDFS接口操作和管理HDFS文件之前,首先需要啟動HDFS集群,只需在主節(jié)點(diǎn)上執(zhí)行以下命令即可。[xuluhui@master~]$start-dfs.shstart-dfs.sh命令會在主、從節(jié)點(diǎn)上啟動NameNode、DataNode和SecondaryNameNode服務(wù)。2.6.2使用HDFSShell命令【案例2-1】在/usr/local/hadoop-2.9.2目錄下創(chuàng)建目錄HelloData,在該目錄下新建2個文件file1.txt和file2.txt,在其下任意輸入一些英文測試語句。使用HDFSShell命令完成以下操作:首先創(chuàng)建HDFS目錄/InputData,然后將file1.txt和file2.txt上傳至HDFS目錄/InputData下,最后查看這兩個文件內(nèi)容。【案例2-1】(1)在本地Linux文件系統(tǒng)/usr/local/hadoop-2.9.2目錄下創(chuàng)建一個名為HelloData的文件夾,使用的命令如下所示。[xuluhui@master~]$mkdir/usr/local/hadoop-2.9.2/HelloData(2)在HelloData文件夾下創(chuàng)建2個文件file1.txt和file2.txt。創(chuàng)建file1.txt文件使用的命令如下所示。[xuluhui@master~]$vim/usr/local/hadoop-2.9.2/HelloData/file1.txt然后在file1.txt中寫入如下測試語句。HelloHadoopHelloHDFSHelloXijingUniversity創(chuàng)建file2.txt文件使用的命令如下所示。[xuluhui@master~]$vim/usr/local/hadoop-2.9.2/HelloData/file2.txt然后在file2.txt中寫入如下測試語句。HelloSparkHelloFlinkHelloXijingUniversity【案例2-1】(3)使用“hadoopfs”命令創(chuàng)建HDFS目錄/InputData,使用的命令如下所示。[xuluhui@master~]$hadoopfs-mkdir/InputData(4)查看HDFS目錄/InputData是否創(chuàng)建成功?!景咐?-1】(5)將file1.txt和file2.txt上傳至HDFS目錄/InputData下,使用的命令如下所示。[xuluhui@master~]$hadoopfs-put/usr/local/hadoop-2.9.2/HelloData/*/InputData(6)查看HDFS上文件file1.txt和file2.txt內(nèi)容。2.6.2使用HDFSShell命令【案例2-2】使用HDFSShell系統(tǒng)管理命令打印出當(dāng)前文件系統(tǒng)整體信息和各個節(jié)點(diǎn)的分布信息?!景咐?-2】2.6.3使用HDFSWebUI界面【案例2-3】通過HDFSWebUI查看【案例2-1】中創(chuàng)建的HDFS目錄/InputData及其下文件?!景咐?-3】2.6.4搭建HDFS開發(fā)環(huán)境Eclipse1.獲取EclipseEclipse官方下載地址為/downloads/packageseclipse-java-2018-09-linux-gtk-x86_64.tar.gz,例如存放在master機(jī)器的/home/xuluhui/Downloads中。2.安裝Eclipse安裝目錄如/usr/local

[xuluhui@master~]$suroot[root@master~]#cd/usr/local[root@masterlocal]#tar-zxvf/home/xuluhui/Downloads/eclipse-java-2018-09-linux-gtk-x86_64.tar.gz3.打開EclipseIDE進(jìn)入/usr/local/eclipse中通過可視化桌面打開EclipseIDE,默認(rèn)的工作空間為“/home/xuluhui/eclipse-workspace”。2.6.5使用HDFSJavaAPI編程【案例2-4】使用HDFSJavaAPI編寫HDFS文件操作程序,實(shí)現(xiàn)上傳本地文件到HDFS的功能,采用本地執(zhí)行和集群執(zhí)行兩種執(zhí)行方式測試,觀察結(jié)果?!景咐?-4】1.在Eclipse中創(chuàng)建Java項(xiàng)目打開EclipseIDE,進(jìn)入主界面,選擇菜單『File』→『New』→『JavaProject』,創(chuàng)建Java項(xiàng)目“HDFSExample”。2.在項(xiàng)目中添加所需JAR包(1)右鍵單擊Java項(xiàng)目“HDFSExample”,從彈出的菜單中選擇『BuildPath』→『ConfigureBuildPath…』(2)進(jìn)入窗口【PropertiesforHDFSExample】,可以看到添加JAR包的主界面(3)單擊圖中的按鈕AddExternalJARs,依次添加的JAR包包括:$HADOOP_HOME/share/hadoop/hdfs/hadoop-hdfs-2.9.2.jar$HADOOP_HOME/share/hadoop/hdfs/lib/*,即其下所有JAR包$HADOOP_HOME/share/hadoop/common/hadoop-common-2.9.2.jar$HADOOP_HOME/share/hadoop/common/lib/*,即其下所有JAR包【案例2-4】(4)完成JAR包添加后,單擊按鈕ApplyandClose。(5)自動返回到Eclipse界面,從圖中可以看到,項(xiàng)目“HDFSExample”目錄樹下多了“ReferencedLibraries”,內(nèi)部有以上步驟添加進(jìn)來的兩個JAR包?!景咐?-4】3.在項(xiàng)目中新建包(1)右鍵單擊Java項(xiàng)目“HDFSExample”,從彈出的菜單中選擇『New』→『Package』。(2)進(jìn)入窗口【NewJavaPackage】,輸入新建包的名字,例如“com.xijing.hdfs”,完成后單擊Finish按鈕?!景咐?-4】4.編寫Java程序(1)右鍵單擊Java項(xiàng)目“HDFSExample”中目錄“src”下的包“com.xijing.hdfs”,從彈出的菜單中選擇『New』→『Class』。(2)進(jìn)入窗口【NewJavaClass】。輸入新建類的名字,例如“UploadFile”,還可以選擇是否創(chuàng)建main函數(shù)。完成后單擊Finish按鈕。(3)自動返回到Eclipse界面,可以看到,Eclipse自動創(chuàng)建一個名為UploadFile.java的源代碼文件,包、類、main方法已出現(xiàn)在代碼中?!景咐?-4】packagecom.xijing.hdfs;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileStatus;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;publicclassUploadFile{ publicstaticvoidmain(String[]args)throwsIOException{ Configurationconf=newConfiguration();

conf.set("fs.defaultFS","hdfs://master:9000");//新加入代碼行 FileSystemhdfs=FileSystem.get(conf); Pathsrc=newPath("/usr/local/hadoop-2.9.2/HelloData/file1.txt"); Pathdst=newPath("file1.txt"); hdfs.copyFromLocalFile(src,dst); System.out.println("Uploadto"+conf.get("fs.defaultFS")); FileStatusfiles[]=hdfs.listStatus(dst); for(FileStatusfile:files){ System.out.println(file.getPath()); } }}【案例2-4】方法1:本地執(zhí)行【案例2-4】方法2:Hadoop集群執(zhí)行(1)打包代碼,生成JAR文件。第一步,右鍵單擊Java項(xiàng)目“HDFSExample”,從彈出的快捷菜單中選擇『Export…』。第二步,在彈出的“Export”對話框中,選擇“JARfile”,單擊按鈕Next。第三步,在彈出的“JARExport”對話框中,指定JAR包的存放路徑等,單擊按鈕Finish?!景咐?-4】方法2:Hadoop集群執(zhí)行(2)使用命令“hadoopjar”將hdfsexample.jar提交到Hadoop集群執(zhí)行。(3)通過“hadoopfs-ls/”驗(yàn)證文件file1.txt是否已上傳到HDFS文件/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論