hadoop6天-hadoop第4章分布式存儲系統(tǒng)HDFS_第1頁
hadoop6天-hadoop第4章分布式存儲系統(tǒng)HDFS_第2頁
hadoop6天-hadoop第4章分布式存儲系統(tǒng)HDFS_第3頁
hadoop6天-hadoop第4章分布式存儲系統(tǒng)HDFS_第4頁
hadoop6天-hadoop第4章分布式存儲系統(tǒng)HDFS_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章分布式系統(tǒng)——分布式文件系統(tǒng)與HDFSHDFS的 搭建eclipsejava接口及常用hadoopRPC機制hadoop分布式文件系統(tǒng)與數(shù)據(jù)量越來越大,在一個操作系統(tǒng)管轄的范圍存不下了,那么就分配到的操作系統(tǒng)管理的磁盤中,但是不方便管理和,迫切需要一種系統(tǒng)來管理多臺機器上的文件,這就是分布式文件管理系統(tǒng)。系統(tǒng),可讓多機器上的多用戶文件和空間。分布式文件管理系統(tǒng)很多,hdfsHDS只是其中一種。適用于一次寫入、多次查詢的情況,不支持并發(fā)寫情況,小文件不合適。小提示:如何在剛開始學(xué)習(xí)的時候,形象化的地理解HDFS哪呢?可以把HDFS看做是wWindows的文件系統(tǒng)。在wWindows的文件著有一套很多層次的文件 層次是為了在文件夾中分門別類的地存放文件。經(jīng)常做的操作是創(chuàng)建文件夾、HDFS的 既然HDFS是存取數(shù)據(jù)的分布式文件系統(tǒng),那么對HDFS的操作,就是文件系統(tǒng)的基本HDFS的操作命令類似于lLinuxs對文件的操作,如ls、mkdir、rm等。執(zhí)行以下操作的時候,一定要確定hadoop是正常運行的,使用jps命令確保看到各個hadoop進(jìn)程。執(zhí)行命令hadoopfs,如圖4-1所示4-選項名使用格含選項名使用格含--ls路徑查看指定路徑的當(dāng) 結(jié)-<遞歸查看指定路徑 結(jié)-統(tǒng) 下個文件大-匯總統(tǒng) 下文件(夾)大-統(tǒng)計文件(夾)數(shù)-移--刪除文件/空白文件--rmr[-skipTrash]<路徑遞歸刪-上傳文--copyFromLocal<多個linux上的文件<hdfs路徑從本地--moveFromLocal<多個linux上的文件<hdfs路徑從本地移-合并到本-查看文件內(nèi)-查看文件內(nèi)-徑linux目的路徑從本地-目的路徑從本地移-創(chuàng)建空白文件-修改副本數(shù)--touchz<文件路徑創(chuàng)建空白文-顯示文件統(tǒng)計信--tailf文件查看文件尾部信- 修改權(quán)--chownR]屬主][:[屬組]]修改屬--chgrpR]修改屬--help[命令選項幫的地方,會特別“l(fā)inux路徑”或者“hdfs路徑”。如果沒有明確,意味著是hdfs下面講述每個命令選項的用法- 顯示當(dāng) 結(jié)構(gòu)該命令選項表示查看指定路徑的當(dāng) 4-上圖中的路徑是hdfs根 首字母表示文件夾(如果是“d”)還是文件(如果是“-后面的9位字符表示權(quán)限后面的數(shù)字或者“-”表示副本數(shù)。如果是文件,使用數(shù)字表示副本數(shù);文件夾沒有副本;后面的“root”表示屬主后面的“supergroup”表示屬組后面的“0617637645后面的時間表示修改時間,格式是年月日時分最后一項表示文件路可見 下面有四個文件夾、兩個文件如果該命令選項后面沒有路徑,那么就會/user/<當(dāng)前用戶 用戶登錄,因此會hdfs的 ,如圖4-2.所示4-如果沒有這 /user/root,會提示文件不存在的錯誤-lsr遞歸顯 結(jié)該命令選項表示遞歸顯示當(dāng)前路徑 結(jié)構(gòu),后面跟hdfs路徑。如圖4-3所示4- -du統(tǒng) 下各文件大該命令選項顯示指定路徑下的文件大小,單位是字節(jié),如 4-4.所示4--dus匯總統(tǒng) 下文件大該命令選項顯示指定路徑的文件大小,單位是字節(jié),如圖4-5所示。4-請讀者比較圖4-4與圖4-5的區(qū)別,體會兩個命令選項的不同含義-count統(tǒng)計文件(夾)數(shù)該命令選項顯示指定路徑下的文件夾數(shù)量、文件數(shù)量、文件總大小信息,如 4-所示.4-在圖4-6中有兩條命令,下面令是為了佐證上面命令的正確性的-mv移該命令選項表示移動hdfs的文件到指定的hdfs ,如圖4-7所示。.4-在圖4-7中有三條命令,是為了體現(xiàn)移動前后的變化情況-cp該命令選項表示hdfs指定的文件到指定的 中。后面跟兩個路徑,一個是被的文件,第二個是目的地,如圖4-8所示。4-在圖4-8中有三條命令,是為了體現(xiàn)前后的變化情況-rm刪除文件/空白文件該該命令選項表示刪除指定的文件,如圖4-9所示。4- -rmr遞歸該該命令選項表示遞歸刪除下的和文件,如圖4-10所示4--put上傳文該命令選項表示把linux上的文件到hdfs中,如圖4-11所示。4--copyFromLocal從本地操作與-put一致,不再舉例-moveFromLocal從本地移4-getmerge合并到該命令選項的含義是把hdfs指 下的所有文件內(nèi)容合并到本地linux的文件中,如4-134--cat查看文件內(nèi)該命令選項是查看文件內(nèi)容,如圖4-14所示4--text查看文件內(nèi)該命令選項可以認(rèn)為作用和用法與- 相同,此處略-mkdir創(chuàng)建空白文件4--setrep設(shè)置副本數(shù)該命令選項是修改已保存文件的副本數(shù)量,后面跟副本數(shù)量,再跟文件路徑,如 4-所示4-本,HDFS會自動執(zhí)行文件的工作,產(chǎn)生新的副本。如果最后的路徑表示文件夾,那么需要跟選項-R,表示對文件夾中的所有文件都修改副本,如圖-17所示。.4-在圖4-17中,對/user文件夾進(jìn)行的操作,使用了選項-R,那么/user/root下的文件abc的副本數(shù)發(fā)生了改變。還有一個選項是-w,表示等待副本操作結(jié)束才退出命令,如圖4-18所示。4-請讀者自己比較以上兩圖中使用- 前后執(zhí)行結(jié)果的變化情況-touchz創(chuàng)建空白該命令選項是在hdfs中創(chuàng)建空白文件,如圖4-194--stat顯示文件的統(tǒng)計信該命令選項顯示文件的一些統(tǒng)計信息,如圖4-201-在圖4-20中,命令選項后面可以有格式,使用引號表示。示例中的格式 %Y”依次表示文件大小、文件名稱、塊大小、副本數(shù)、時間-tail查看文件尾部內(nèi)1K字節(jié)的內(nèi)容。一般用于查看日志。如果帶有選項-f,那么當(dāng)文件內(nèi)容變化時,也會自動顯示,如圖4-21所示。4- od修改文件權(quán)該命令選項的使用類似于linux的s od用法,作用是修改文件的權(quán)限,如圖4-22所示。.4-在圖4-22中,修改了文件/emptyfile的權(quán)限如如果加上選項-R,可以對文件夾中的所有文件修改權(quán)限,如圖4-23所示。4--chown修改屬該命令選項表示修改文件的屬主,如圖4-24所示4-上圖中把文件/emptyfile的屬主由root修改為 也可以同時修改屬組,如圖4-25所示。4-在圖4-25中,把文件/emptyfile的屬主和屬組都修改為 如果帶有選項-R,意味著可以遞歸修改文件夾中的所有文件的屬主、屬組信-chgrp修改屬4--help幫該命令選項會顯示幫助信息,后面跟上需要查詢令選項即可,如圖4- 所示4-令選項的用法都顯示出來,如圖4-28所示。希望新的版本以后改進(jìn)。4-讀者短時間無法掌握全部命令用法,請重點掌握ls(r)、rm(r)、mkdir、put、get的使用 體系結(jié)構(gòu)與基本通過hadoops上傳的文件是存放在DataNode的block中,通過linuxs是看不到文件的,只能看到block??梢砸痪湓捗枋鯤DFS:把客戶端的大文件存放在很多節(jié)點的數(shù)據(jù)塊中。在這里,出現(xiàn)了三個:文件、節(jié)點、數(shù)據(jù)塊。HDFS就是圍繞著這三個設(shè)計的,在學(xué)習(xí)的時候也要緊抓住這三個來學(xué)習(xí)。作NameNode的作用是管理文件結(jié)構(gòu),是管理數(shù)據(jù)節(jié)點的。名字節(jié)點兩套數(shù)據(jù),一套是文件與數(shù)據(jù)塊之間的關(guān)系,另一套是數(shù)據(jù)塊與節(jié)點之間的關(guān)系。前一套數(shù)據(jù)是靜態(tài)的,是存放在磁盤上的,通過fsimage和edits文件來;后一套數(shù)據(jù)是動態(tài)的,不持結(jié)既然NameNode了這么多的信息,那么這些信息都存放在哪里呢吶?在hadoop源代碼中有個文件叫core-default.xml,如4-51示。4-打開這個文件,在第149行和第158行,有兩個配置信息,一個是dame.dir,另一個是dame.edits.dir。這兩個文件表示的是NameNode的文件fsimage和edits的存放位置,如圖4-52所示。4-在對應(yīng)配置的value值有${},這是變量的表示方式,在程序文件時,會把變量的值出來。那么,第150行的變量hadoop.tmp.dir的值是在上一章的配置文件core-site.xml中配置的,值是/usr/local/hadoop/tmp??梢钥闯?,這兩個文件的位置是在linux文件系統(tǒng)的/usr/local/hadoop/tmp/dame下。進(jìn)入linux文件系統(tǒng),可以看到如圖4-53所示 結(jié)構(gòu)4-作數(shù)據(jù)的時候是按照block為單位讀寫數(shù)據(jù)的。block是hdfs讀寫數(shù)據(jù)的基本單位。類推,可以劃分出很多的block。每個block就是64MB大小。block本質(zhì)上是一個邏輯概念,意味著block里面不會真正的數(shù)據(jù),只是劃分文的看一 類,這里面的屬性有以下幾個,如4-類中的屬性沒有一個是可以數(shù)據(jù)的為什么一定要劃分 大小哪呢?因為這是在默認(rèn)配置文件中設(shè)置的,查4-/r/block67108864字節(jié),可以換算為64MB。如果不希望使用64MB大小,可以在core-site.xml中覆蓋該值。注意單位是字副險,空間的花費還是值得的。那么,一個文件有幾個副本合適哪呢?查看hdfs-default.xml文件,如圖4-551所示4-DataNode3份數(shù)據(jù)都結(jié)看文件core-default.xml,如圖4-56所示。4-參數(shù)dfs.data.dir的值就是block存放在linux文件系統(tǒng)中的位置。變量的值前面已經(jīng)介紹了,是/usr/local/hadoop/tmp,那么dfs.data.dir的完整路徑/usr/local/hadoop/tmp/dfs/data。通過linux命令查看,結(jié)果如圖4-574-上圖中以“blk_”開頭的文件就是數(shù)據(jù)的block。這里名是有規(guī)律的,除了block文件外,還有后綴是“meta”的文件,這是block的源數(shù)據(jù)文件,存放一些元數(shù)據(jù)信息。因此,上圖2block文件。注意:從linux磁盤上傳一個完整的文件到hdfs中,這個文件在linux是可以看到hdfsblock存在合并原理4-HDFSwebHDFS對外提供了可供的httpserver,開放了很多端口,下面介紹常用的幾個端口50070端口,查看NameNode狀態(tài),如圖4-59所示4-core-default.xml4-60core-site.xml中自4-如果讀者通過該端口這個頁面,以為著NameNode節(jié)點是存活的50075端口,查看DataNode的,如圖4-61所示4-該地址和端口的定義位于hdfs-default.xml中,如圖4-62所示,讀者可以在hdfs-中自行修改4-50090端口,查看SecondaryNameNode50030端口,查看JobTracker狀態(tài)的,如圖4-63所示4-4-5006050060端口,查看TaskTracker,如圖4-65所示4-mapred-default.xml4-66mapred-site.xml中自行修4-HDFS的java接搭建Hadoop開發(fā)環(huán)在工作中寫完的各種代碼是在服務(wù)器中運行的,HDFS的操作代碼也不例外。在開發(fā)階段,使用windows下的eclipse作為開發(fā)環(huán)境,運行在虛擬機中的HDFS。也就是通過在本地的eclipse中的java代碼linux中的hdfs要使用宿主機中的java代碼客戶機中的hdfs,需要保證以下幾點確保宿主機與客戶機的網(wǎng)絡(luò)是互通確保宿主機和客戶機的都關(guān)閉,因為很多端口需要通過,為了減少配置,直接關(guān)閉那么windows也要使用root用戶,否則會報權(quán)限異常在eclipse項目中覆蓋hadoop的 .apache.hadoop.fs.FileUtil類的checkReturnValue方法,如圖4-661,目的是為了避免權(quán)限錯誤4-如果讀者在開發(fā)過程中出現(xiàn)權(quán)限等問題,請按照本節(jié)的提示檢查自己的環(huán)境使用 api讀寫數(shù)hadoopHDFS操作中,有個非常重要api,是.apache.hadoop.fs.FileSystem,這是用戶代碼操作HDFS的直接,該類含有操作HDFS的各種方法,類似于jdbc中操作數(shù)據(jù)庫的直接是Connection類。 怎么獲得一個FileSystem對象哪Stringuri="hdfs://40:9000/";Configurationconf=newConfiguration();FileSystemfs=FileSystem.get(URI.create(uri),以上代碼中,要注意調(diào)用的是FileSystem的靜態(tài)方法get,傳遞兩個值給形式參數(shù),第一個的HDFS地址,該地址的協(xié)議是hdfs,ip是40,端口是9000.。這個地core-site.xml中指定的,讀者可以使用自己環(huán)境的配置文件中的設(shè)創(chuàng)建文件夾使用使用HDFS的 命令查看一下 下的文件情況,如圖4-67所示4-在HDFS的 下創(chuàng)建文件夾,代碼如finalStringpathString=booleanexists= booleanresult=fs.mkdirs(ne }以上代碼中創(chuàng)建的文件夾完整路徑是“/d1”。第二行代碼是使exitst判斷文件夾是否存在;如果不存在,執(zhí)行創(chuàng)建操作。創(chuàng)建文件夾,調(diào)用的是mkdirs方法,返true,表示創(chuàng)建成功;如果是false,表示創(chuàng)建失敗?,F(xiàn)在查看一下是否成功了,如 4-68,可見創(chuàng)建成功了4-寫文件可以向HDFS寫入文件,代finalStringpathString=finalFSDataOutputStreamfsDataOutputStream=fs.create(ne IOUtils.copyBytes(newByteArrayInputStream("mynameisWUCHAO".getBytes()),fsDataOutputStream,configuration,true);第一行代碼表示創(chuàng)建的文件是在剛才創(chuàng)建的d1文件夾下的文件f1;第二行是調(diào)用create方法創(chuàng)建一個通向HDFS的輸出流;第三行是通過調(diào)用hadop的一個工具類IOUils的靜態(tài)方法cyByes把一個字符串發(fā)送給輸出流中。該靜態(tài)方法有四個參數(shù),第一個參數(shù)輸入流,第二個參數(shù)是輸出流,第三個參數(shù)是配置對象,第四個參數(shù)是布爾值,如果是tre表示數(shù)據(jù)傳輸完畢后關(guān)閉流?,F(xiàn)在看一下是否創(chuàng)建成功了,如圖4-69所示4-讀文件現(xiàn)在把剛才寫入到HDFS的文件“/d1/f1”讀出來,代碼如下finalStringpathString=finalFSDataInputStreamfsDataInputStream=fs.open(ne IOUtils.copyBytes(fsDataInputStream,System.out,configuration,true);第三行還是調(diào)用IOUtils.copyBytes方法,輸出的目的地是控制臺。見圖4-704-查 列表和文件詳細(xì)信息可以把 下的所有文件 顯示出來,代碼如finalStringpathString=finalFileStatus[]listStatus= for(FileStatusfileStatus:listStatus)finalStringtype finalshortreplication=finalStringpermission=finallonglen=finalPathpath=}調(diào)用listStatus方得到一個指定路徑下的所有文件和文件夾,每一個用FileStatus表示。我刪除文件或可以刪除某個文件或者路徑,代碼如finalStringpathString= th("/d1"),true); 除了上面列出的fs的方法外,還有很多方法,請讀者自己查閱apiHDFSRPCRPC是過程調(diào)用(RemoteProcedureCall),即調(diào)用其他虛擬機中運行的javaHDFS的運行就是建立在此基礎(chǔ)之上的。本章通過分析實現(xiàn)一個簡單的RPC程序來分析下面的代碼是服務(wù)端代碼。publicclassMyServerpublicstaticfinalintSERVER_PORT=publicstaticfinalStringSERVER_ADDRESS=publicstaticvoidmain(String[]args)throwsIOExceptionfinalServerserver=RPC.getServer(newMyBiz(),SERVER_ADDRESS,SERVER_PORT,newConfiguration());}}在于第5行的RPC.getServer方法,該方法有四個參數(shù),第一個參數(shù)是被調(diào)用的務(wù)器。這樣,服務(wù)器就在指定端口客戶端的請求。下面的代碼是被調(diào)用的對象類-------------------------------------------------------------------------------------------------------------------------------publicclassMyBizMyBizable{publicstaticlong=2345234L;public ");return" o"+name;}publiclonggetProtocolVersion(Stringprotocol,longthrowsIOExceptionreturn}}-------------------------------------------------------------------------------------------------------------------------------被調(diào)用的對象實現(xiàn)了接口MyBizable,這里面有兩個方法被實現(xiàn),一個就 方法,另一個是getProtocalVersion方法。這 o方法有個輸出語句下面的代碼是調(diào)用類的接口定義-------------------------------------------------------------------------------------------------------------------------------publicinterfaceMyBizableextends o(String}-------------------------------------------------------------------------------------------------------------------------------這個接口中的方法就是剛才的Biz中實現(xiàn)的方法。接口繼承的VersionedProtocal,是端口一致。服務(wù)端被調(diào)用的類必須繼承這個接口VersionedProtocal。下面是客戶端代碼,這里使用的調(diào)用對象的接口-------------------------------------------------------------------------------------------------------------------------------publicclassMyClientpublicstaticvoidmain(String[]args)throwsExceptionfinalMyBizableproxy=(MyBizable)RPC.getProxy(MyBizable.class,MyBiz.BIZ_VERSION,newInetSocketAddress(MyServer.SERVER_ADDRESS,MyServer.SERVER_PORT),newConfiguration());finalStringresult=proxy. }}-------------------------------------------------------------------------------------------------------------------------------以上代碼中在于RPC.gePry(),該方法有四個參數(shù),第一個參數(shù)是被調(diào)用的接口第二個是客戶端版本號,第三個是服務(wù)端地址。返回的對象,就是服務(wù)端對象的,內(nèi)部就是使用j.lang.Pxy實現(xiàn)的。運行時,先啟動服務(wù)端,再啟動客戶端。讀者可以服務(wù)端和客戶端輸出信息從上面的RPC調(diào)用中,可以看出:在客戶端調(diào)用的業(yè)務(wù)類的方法是定義在業(yè)務(wù)類的接口中的。該接口實現(xiàn)了VersionedProtocal接口。現(xiàn)在在命令行執(zhí)行jps命令,查看輸出信息,如圖5-1所示5-MyServer。大家可以聯(lián)想到搭建hadoop環(huán)境時,也執(zhí)行過該命令用來判斷hadoop的進(jìn)程是否全部啟動3。那么可以判斷,hadoop啟動時5java進(jìn)程也應(yīng)該是RPC的服務(wù)端。觀察NameNode的源代碼,如圖5-2,可以看到NameNode確實創(chuàng)建了RPC的服務(wù)端。5-NameNode由5.1NameNode本身就是一個java進(jìn)程。觀察圖5-2中RPC.getServer()方法的第一個參數(shù),發(fā)現(xiàn)是this,說明NameNode本身就是一個位于服務(wù)端的被調(diào)用對象,即NameNode中的方法是可以被客戶端代碼調(diào)用的。根據(jù)RPC運行原理可知,NameNode查看NameNode的源碼,如圖5-3所示5-NameNodeClientProtocal、DatanodeProtocal、NamenodeProtocal等接這個接口是供客戶端調(diào)用的。這里的客戶端不是指的自己寫的代碼,而是hadoopDFSClientDFSClientClientProtocal中的方法,完該接口中的方法大部分是對HDFS的操作,如create、delete、mkdirs、rename等DataNode本節(jié)點的狀態(tài)和block信息。NameNode不能向DataNode發(fā)送消息,只能通過該接口中方法的返回值向DataNode傳遞消息SecondaryNameNode調(diào)用這個接口是供SecondaryNameNode調(diào)用的。SecondaryNameNode是專門做DataNode按照分析NameNode的思路,看一下DataNode的源碼接口,如圖5-45-這里有兩個接口,分別是InterDatanodeProtocal、ClientDatanodeProtocal。這里就不展 的寫數(shù)據(jù)過程分通過FileSystem類可以操控HDFS,那就從這里開始分析寫數(shù)據(jù)到HDFS的過程。在向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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論