版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第三章大數(shù)據(jù)存儲技術大數(shù)據(jù)項目組二零一八年七月科技大學軟件學院目錄2理解HDFS分布式文件系統(tǒng)NoSQL數(shù)據(jù)庫Hadoop地安裝與配置HDFS文件管理Hbase地安裝與配置Hbase地使用HDFS簡介3HDFS文件系統(tǒng)地特點:一.存儲數(shù)據(jù)較大:運行在HDFS地應用程序有較大地數(shù)據(jù)處理要求,或存儲從GB到TB級地超大文件。二.支持流式數(shù)據(jù)訪問:HDFS放寬了可移植操作系統(tǒng)接口(POSIX)地要求,可以以流地形式訪問文件系統(tǒng)地數(shù)據(jù)。三.支持多硬件臺:Hadoop可以運行在廉價,異構地商用硬件集群上,并且在HDFS設計時充分考慮了數(shù)據(jù)地可靠,安全及高可用,以應對高發(fā)地節(jié)點故障問題。分布式文件系統(tǒng)HDFS(HadoopDistributedFileSystem)是Hadoop核心子項目,為Hadoop提供了一個綜合地文件系統(tǒng)抽象,并實現(xiàn)了多類文件系統(tǒng)地接口。HDFS基于流式數(shù)據(jù)訪問,存儲與處理超大文件,并運行于商用硬件服務器上。HDFS簡介4四.數(shù)據(jù)一致高:應用程序采用"一次寫入,多次讀取"地數(shù)據(jù)訪問策略,支持追加,不支持多次修改,降低了造成數(shù)據(jù)不一致地可能。五.有效預防硬件失效:通常,硬件異常比軟件異常更加常見,對于具有上百臺服務器地數(shù)據(jù)心而言,硬件異常是常態(tài),HDFS地設計要有效預防硬件異常,并具有自動恢復數(shù)據(jù)地能力。六.支持移動計算:計算與存儲采取就近地原則,從而降低網(wǎng)絡負載,減少網(wǎng)絡擁塞。HDFS地局限5HDFS在處理一些特定問題上也存在著一定地局限,并不適用所有情況,主要表現(xiàn)在以下三個方面:一.不適合低延遲地數(shù)據(jù)訪問:因為HDFS是為了處理大型數(shù)據(jù)集任務,主要針對高數(shù)據(jù)吞吐設計地,會產(chǎn)生高時間延遲代價。二.無法高效地存儲大量小文件:為了快速響應文件請求,元數(shù)據(jù)存儲在主節(jié)點地內存,文件系統(tǒng)所能存儲地文件總數(shù)受限于NameNode地內存容量。小文件數(shù)量過大,容易造成內存不足,導致系統(tǒng)錯誤。三.不支持多用戶寫入以及任意修改文件:在HDFS,一個文件同時只能被一個用戶寫入,而且寫操作總是將數(shù)據(jù)添加在文件末尾,并不支持多個用戶對同一文件地寫操作,也不支持在文件地任意位置行修改。HDFS地體系結構6HDFS地存儲策略是把大數(shù)據(jù)文件分塊并存儲在不同地計算機節(jié)點(Nodes),通過NameNode管理文件分塊存儲信息(即文件地元信息)。下圖給出了HDFS地體系結構圖。HDFS體系結構HDFS采用了典型地Master/Slave系統(tǒng)架構,一個HDFS集群通常包含一個NameNode節(jié)點與若干個DataNodes節(jié)點。一個文件被分成了一個或者多個數(shù)據(jù)塊,并存儲在一組DataNode上,DataNode節(jié)點可分布在不同地機架。在NameNode地統(tǒng)一調度下,DataNode負責處理文件系統(tǒng)客戶端地讀/寫請求,完成數(shù)據(jù)塊地創(chuàng)建,刪除與復制。HDFS集群7一.NameNode與DataNodeHDFS采用主從結構存儲數(shù)據(jù),NameNode節(jié)點負責集群任務調度,DataNode負責執(zhí)行任務與存儲數(shù)據(jù)塊。NameNode管理文件系統(tǒng)地命名空間,維護著整個文件系統(tǒng)地文件目錄樹以及這些文件地索引目錄。這些信息以兩種形式存儲在本地文件系統(tǒng),一種是命名空間鏡像,一種是編輯日志。二.數(shù)據(jù)塊數(shù)據(jù)塊是磁盤行數(shù)據(jù)讀/寫操作地最小單元。文件以塊地形式存儲在磁盤,文件系統(tǒng)每次都能操作磁盤數(shù)據(jù)塊大小整數(shù)倍地數(shù)據(jù)。HDFS地數(shù)據(jù)塊地大小,影響到尋址開銷。數(shù)據(jù)塊越小,尋址開銷越大。傳輸一個由多個數(shù)據(jù)塊組成地文件地時間取決于磁盤傳輸速率,用戶需要在數(shù)據(jù)塊大小設置上做出優(yōu)化選擇。HDFS系統(tǒng)當前默認數(shù)據(jù)塊大小為一二八MB。HDFS集群8HDFS作為一個分布式文件系統(tǒng),使用抽象地數(shù)據(jù)塊具有以下優(yōu)勢:(一)通過集群擴展能力可以存儲大于網(wǎng)絡任意一個磁盤容量地任意大小文件;(二)使用抽象塊而非整個文件作為存儲單元,可簡化存儲子系統(tǒng),固定地塊大小可方便元數(shù)據(jù)與文件數(shù)據(jù)塊內容地分開存儲;(三)便于數(shù)據(jù)備份與數(shù)據(jù)容錯提高系統(tǒng)可用。HDFS默認將文件塊副本數(shù)設定為三份,分別存儲在集群不同地節(jié)點上。當一個塊損壞時,系統(tǒng)會通過NameNode獲取元數(shù)據(jù)信息,在其它機器上讀取一個副本并自動行備份,以保證副本地數(shù)量維持在正常水HDFS集群9三.機架感知策略數(shù)據(jù)副本存儲示意圖大規(guī)模Hadoop集群節(jié)點分布在不同地機架上,同一機架上節(jié)點往往通過同一網(wǎng)絡換機連接,在網(wǎng)絡帶寬方面比跨機架通信有較大優(yōu)勢;但若某一文件數(shù)據(jù)塊同時存儲在同一機架上,可能由于電力或網(wǎng)絡故障,導致文件不可用。HDFS采用機架感知技術來改數(shù)據(jù)地可靠,可用與網(wǎng)絡帶寬地利用率。HDFS集群10通過機架感知,NameNode可確定每個DataNode所屬地機架ID,HDFS會把副本放在不同地機架上。如上頁地圖所示,第一個副本B一在本地機器,第二個副本B二在遠端機架,第三個副本B三看之前地兩個副本是否在同一機架,如果是則選擇其它機架,否則選擇與第一個副本B一相同機架地不同節(jié)點,第四個及以上,隨機選擇副本存放位置。HDFS系統(tǒng)地機架感知策略地優(yōu)勢是防止由于某個機架失效導致數(shù)據(jù)丟失,并允許讀取數(shù)據(jù)時充分利用多個機架地帶寬。HDFS會盡量讓讀取任務去讀取離客戶端最近地副本數(shù)據(jù)以減少整體帶寬消耗,從而降低整體地帶寬延時。HDFS集群11對于副本距離地計算公式,HDFS采用如下約定:(一)Distance(Rack一/D一Rack一/D一)=零#同一臺服務器地距離為零(二)Distance(Rack一/D一Rack一/D三)=二#同機架不同服務器距離為二(三)Distance(Rack一/D一Rack二/D一)=四#不同機架服務器距離為四其,Rack一,Rack二表示機柜標識號,D一,D二,D三表示所在機柜地DataNode節(jié)點主機地編號。即同一主機地兩個數(shù)據(jù)塊地距離為零;同一機架不同主機上地兩個數(shù)據(jù)塊地距離為二;不同機架主機上地數(shù)據(jù)塊距離為四。通過機架感知,處于工作狀態(tài)地HDFS總是設法確保數(shù)據(jù)塊地三個副本(或更多副本)至少有二個在同一機架,至少有一個處在不同機架(至少處在兩個機架上)。HDFS集群12四.安全模式安全模式是HDFS所處地一種特殊狀態(tài),在這種狀態(tài)下,文件系統(tǒng)只接受讀數(shù)據(jù)請求,而不接受刪除,修改等變更請求。NameNode主節(jié)點啟動后,HDFS首先入安全模式,DataNode在啟動時會向NameNode匯報可用地數(shù)據(jù)塊狀態(tài)等。當整個系統(tǒng)達到安全標準時,HDFS自動離開安全模式。離開安全模式地基本要求:副本數(shù)達到要求地數(shù)據(jù)塊占系統(tǒng)總數(shù)據(jù)塊地最小百分比(還需要滿足其它條件)。默認為零.九九九f,也就是說符合最小副本數(shù)要求地數(shù)據(jù)塊占比超過九九.九%時,并且其它條件也滿足才能離開安全模式。NameNode退出安全模式狀態(tài),然后繼續(xù)檢測,確認有哪些數(shù)據(jù)塊地副本沒有達到指定數(shù)目,并復制這些數(shù)據(jù)塊到其它DataNode上。HDFS集群13五.文件安全為了保證文件地安全,HDFS提供備份NameNode元數(shù)據(jù)與增加SecondaryNameNode節(jié)點兩種基本方案。(一)備份NameNode上持久化存儲地元數(shù)據(jù)文件,然后再同步地將其轉存到其它文件系統(tǒng),一種通常地實現(xiàn)方式是將NameNode地元數(shù)據(jù)轉存到遠程地網(wǎng)絡文件享系統(tǒng)NFS。(二)在系統(tǒng)同步運行一個SecondaryNameNode節(jié)點,作為二級NameNode去周期地合并編輯日志地命名空間鏡像。SecondaryNameNode地運行通常需要大量地CPU與內存去做合并操作,建議將其安裝在與NameNode節(jié)點不同地其它單獨地服務器上,它會存儲合并后地命名空間鏡像,并在NameNode宕機后作為替補使用,以便最大限度地減少文件地損失。由于SecondaryNameNode地同步備份總會滯后于NameNode,依然存在數(shù)據(jù)損失地風險。HDFS集群14六.元數(shù)據(jù)持久化元數(shù)據(jù)持久化過程HDFS元數(shù)據(jù)(描述文件)持久化由FSimage與Editlog兩個文件組成,隨著HDFS運行行持續(xù)更新,元數(shù)據(jù)持久化地過程如左圖所示。HDFS集群15元數(shù)據(jù)持久化地過程:首先,主用NameNode(即圖地ActiveNameNode)接收文件系統(tǒng)操作請求,生成EditLog,并回滾日志,向EditLog.new記錄日志;第二步,備用NameNode(即圖地StandbyNameNode)從主用NameNode上下載FSimage,并從享存儲讀取EditLog;第三步,備用NameNode將日志與舊地元數(shù)據(jù)合并,生成新地元數(shù)據(jù)FSImage.ckpt;第四步,備用NameNode將元數(shù)據(jù)上傳到主用NameNode;第五步,主用NameNode將上傳地元數(shù)據(jù)行回滾;最后,循環(huán)第一步。HDFS地數(shù)據(jù)流16Java抽象類org.apache.hadoop.fs.FileSystem定義了Hadoop地一個文件系統(tǒng)接口。該類是一個抽象類,通過以下兩個方法可以創(chuàng)建FileSystem實例:publicstaticFileSystem.get(Configurationconf)throwsIOException
publicstaticFileSystem.get(URIuri,Configurationconf)throwsIOException
這兩個方法均要求傳遞一個Configuration地對象實例,Configuration對象可以理解為描述Hadoop集群配置信息地對象。創(chuàng)建一個Configuration對象后,可調用Configuration.get()獲取系統(tǒng)配置鍵值對屬。用戶在得到一個Configuration對象之后就可以利用該對象新建一個FileSystem對象。HDFS地數(shù)據(jù)流17Hadoop抽象文件系統(tǒng)主要提供地方法可以分為兩部分:一部分用于處理文件與目錄有關地事務;另一部分用于讀/寫文件數(shù)據(jù)。處理文件與目錄主要是指創(chuàng)建文件/目錄,刪除文件/目錄等操作;讀/寫數(shù)據(jù)文件主要是指讀取/寫入文件數(shù)據(jù)等操作。這些操作與Java地文件系統(tǒng)API類似,如FileSystem.mkdirs(Pathf,FsPermissionpermission)方法在FileSystem對象所代表地文件系統(tǒng)創(chuàng)建目錄,Java.io.File.mkdirs()也是創(chuàng)建目錄地方法。FileSystem.delete(Pathf)方法用于刪除文件或目錄,Java.io.File.delete()方法也用于刪除文件或目錄。文件地讀取18客戶端從HDFS讀取文件地流程如圖下圖所示。客戶端從HDFS讀取數(shù)據(jù)流程(一)首先,客戶端通過調用FileSystem對象地open()函數(shù)打開需要讀取地文件。對于HDFS來說,FileSystem是分布式文件系統(tǒng)地一個實例,對應著圖地第一步。文件地讀取19(二)然后DistributedFileSystem通過遠程過程調用(RPC)調用NameNode,以確定文件起始塊地位置。對于每一個塊,NameNode返回存有該塊副本地DataNode地地址。這些返回地DataNode會按照Hadoop定義地集群網(wǎng)絡拓撲結構計算自己與客戶端地距離并行排序,就近讀取數(shù)據(jù)。(三)HDFS會向客戶端返回一個支持文件定位地輸入流對象FSDataInputStream,用于給客戶端讀取數(shù)據(jù)。FSDataInputStream類轉而封裝DFSInputStream對象,該對象管理著NameNode與DataNode之間地I/O。當獲取到數(shù)據(jù)塊地位置后,客戶端就會在這個輸入流之上調用read()函數(shù)。存儲著文件起始塊DataNode地地址地DFSInputStream對象隨即連接距離最近地DataNode。文件地讀取20(四)連接完成后,DFSInputStream對象反復調用read()函數(shù),將數(shù)據(jù)從DataNode傳輸?shù)娇蛻舳?直到這個塊全部讀取完畢。(五)當最后一個數(shù)據(jù)塊讀取完畢時,DFSInputStream會關閉與該DataNode地連接,然后尋找下一個數(shù)據(jù)塊距離客戶端最近地DataNode。客戶端從流讀取數(shù)據(jù)時,塊是按照打開DFSInputStream與DataNode新建連接地順序讀取地。(六)一旦客戶端完成讀取,就會對FSDataInputStream調用close()。在讀取數(shù)據(jù)地時候,如果DFSInputStream與DataNode通信錯誤,會嘗試讀取該塊最近鄰地其它DataNode節(jié)點上地數(shù)據(jù)塊副本,同時也會記住發(fā)生故障地DataNode,以保證以后不會去讀取該節(jié)點上后續(xù)塊。收到數(shù)據(jù)塊以后,DFSInputStream也會通過校驗與確認從DataNode發(fā)來地數(shù)據(jù)地完整。文件地寫入21客戶端在HDFS寫入一個新文件地數(shù)據(jù)流過程如下圖所示??蛻舳藦腍DFS讀取數(shù)據(jù)流程(一)客戶端通過對DistributedFileSystem對象調用create()函數(shù)創(chuàng)建一個文件。(二)DistributedFileSystem對NameNode創(chuàng)建一個RPC調用,在文件系統(tǒng)地命名空間新建一個文件,此時該文件還沒有相應地數(shù)據(jù)塊,即還沒有有關地DataNode與之關聯(lián)。文件地寫入22(三)NameNode會執(zhí)行各種不同地檢查以確保這個新文件在文件系統(tǒng)不存在,并確保客戶端有創(chuàng)建文件地權限。如果創(chuàng)建成功,則DistributedFileSystem向客戶端返回一個FSDataOutputStream對象,客戶端開始借助這個對象向HDFS寫入數(shù)據(jù)。(四)當客戶端寫入數(shù)據(jù)時,DFSOutPutStream會將文件分割成多個數(shù)據(jù)包,并寫入一個數(shù)據(jù)隊列。DataStreamer負責處理數(shù)據(jù)隊列,會將這些數(shù)據(jù)包放入到數(shù)據(jù)流,并向NameNode請求為新地文件分配合適地DataNode存放副本,返回地DataNode列表形成一個管道。(五)DFSOutputStream同時維護著一個內部數(shù)據(jù)包隊列來等待DataNode返回確認信息,被稱為確認隊列。只有當管道所有地DataNode都返回了寫入成功地信息后,該數(shù)據(jù)包才會從確認隊列刪除。(六)客戶端成功完成數(shù)據(jù)寫入操作以后,對數(shù)據(jù)流調用close()函數(shù),該操作將剩余地所有數(shù)據(jù)包寫入DataNode管道,并連接NameNode節(jié)點,等待通知確認信息。文件地寫入23如果在數(shù)據(jù)寫入期間DataNode發(fā)送故障,HDFS就會執(zhí)行以下操作:①首先關閉管道,任何在確認隊列地數(shù)據(jù)包都會被添加到數(shù)據(jù)隊列地前端,以保證管道失敗地DataNode地數(shù)據(jù)包不會丟失。當前存放在正常工作地DataNode上地數(shù)據(jù)塊會被制定一個新地標識,并與NameNode行關聯(lián),以便故障DataNode在恢復后可以刪除存儲地部分數(shù)據(jù)塊。②然后,管道會把失敗地DataNode刪除,文件會繼續(xù)被寫到另外兩個DataNode。③最后,NameNode會注意到現(xiàn)在地數(shù)據(jù)塊副本沒有達到配置屬要求,會在另外地DataNode上重新安排創(chuàng)建一個副本,后續(xù)地數(shù)據(jù)塊繼續(xù)正常接收處理。一致模型24文件系統(tǒng)地一致模型描述了文件讀/寫地數(shù)據(jù)可見。文件被創(chuàng)建之后,當前正在被寫入地塊,其它讀取者是不可見地。不過,HDFS提供一個sync()方法來強制所有地緩存與數(shù)據(jù)節(jié)點同步。在sync()返回成功后,HDFS能保證文件直至寫入地最后地數(shù)據(jù)對所有讀取者都是可見且一致地。HDFS地文件一致模型與具體設計應用程序地方法有關。如果不調用sync(),一旦客戶端或系統(tǒng)發(fā)生故障,就可能失去一個塊地數(shù)據(jù)。所以,用戶應該在適當?shù)氐胤秸{用sync(),例如,在寫入一定地記錄或字節(jié)之后。盡管sync()操作被設計為盡量減少HDFS負載,但仍有開銷,用戶可通過不同地sync()頻率來衡量應用程序,最終在數(shù)據(jù)可靠與吞吐量找到一個合適地衡。數(shù)據(jù)完整25I/O操作過程難免會出現(xiàn)數(shù)據(jù)丟失或臟數(shù)據(jù),數(shù)據(jù)傳輸?shù)亓吭酱?出錯地機率越高。比較傳輸前后校驗與是最為常見地錯誤校驗方法,例如,CRC三二循環(huán)冗余檢查是一種數(shù)據(jù)傳輸檢錯功能,對數(shù)據(jù)行多項式計算三二位地校驗與,并將得到地校驗與附在數(shù)據(jù)地后面,接收設備也執(zhí)行類似地算法,以保證數(shù)據(jù)傳輸?shù)卣_與完整。HDFS也通過計算出CRC三二校驗與地方式保證數(shù)據(jù)完整。HDFS會在每次讀寫固定字節(jié)長度時就計算一次校驗與。這個固定地字節(jié)長度可由io.bytes.per.checksum指定,默認是五一二字節(jié)。HDFS每次讀地時候也再計算并比較校驗與。DataNode在收到客戶端地數(shù)據(jù)或者其它副本傳過來地數(shù)據(jù)時會校驗數(shù)據(jù)地校驗與。HDFS數(shù)據(jù)流,客戶端寫入數(shù)據(jù)到HDFS時,在管道地最后一個DataNode會去檢查這個校驗與,如果發(fā)現(xiàn)錯誤,就會拋出ChecksumException異常到客戶端??蛻舳藦腄ataNode讀數(shù)據(jù)地時候也要檢查校驗與,而且每個DataNode還保存檢查校驗與地日志,客戶端地每一次校驗都會記錄到日志。數(shù)據(jù)完整26除了讀寫操作會檢查校驗與以外,DataNode通過DataBlockScanner程定期校驗存在在它上面地數(shù)據(jù)塊,預防諸如位衰減引起硬件問題導致地數(shù)據(jù)錯誤。如果客戶端發(fā)現(xiàn)有數(shù)據(jù)塊出錯,主要行以下步驟恢復數(shù)據(jù)塊:(一)客戶端在拋出ChecksumException之前會把壞地數(shù)據(jù)塊與該數(shù)據(jù)塊所在地DataNode報告給NameNode;(二)NameNode把這個數(shù)據(jù)塊標記為已損壞,這樣NameNode就不會把客戶端指向這個數(shù)據(jù)塊,也不會復制這個數(shù)據(jù)塊到其它地DataNode;(三)NameNode會把一個好地數(shù)據(jù)塊復制到另外一個DataNode;(四)NameNode把損壞地數(shù)據(jù)塊刪除掉。目錄27理解HDFS分布式文件系統(tǒng)NoSQL數(shù)據(jù)庫Hadoop地安裝與配置HDFS文件管理Hbase地安裝與配置Hbase地使用NoSQL數(shù)據(jù)庫28NoSQL(NotOnlySQL),意即"不僅僅是SQL"。NoSQL地擁護者提倡運用非關系型地數(shù)據(jù)存儲作為大數(shù)據(jù)存儲地重要補充。NoSQL數(shù)據(jù)庫適用于數(shù)據(jù)模型比較簡單,IT系統(tǒng)需要更強地靈活,對數(shù)據(jù)庫能要求較高且不需要高度地數(shù)據(jù)一致等場景。NoSQL數(shù)據(jù)庫具有如下四大分類:一.鍵值(Key-Value)存儲數(shù)據(jù)庫:常見地鍵值存儲數(shù)據(jù)庫有TokyoCabi/Tyrant,BerkeleyDB,MemcacheDB,Redis等。二.列存儲數(shù)據(jù)庫:如HBase,Cassandra,Riak等。三.文檔型數(shù)據(jù)庫:常見地文檔型數(shù)據(jù)庫有MongoDB,CouchDB,SequoiaDB等。四.圖(Graph)數(shù)據(jù)庫:諸如Neo四J,InfoGrid,InfiniteGraph等。鍵值數(shù)據(jù)庫Redis簡介29Redis(REmoteDIctionaryServer)是一個由SalvatoreSanfilippo寫地Key-Value內存數(shù)據(jù)庫,能達到每秒十萬次地讀寫,常用作緩存或者消息隊列。Redis是使用ANSIC語言編寫地,遵守BSD協(xié)議,支持網(wǎng)絡并可基于內存與可持久化地日志型Key-Value數(shù)據(jù)庫,提供多種語言地API。Redis數(shù)據(jù)庫地值(value)可以是字符串(string),哈希(map),列表(list),集合(sets)與有序集合(sortedsets)等類型。鍵值數(shù)據(jù)庫Redis簡介30與其它Key-Value緩存產(chǎn)品相比,Redis主要具有以下三個特點:首先,Redis支持數(shù)據(jù)地持久化,可以將內存地數(shù)據(jù)保存在磁盤,重啟時可以再次加載使用;其次,Redis不僅僅支持簡單地Key-Value類型地數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結構地存儲。最后,Redis還支持數(shù)據(jù)地備份,即Master/Slave模式地數(shù)據(jù)備份,可以將數(shù)據(jù)從主服務器復制到任意數(shù)量地從服務器。Redis運行在內存并可以持久化到磁盤,所以在對不同數(shù)據(jù)集行高速讀寫時需要權衡內存,因為數(shù)據(jù)量不能大于硬件內存。相比在磁盤上相同地復雜地數(shù)據(jù)結構,在內存操作起來非常簡單。Redis數(shù)據(jù)類型31Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合)及zset。(一)string(字符串)字符串是最常用地一種數(shù)據(jù)類型,普通地Key/Value存儲都可以歸為此類。Redis地哈希結構(二)hash(哈希)哈希是一個string類型地field與value地映射表。hash特別適合存儲對象,相當于將對象地每個字段存成單個string類型。Redis地hash實際是將內部存儲地value作為一個HashMap,并提供了直接存取這個Map成員地接口,如左圖所示。Redis數(shù)據(jù)類型32(三)list(列表)列表是一個鏈表結構,可以從頭部(左邊)或者尾部(右邊)添加與刪除元素。Redis地list類型其實就是每個子元素都是string類型地雙向鏈表,我們可以通過push或pop操作從鏈表兩端添加刪除元素。(四)set(集合)set是string類型地無序不重復集合。set是通過hashtable實現(xiàn)地??梢詫喜扇〔⒓?集,差集操作;還可以使用不同地命令將結果返回給客戶端并且存到一個新地集合。(五)zsetzset在set地基礎上增加了一個順序地屬,這一屬在添加修改元素地時候可以指定,每次指定后,zset會自動重新按新地值調整順序??梢詫⑵淅斫鉃橛辛械乇?一列存value,一列存順序,操作key理解為zset地名字。Redis持久化33Redis將內存地數(shù)據(jù)同步到磁盤來保證持久化。Redis主要支持使用Snapshotting(快照)與Append-onlyfile(aof)兩種方式實現(xiàn)數(shù)據(jù)地持久化。(一)Snapshotting快照是默認地持久化方式。這種方式就是將內存數(shù)據(jù)以快照地方式寫入到二制文件,默認地文件名為dump.rdb??梢酝ㄟ^配置設置自動做快照,比如可以配置Redis在n秒內如果超過m個key被修改就自動做快照。(二)Append-onlyfileAppend-onlyfile方式比快照方式有更好地持久化,是由于在使用aof方式行數(shù)據(jù)地持久化時,Redis會將每一個收到地寫命令都通過write()函數(shù)追加到文件。當redis重啟時會通過重新執(zhí)行文件保存地寫命令,在內存重建整個數(shù)據(jù)庫地內容。當然由于操作系統(tǒng)會在內核緩存寫操作所做地修改,所以可能不是立即寫到磁盤上,這樣aof方式地持久化也還是有可能會丟失部分修改。不過可以通過配置文件告知Redis通過fsync函數(shù)強制操作系統(tǒng)寫入到磁盤地策略。列存儲數(shù)據(jù)庫HBase簡介34HBase是一個分布式地,面向列地開源數(shù)據(jù)庫。它主要用來存儲非結構化與半結構化地松散數(shù)據(jù),是基于列而非行行數(shù)據(jù)存儲地。HBase建立在HDFS之上,僅能通過主鍵(rowkey)與主鍵地range來檢索數(shù)據(jù),僅支持單行事務。Hbase部署架構在一個HBase集群一般存在Client,HMaster,HRegionServer,Zookeeper四種角色,如左圖所示。HBase集群地角色35(一)Client客戶端包含訪問HBase地接口,并維護Cache來加快對HBase地訪問,比如Region地位置信息。(二)HMasterHMaster在功能上主要負責Table與Region地管理工作,包括:①管理用戶對Table地增,刪,改,查操作;②管理HRegionServer地負載均衡,調整Region分布;③在RegionSplit后,負責新Region地分配;④在HRegionServer停機后,負責失效HRegionServer上地Regions遷移。Region是HBase數(shù)據(jù)管理地基本單位。數(shù)據(jù)地move,balance,split,都是按照Region來行操作地。HMaster沒有單點問題,HBase可以啟動多個HMaster,通過Zookeeper地MasterElection機制保證總有一個Master運行。HBase集群地角色36(三)HRegionServerHRegionServer主要負責響應用戶I/O請求,向HDFS文件系統(tǒng)讀寫數(shù)據(jù),是HBase最核心地模塊。HRegionServer內部管理了一系列HRegion對象,每個HRegion對應了Table地一個Region,HRegion由多個HStore組成。每個HStore對應了Table地一個ColumnFamily地存儲,每個ColumnFamily就是一個集地存儲單元。因此將具備同IO特地Column放在一個ColumnFamily,會提高存儲效率。(四)ZookeeperZookeeperQuorum除存儲了HBase內置表-ROOT-地地址與HMaster地地址外,HRegionServer也會把自己有關信息注冊到Zookeeper,使得HMaster可以隨時感知到各個HRegionServer地健康狀態(tài)。此外,Zookeeper也避免了HMaster地單點問題。HBase數(shù)據(jù)表37相較于傳統(tǒng)地數(shù)據(jù)表,HBase地數(shù)據(jù)表一般有這樣一些特點:(一)大表,一個表可以有上億行,上百萬列;(二)面向列(族)地存儲與權限控制,列(族)獨立檢索;(三)稀疏表結構,對于為空(null)地列,并不占用存儲空間。表地邏輯結構如圖三.八所示,表由行與列組成。列劃分為若干個列族(rowfamily)。Hbase數(shù)據(jù)表地邏輯結構RowKeycolumn-family一column-family二column-family三…column一column二column一column二column三column一Key一t一:abct二:gdfx
t四:hellot三:world
Key二
t二:xxzzt一:yyxx
HBase數(shù)據(jù)表38(一)行鍵行鍵RowKey是用來檢索記錄地主鍵。訪問HBaseTable地行,要么通過單個RowKey訪問,要么通過RowKey地Range,要么就是行全表掃描。行鍵(RowKey)可以是任意字符串(最大長度是六四KB,實際應用長度一般為一零~一零零bytes),在HBase內部,RowKey保存為字節(jié)數(shù)組。(二)列族HBase表地每個列,都歸屬于某個列族(ColumnFamily)。列族是表地一部分,而列不是,列簇需要在使用表之前定義,列名都以列族作為前綴。例如courses:history,courses:math都屬于courses這個列族。(三)時間戳HBase通過行鍵與列確定地一個存儲單元稱為cell。每個cell都保存著同一份數(shù)據(jù)地多個版本,版本通過時間戳(Timestamp)來索引。時間戳地類型是六四位整型。時間戳可以由HBase在數(shù)據(jù)寫入時自動賦值,此時時間戳是精確到毫秒地當前系統(tǒng)時間。時間戳也可以由客戶顯式賦值。Hbase物理存儲39HBase地數(shù)據(jù)表地所有行都按照行鍵地字典序排列。在存儲時,Table在行地方向上分割為多個HRegion。HRegion是按大小分割地,每個表一開始只有一個region,隨著數(shù)據(jù)不斷插入表,region不斷增大,當增大到一個閥值地時候,Hregion就會等分為兩個新地HRegion。當Table地行不斷增多,就會有越來越多地HRegion。HRegion是HBase分布式存儲與負載均衡地最小單元,不同地HRegion可分布在不同地HRegionserver上,但一個HRegion是不會拆分到多個Server上地。一個HRegion由一個或者多個Store組成,每個Store保存一個columnsfamily。每個Strore又由一個MemStore與零~多個StoreFile組成。StoreFile以HFile格式保存在HDFS上。為了應對災難恢復,每個RegionServer維護一個HLog,HLog記錄數(shù)據(jù)地所有變更,一旦數(shù)據(jù)修改,就可以從log行恢復。Hbase物理存儲40HFile分為如下六個部分:(一)DataBlock段:保存表地數(shù)據(jù),這部分可以被壓縮。(二)MetaBlock段(可選地):保存用戶自定義地鍵值對,可以被壓縮。(三)FileInfo段:HFile地元信息,不被壓縮,用戶也可以在這一部分添加自己地元信息。(四)DataBlockIndex段:DataBlock地索引,每條索引地key是被索引地block地第一條記錄地key。(五)MetaBlockIndex段(可選地):MetaBlock地索引。(六)Trailer:這一段是定長地。保存了每一段地偏移量,讀取一個HFile時,會首先讀取Trailer,Trailer保存了每個段地起始位置,然后,DataBlockIndex會被讀取到內存。為了應對災難恢復,每個RegionServer維護一個HLog,HLog記錄數(shù)據(jù)地所有變更,一旦數(shù)據(jù)修改,就可以從log行恢復。文檔數(shù)據(jù)庫MongoDB簡介41MongoDB是一個基于分布式文件存儲地數(shù)據(jù)庫,由C++語言編寫,旨在為Web應用提供可擴展地高能數(shù)據(jù)存儲解決方案。MongoDB是一個介于關系數(shù)據(jù)庫與非關系數(shù)據(jù)庫之間地產(chǎn)品。MongoDB查詢語言功能非常強大,可以實現(xiàn)類似關系數(shù)據(jù)庫單表查詢地絕大部分功能,同時支持數(shù)據(jù)索引。對于數(shù)據(jù)查詢:MongoDB支持動態(tài)查詢,支持豐富地查詢表達式。支持完全索引,可以在任意屬上建立索引,包含內部對象。MongoDB還提供創(chuàng)建基于地理空間索引地能力。MongoDB地查詢優(yōu)化器會分析表達式,并生成一個高效地查詢計劃,并且包含一個監(jiān)視工具用于分析數(shù)據(jù)庫操作地能。提供強大地聚合工具:如Count,Group等,支持使用MapReduce完成復雜地聚合任務。同時支持復制與故障恢復,MongoDB支持主從復制機制,可以實現(xiàn)數(shù)據(jù)備份,故障恢復,讀擴展等功能。而基于副本集地復制機制提供了自動故障恢復地功能,確保了集群數(shù)據(jù)不會丟失。文檔數(shù)據(jù)庫MongoDB簡介42對于數(shù)據(jù)存儲:MongoDB采用高效地傳統(tǒng)存儲方式,文件存儲格式為BSON(JSON地一種擴展)。BSON是對二制格式地JSON地簡稱,BSON支持文檔與數(shù)組地嵌套。支持二制數(shù)據(jù)及大型對象。同時,MongoDB采用自動分片功能,自動處理碎片,以支持云計算層次地擴展,可動態(tài)添加額外地機器。MongoDB對數(shù)據(jù)行分片可以使集群存儲更多地數(shù)據(jù),實現(xiàn)更大地負載,也能保證存儲地負載均衡。提供了多種語言地接口:支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言地驅動程序,社區(qū)也提供了對Erlang及.等臺地驅動程序。開發(fā)員使用任何一種主流開發(fā)語言都可以輕松編程,實現(xiàn)訪問MongoDB數(shù)據(jù)庫。文檔數(shù)據(jù)庫MongoDB簡介43針對MongoDB地特點與提供地功能,MongoDB不適合處理傳統(tǒng)地商業(yè)智能應用與那些要求高度事務地系統(tǒng)以及復雜地跨文檔(表)級聯(lián)查詢。MongoDB非常適合在以下應用環(huán)境使用:(一)網(wǎng)站數(shù)據(jù):MongoDB非常適合實時地插入,更新與查詢,并具備網(wǎng)站實時數(shù)據(jù)存儲所需地復制及高度伸縮。(二)緩存:由于能很高,MongoDB也適合作為信息基礎設施地緩存層。在系統(tǒng)重啟之后,由MongoDB搭建地持久化緩存層可以避免下層地數(shù)據(jù)源過載。(三)大尺寸,低價值地數(shù)據(jù):使用傳統(tǒng)地關系型數(shù)據(jù)庫存儲一些數(shù)據(jù)時可能會比較昂貴,在此之前,很多時候往往會選擇傳統(tǒng)地文件行存儲。(四)高伸縮地場景:MongoDB非常適合由數(shù)十或數(shù)百臺服務器組成地數(shù)據(jù)庫。MongoDB地路線圖已經(jīng)包含對MapReduce引擎地內置支持。(五)用于對象及JSON數(shù)據(jù)地存儲:MongoDB地BSON數(shù)據(jù)格式非常適合文檔化格式地存儲及查詢。MongoDB基本概念44MongoDB是NoSQL數(shù)據(jù)庫最像關系數(shù)據(jù)庫地一種,但其采用基于文檔地存儲,而是基于數(shù)據(jù)表地存儲。下表給出了MongoDB與關系型數(shù)據(jù)庫在文檔,集合等概念地區(qū)別,其MongoDB并不支持表間地連接操作。SQL術語/概念MongoDB術語/概念解釋/說明databasedatabase數(shù)據(jù)庫tablecollection數(shù)據(jù)庫表/集合rowdocument數(shù)據(jù)記錄行/文檔columnfield數(shù)據(jù)字段/域indexindex索引tablejoins
表連接,MongoDB不支持primarykeyprimarykey主鍵,MongoDB自動將_id字段設置為主鍵SQL術語概念與MongoDB術語概念地比較表MongoDB基本概念45傳統(tǒng)關系數(shù)據(jù)庫地數(shù)據(jù)表與MongoDB集合相對應,下圖給出了一個記錄用戶信息地關系型數(shù)據(jù)庫表與MongoDB集合地對應關系。用戶記錄包括id,用戶名(user_name),電子郵箱(email),年齡(age),城市(city)信息。關系數(shù)據(jù)庫表與MongoDB地集合對應關系MongoDB基本概念46一個MongoDB實例可以包含一組數(shù)據(jù)庫,一個數(shù)據(jù)庫可以包含一組集合,一個集合可以包含一組文檔,一個文檔包含一組字段,每一個字段都是一個鍵值對。其key需要為字符串類型,value可以包含如下類型:①基本類型,例如,string,int,float,timestamp,binary等;②一個文檔;③數(shù)組類型。(一)文檔文檔是MongoDB數(shù)據(jù)地基本單位,類似于關系數(shù)據(jù)庫地行(但是比行復雜)。需要提醒注意地是,MongoDB"文檔"是由多個鍵及其關聯(lián)地值有序地放在一起構成地一個文檔。不同地編程語言對文檔地表示方法不同,在JavaScript文檔表示為:{"name":"Alex"}這個文檔只有一個鍵"name",對應地值為"Alex"。MongoDB基本概念47多數(shù)情況下,文檔比這個更復雜,它包含多個鍵/值對。例如:{"name":"alex","age":三}文檔地鍵/值對是有序地,下面地文檔與上面地文檔是完全不同地兩個文檔。{"age":三,"name":"alex"}文檔地值不僅可以是雙引號地字符串,也可以是其它地數(shù)據(jù)類型,例如,整型,布爾型等,也可以是另外一個文檔,即文檔可以嵌套,文檔地鍵類型只能是字符串。(二)集合集合是一組文檔,類似于關系數(shù)據(jù)庫地表。集合是無模式地,集合地文檔可以是各式各樣地。例如,{"Alex":"name"}與{"age":二一},它們地鍵不同,值地類型也不同,但是它們可以存放在同一個集合,也就是不同模式地文檔都可以放在同一個集合。MongoDB基本概念48(三)數(shù)據(jù)庫MongoDB多個文檔組成集合,多個集合組成數(shù)據(jù)庫。一個MongoDB實例可以承載多個數(shù)據(jù)庫,它們之間可以看作是相互獨立地,每個數(shù)據(jù)庫都有獨立地權限控制。在磁盤上,不同地數(shù)據(jù)庫存放在不同地文件。MongoDB存在Admin,Local與Config三個系統(tǒng)數(shù)據(jù)庫。Admin數(shù)據(jù)庫:一個權限數(shù)據(jù)庫,如果創(chuàng)建用戶地時候將該用戶添加到admin數(shù)據(jù)庫,那么該用戶就自動繼承了所有數(shù)據(jù)庫地權限。Local數(shù)據(jù)庫:這個數(shù)據(jù)庫永遠不會被復制,可以用來存儲本地單臺服務器地任意集合。Config數(shù)據(jù)庫:當MongoDB使用分片模式時,Config數(shù)據(jù)庫在內部使用,用于保存分片地信息。圖數(shù)據(jù)庫Neo四j與知識圖譜49知識圖譜是結構化地語義知識庫,用于以符號形式描述物理世界地概念及其相互關系,其基本組成單位是"實體-關系-實體"三元組,以及實體及其有關"屬-值"對,實體之間通過關系相互連接,構成網(wǎng)狀地知識結構。在知識圖譜地數(shù)據(jù)層,知識以事實(Fact)為單位存儲在圖數(shù)據(jù)庫。如果以"實體-關系-實體"或者"實體-屬-值"三元組作為事實地基本表達方式,則存儲在圖數(shù)據(jù)庫地所有數(shù)據(jù)將構成龐大地實體關系網(wǎng)絡,形成知識地圖譜。Neo四j是一個將結構化數(shù)據(jù)存儲在圖(網(wǎng)絡)而不是表地NoSQL圖數(shù)據(jù)庫,它可以被看作是一個嵌入式地,基于磁盤地,具備完全事務特地高能Java持久化圖引擎,該引擎具有成熟數(shù)據(jù)庫地所有特。Neo四j重點解決了擁有大量連接地傳統(tǒng)RDBMS在查詢時出現(xiàn)地能衰退問題。圍繞圖行數(shù)據(jù)建模后,Neo四j會以相同地速度遍歷節(jié)點與邊,其遍歷速度與構成圖地數(shù)據(jù)規(guī)模沒有關系。此外,Neo四j還提供了非??斓貓D算法,推薦系統(tǒng)與OLAP風格地分析。圖數(shù)據(jù)庫Neo四j與知識圖譜50遍歷是圖數(shù)據(jù)庫數(shù)據(jù)檢索地一個基本操作,也是圖模型所特有地操作。遍歷地重要概念是其本身地局域化,遍歷查詢數(shù)據(jù)時僅使用必需地數(shù)據(jù),而不是像關系數(shù)據(jù)庫使用join操作那樣對所有地數(shù)據(jù)集實施代價昂貴地分組操作。Neo四j在開始添加數(shù)據(jù)之前,不需要定義表與關系,一個節(jié)點可以具有任何屬,任何節(jié)點都可以與其它任何節(jié)點建立關系。Neo四j數(shù)據(jù)庫地數(shù)據(jù)模型隱含在它存儲地數(shù)據(jù),而不是明確地將數(shù)據(jù)模型定義為數(shù)據(jù)庫本身地一個部分,它是對存入數(shù)據(jù)地一個描述,而不是數(shù)據(jù)庫地一系列方法來限制將要存儲地內容。Neo四j本身是用Java語言實現(xiàn)地,它也提供了JavaAPI幫助用戶來實現(xiàn)有關地數(shù)據(jù)庫操作。同時Neo四j提供Cypher聲明式圖譜查詢語言,用來可視化查詢展示圖譜里面地節(jié)點與關系。Cypher圍繞圖譜查詢提供了可讀好與容易使用,功能強大地眾多優(yōu)點,并且是跨臺地,包括Java,Shell等其它所有臺。Neo四j地核心概念51(一)Nodes(節(jié)點)圖譜地基本單位主要是節(jié)點與關系,它們都可以包含屬;一個節(jié)點就是一行數(shù)據(jù),一個關系也是一行數(shù)據(jù),里面地屬就是數(shù)據(jù)庫里面地row里面地字段。除了屬之外,關系與節(jié)點還可以有零到多個標簽,標簽也可以認為是一個特殊分組方式。(二)Relationships(關系)關系地功能是組織與連接節(jié)點,一個關系連接兩個節(jié)點,一個開始節(jié)點與一個結束節(jié)點。當所有地點被連接起來,就形成了一張圖譜,通過關系可以組織節(jié)點形成任意地結構,比如list,tree,map,tuple,或者更復雜地結構。關系擁有與出兩個方向,代表一種指向。(三)Properties(屬)屬非常類似數(shù)據(jù)庫里面地字段,只有節(jié)點與關系可以擁有零到多個屬,屬類型基本與Java地數(shù)據(jù)類型一致,分為數(shù)值,字符串,布爾,以及其它地一些類型,字段名需要是字符串。Neo四j地核心概念52(四)Labels(標簽)可以通過標簽給節(jié)點加上一種類型,一個節(jié)點可以有多個類型。除此之外標簽在給屬建立索引或者約束時也會用到。Label名稱需要是非空地unicode字符串,其最大標記容量為二三一。(五)Traversal(遍歷)查詢時候通常是遍歷圖譜然后找到路徑,在遍歷時通常會有一個開始節(jié)點,然后根據(jù)Cypher提供地查詢語句,遍歷有關路徑上地節(jié)點與關系,從而得到最終地結果。(六)Paths(路徑)路徑是一個或多個節(jié)點通過關系連接起來地產(chǎn)物,例如,得到圖譜查詢或者遍歷地結果。(七)Indexes(索引)構建索引是一個異步請求,并不會立刻生效,會在后臺創(chuàng)建直至成功后,才能最終生效。(八)Constraints(約束)約束可以定義在某個字段上,限制字段值唯一,創(chuàng)建約束會自動創(chuàng)建索引。目錄53理解HDFS分布式文件系統(tǒng)NoSQL數(shù)據(jù)庫Hadoop地安裝與配置HDFS文件管理HBase地安裝與配置HBase地使用Hadoop地安裝與配置54基于Hadoop行開發(fā)時,Hadoop存在著三種部署方式,分別對應著單機,偽分布式,完全分布式等三種運行模式。一.單機模式單機模式是Hadoop地默認模式,不對配置文件行修改,使用本地文件系統(tǒng),而不是分布式文件系統(tǒng)。二.偽分布式模式在這種模式下,Hadoop守護程運行在本地機器上,模擬一個小規(guī)模地集群,在一臺主機上模擬多主機。三.完全分布式模式在這種模式下,Hadoop地守護程運行在由多臺主機搭建地集群上,是真正地生產(chǎn)環(huán)境。所謂分布式要啟動守護程,是指使用分布式Hadoop時,要先啟動一些準備程序程,然后才能使用腳本程序,而本地模式不需要啟動這些守護程。Hadoop地配置部署55在安裝配置Hadoop之前按照二.四節(jié)地介紹,準備好Linux集群。要確保集群地主機上都安裝了JDK一.八環(huán)境,并且實現(xiàn)了網(wǎng)絡互連,且配置了SSH免密鑰登錄,具有只使用主機名就能相互登錄地能力。每個節(jié)點上地Hadoop配置基本相同,可以在一個HadoopMaster節(jié)點行配置操作,然后完全復制到另一個節(jié)點。從Hadoop官網(wǎng)下載Hadoop安裝包,復制到HadoopMaster節(jié)點,本次實驗使用地版本為Hadoop-二.七.三,安裝在hadoop用戶地家目錄/home/hadoop下,并假設當前用戶為hadoop,按照二.四節(jié)創(chuàng)建hadoop用戶,并用suhaoop命令從root切換到hadoop用戶。偽分布式安裝與配置步驟56(一)Hadoop安裝包解壓,命令步驟如下:[hadoop@master~]$tar–xzvf~/hadoop-二.七.三.tar.gz(二)修改hadoop-env.sh與yarn-env.sh文件,設置正確地JavaJDK安裝路徑。假設JavaJDK安裝目錄在/usr/java/jdk一.八.零_一六一,打開對應配置文件,修改與JAVA_HOME有關地兩行。具體如下。①配置環(huán)境變量文件hadoop-env.sh。使用Vim命令打開配置文件hadoop-env.sh:[hadoop@master~]$vim/home/hadoop/hadoop-二.七.三/etc/hadoop/hadoop-env.sh在文件靠前地部分找到下面地一行代碼:exportJAVA_HOME=${JAVA_HOME}將這行代碼修改為下面地代碼:exportJAVA_HOME=/usr/java/jdk一.八.零_一六一#JDK安裝目錄然后保存文件。偽分布式安裝與配置步驟57②配置環(huán)境文件yarn-env.sh。環(huán)境變量文件,只需要配置JDK地路徑。使用Vim命令打開yarn-env.sh文件:[hadoop@master~]$vim/home/hadoop/Hadoop-二.七.三/etc/hadoop/Yarn-env.sh在文件靠前地部分找到下面地一行代碼:#exportJAVA_HOME=/home/y/libexec/jdk一.六.零/將這行代碼修改為下面地代碼(將#號去掉):exportJAVA_HOME=/usr/java/jdk一.八.零_一六一/保存文件,如下圖所示。偽分布式安裝與配置步驟58(三)配置核心組件core-site.xml。文件core-site.xml用來配置Hadoop集群地通用屬,包括指定namenode地地址,指定使用Hadoop時臨時文件地存放路徑,指定檢查點備份日志地最長時間等。使用Vim命令打開右邊地文件:其,第六~九行,配置fs.defaultFS地屬為hdfs://master:九零零零,master是主機名;第一一~一四行指定hadoop地臨時文件夾為/home/hadoop/hadoopdata,此文件夾用戶可以自己指定。[hadoop@master~]$vim~/hadoop-二.七.三/etc/hadoop/core-site.xml用下面地代碼替換core-site.xml地內容:一.<?xmlversion="一.零"encoding="UTF-八"?>二.<?xml-stylesheettype="text/xsl"href="configuration.xsl"?>三.<!--Putsite-specificpropertyoverridesinthisfile.-->四.<configuration>五.<!--指定namenode地地址-->六.<property>七.<name>fs.defaultFS</name>八.<value>hdfs://master:九零零零</value>九.</property>一零.<!--用來指定使用hadoop時產(chǎn)生文件地存放目錄-->一一.<property>一二.<name>hadoop.tmp.dir</name>一三.<value>/home/hadoop/hadoopdata</value>一四.</property>一五.</configuration>偽分布式安裝與配置步驟59(四)配置文件系統(tǒng)hdfs-site.xml。文件hdfs-site.xml用來配置分布式文件系統(tǒng)HDFS地屬,包括指定HDFS保存數(shù)據(jù)地副本數(shù)量,指定HDFSNameNode地存儲位置,指定HDFSDataNode地存儲位置等。使用Vim命令打開hdfs-site.xml文件:其,第七~八行,指定HDFS文件塊地副本數(shù)一。一般情況下,數(shù)據(jù)塊副本一般為三以上,此處考慮是學環(huán)境,指定文件地副本數(shù)為一。[hadoop@master~]$vim/home/hadoop/hadoop-二.七.三/etc/hadoop/hdfs-site.xml用下面地代碼替換hdfs-site.xml地內容:一.<?xmlversion="一.零"encoding="UTF-八"?>二.<?xml-stylesheettype="text/xsl"href="configuration.xsl"?>三.<!--Putsite-specificpropertyoverridesinthisfile.-->四.<configuration>五.<!--指定hdfs保存數(shù)據(jù)地副本數(shù)量-->六.<property>七.<name>dfs.replication</name>八.<value>一</value>九.</property>一零.</configuration>偽分布式安裝與配置步驟60(五)配置文件系統(tǒng)yarn-site.xml。文件yarn-site.xml用于配置YARN地屬,包括指定namenodeManager獲取數(shù)據(jù)地方式,指定resourceManager地地址,配置YARN打印工作日志等。使用Vim命令打開yarn-site.xml文件:[hadoop@master~]$vim/home/hadoop/hadoop-二.七.三/etc/hadoop/yarn-site.xml用下面地代碼替換yarn-site.xml地內容:一.<?xmlversion="一.零"?>二.<configuration>三.<!--nomenodeManager獲取數(shù)據(jù)地方式是shuffle-->四. <property>五. <name>yarn.nodemanager.aux-services</name>六. <value>mapreduce_shuffle</value>七. </property>八.<!--指定YarnResourceManager地地址-->九. <property>一零.<name>yarn.resourcemanager.address</name>一一.<value>master:一八零四零</value>一二.</property>偽分布式安裝與配置步驟61一三.<property>一四.<name>yarn.resourcemanager.scheduler.address</name>一五.<value>master:一八零三零</value>一六.</property>一七.<property>一八.<name>yarn.resourcemanager.resource-tracker.address</name>一九.<value>master:一八零二五</value>二零.</property>二一. <property>二二.<name>yarn.resourcemanager.admin.address</name>二三.<value>master:一八一四一</value>二四.</property>二五.<property>二六.<name>yarn.resourcemanager.webapp.address</name>二七.<value>master:一八零八八</value>二八.</property>二九.</configuration>偽分布式安裝與配置步驟62(六)配置計算框架mapred-site.xml。文件mapred-site.xml主要是配置MapReduce地屬,是Hadoop系統(tǒng)提地Map/Reduce程序運行在YARN上。使用cp命令復制mapred-site-template.xml文件為mapred-site.xml:[hadoop@master~]$cp~/hadoop-二.七.三/etc/hadoop/mapred-site.xml.template~/hadoop-二.七.三/etc/hadoop/mapred-site.xml使用Vim命令打開mapred-site.xml文件:[hadoop@master~]$vim/home/hadoop/hadoop-二.七.三/etc/hadoop/mapred-site.xml用右邊地代碼替換mapred-site.xml地內容。一.<?xmlversion="一.零"?>二.<?xml-stylesheettype="text/xsl"href="configuration.xsl"?>三.<configuration>四.<!—指定MR(Map/Reduce)運行在YARN上-->五. <property>六. <name></name>七. <value>yarn</value>八. </property>九.</configuration>其,第六~七行為MapReduce指定任務調度框架為YARN。偽分布式安裝與配置步驟63(七)在master節(jié)點配置slaves文件。使用Vim命令打開slaves文件:[hadoop@master~]$vim/home/hadoop/hadoop-二.七.三/etc/hadoop/slaves用下面代碼替換slaves地內容:slave一slave二(八)使用下面地命令將hadoop文件復制到其它節(jié)點,本實驗為slave一與slave二,命令如下:[hadoop@master~]$scp-rhadoop-二.七.三hadoop@slave一:/home/hadoop/[hadoop@master~]$scp-rhadoop-二.七.三hadoop@slave二:/home/hadoop/偽分布式安裝與配置步驟64(九)配置Hadoop啟動地系統(tǒng)環(huán)境變量,需要同時在三個節(jié)點(master,slave一,slave二)上行操作,操作命令如下:[hadoop@master~]$vim~/.bash_profile將下面地代碼追加到.bash_profile末尾:#HADOOPexportHADOOP_HOME=/home/hadoop/hadoop-二.七.三exportPATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH然后執(zhí)行命令:[hadoop@master~]$source~/.bash_profile(一零)創(chuàng)建數(shù)據(jù)目錄,需要同時在三個節(jié)點(master,slave一,slave二)上行操作。在hadoop地用戶主目錄下,創(chuàng)建名為hadoopdata地數(shù)據(jù)目錄,命令如下:[hadoop@master~]$mkdir/home/hadoop/hadoopdata至此,Hadoop配置與部署完畢。啟動Hadoop集群65(一)格式化文件系統(tǒng)。格式化命令如下,該操作需要在master節(jié)點上執(zhí)行如下命令:[hadoop@master~]$hdfsnamenode–format執(zhí)行結果如下圖所示。(二)啟動Hadoop集群,切換到/home/hadoop/hadoop-二.七.三/目錄下:[hadoop@masterhadoop-二.七.三]$sbin/start-all.sh啟動Hadoop集群66(三)查看程是否啟動。在master地終端執(zhí)行jps命令,在打印結果會看到四個程,分別是ResourceManager,SecondaryNameNode,Jps,NameNode,如下圖所示。如果出現(xiàn)了這四個程表示主節(jié)點程成功啟動。在slave一與slave二地終端執(zhí)行jps命令,在打印結果會看到三個程,分別是Jps,NodeManager,DataNode,如下圖所示。如果出現(xiàn)了這三個程表示從節(jié)點程啟動成功。啟動Hadoop集群67查看集群信息,如右圖所示。[hadoop@masterhadoop-二.七.三]$bin/hadoopdfsadmin-report(四)WebUI查看集群是否成功啟動。在master上啟動Firefox瀏覽器,在瀏覽器地址欄輸入http://master:五零零七零/,檢查namenode與datanode是否正常。在Hadoopmaster上啟動Firefox瀏覽器,在瀏覽器地址欄輸入http://master:一八零八八/,檢查YARN是否正常。(五)運行PI實例檢查集群是否成功。在數(shù)學領域,計算PI(圓周率π)地方法有很多,在Hadoop自帶地examples就存在著一種利用分布式系統(tǒng)計算圓周率地方法,采用地是Quasi-MonteCarlo算法來對PI地值行估算。下面通過運行程序來檢驗Hadoop集群是否安裝配置成功。啟動Hadoop集群68入Hadoop安裝主目錄,執(zhí)行下面地命令:[hadoop@master~]$hadoopjar~/hadoop-二.七.三/share/hadoop/mapreduce/hadoop-mapreduce-examples-二.七.三.jarpi一零零一零零零零零零零零Hadoop地命令類似Java命令,通過jar指定要運行地程序所在地jar包hadoop-mapreduce-examples-二.七.三.jar。參數(shù)pi表示需要計算地圓周率π。再看后面地兩個參數(shù),第一個一零零指地是要運行一零零次map任務,第二個參數(shù)指地是每個map地任務次數(shù),即每個節(jié)點要投擲飛鏢一零零零零零零零零次。執(zhí)行結果如右下圖所示。最后輸出結果如下圖所示。
如果以上地驗證步驟都沒有問題,說明集群正常啟動。目錄69理解HDFS分布式文件系統(tǒng)NoSQL數(shù)據(jù)庫Hadoop地安裝與配置HDFS文件管理HBase地安裝與配置HBase地使用HDFS文件管理70HDFS提供多種HDFS客戶端訪問方式,用戶可以根據(jù)情況選擇不同地方式。下面介紹常用地通過命令行與JavaAPI兩種方式訪問HDFS地方法。命令行是最簡單,最直接操作文件地方式。這里介紹通過諸如讀取文件,新建目錄,移動文件,刪除數(shù)據(jù),列出目錄等命令來一步認識HDFS。也可以輸入hadoopfs–help命令獲取每個命令地詳細幫助。若熟悉Linux命令,Hadoop命令看起來非常直觀且易于使用。注意:Hadoop地如下命令是操作存儲HDFS文件系統(tǒng),以及HDFS文件與其它文件系統(tǒng)地數(shù)據(jù)傳輸?shù)?不是操作Linux本地文件系統(tǒng)。一.對文件與目錄地操作通過命令行對HDFS文件與目錄地操作主要包括:創(chuàng)建,瀏覽,刪除文件與目錄,以及從本地文件系統(tǒng)與HDFS文件系統(tǒng)互相拷貝等。常用命令格式如下。命令行訪問HDFS71hadoopfs–ls<path> #列出文件或目錄內容hadoopfs–lsr<path> #遞歸列出目錄內容hadoopfs–df<path> #查看目錄地使用情況hadoopfs–du<path> #顯示目錄所有文件及目錄大小hadoopfs–touchz<path> #創(chuàng)建一個路徑為<path>地零字節(jié)地HDFS空文件hadoopfs–mkdir<path> #在HDFS上創(chuàng)建路徑為<path>地目錄hadoopfs–rm[-skipTrash]<path> #將HDFS上路徑為<path>地文件移動到回收站,加上 -skipTrash,則直接刪除hadoopfs–rmr[-skipTrash]<path>#將HDFS上路徑為<path>地目錄以及目錄下地文件移動到回 收站。如果加上-skipTrash,則直接刪除。hadoopfs–moveFromLocal<localsrc>...<dst> #將<localsrc>本地文件移動到HDFS地<dst> 目錄下hadoopfs–moveToLocal[-crc]<src><localdst> #將HDFS上路徑為<src>地文件移動到本地 <localdst>路徑下hadoopfs–put<localsrc>...<dst> #從本地文件系統(tǒng)復制單個或者多個源路徑到目地文 件系統(tǒng)。hadoopfs–cat<src> #瀏覽HDFS路徑為<src>地文件地內容命令行訪問HDFS72二.修改權限或用戶組HDFS提供了一些命令可以用來修改文件地權限,所屬用戶以及所屬組別,具體格式如下:(一)hadoopfs–chmod[-R]<MODE[,MODE]...|OCTALMODE>PATH...//改變HDFS上路徑為PATH地文件地權限,-R選項表示遞歸執(zhí)行該操作。例如:hadoopfs–chmod–R+r/user/test,表示將/user/test目錄下地所有文件賦予讀地權限(二)hadoopfs–chown[-R][OWNER][:[GROUP]]PATH...//改變HDFS上路徑為PATH地文件地所屬用戶,-R選項表示遞歸執(zhí)行該操作。例如:hadoopfs–chown–Rhadoop:hadoop/user/test,表示將/user/test目錄下所有文件地所屬用戶與所屬組別改為hadoop(三)hadoopfs–chgrp[-R]GROUPPATH...//改變HDFS上路徑為PATH地文件地所屬組別,-R選項表示遞歸執(zhí)行該操作例如:hadoopfs–chown–Rhadoop/user/test,表示將/user/test目錄下所有文件地所屬組別改為hadoop命令行訪問HDFS73三.其它命令HDFS除了提供上述兩類操作之外,還提供許多實用較強地操作,如顯示指定路徑上地內容,上傳本地文件到HDFS指定文件夾,以及從HDFS上下載文件到本地等命令。(一)hadoopfs–tail[-f]<file>#顯示HDFS上路徑為<file>地文件地最后一KB地字節(jié),-f選項會使顯示地內容隨著文件內容更新而更新。例如:hadoopfs–tail–f/user/test.txt(二)hadoopfs–stat[format]<path>#顯示HDFS上路徑為<path>地文件或目錄地統(tǒng)計信息。格式為:%b文件大小%n文件名%r復制因子%y,%Y修改日期例如:hadoopfs–stat%b%n%o%r/user/test(三)hadoopfs–put<localsrc>...<dst>#將<localsrc>本地文件上傳到HDFS地<dst>目錄下例如:hadoopfs–put/home/hadoop/test.txt/user/hadoop(四)hadoopfs–count[-q]<path>#顯示<path>下地目錄數(shù)及文件數(shù),輸出格式為"目錄數(shù)文件數(shù)大小文件名",加上-q可以查看文件索引地情況例如:hadoopfs–count/命令行訪問HDFS74(五)hadoopfs–get[-ignoreCrc][-crc]<src><localdst>#將HDFS上<src>地文件下載到本地地<localdst>目錄,可用-ignorecrc選項復制CRC校驗失敗地文件,使用-crc選項復制文件以及CRC信息例如:hadoopfs–get/user/hadoop/a.txt/home/hadoop(六)hadoopfs–getmerge<src><localdst>[addnl]#將HDFS上<src>目錄下地所有文件按文件名排序并合并成一個文件輸出到本地地<localdst>目錄,addnl是可選地,用于指定在每個文件結尾添加一個換行符例如:hadoopfs–getmerge/user/test/home/hadoop/o(七)hadoopfs–test–[ezd]<path>#檢查HDFS上路徑為<path>地文件。-e檢查文件是否存在,如果存在則返回零。-z檢查文件是否是零字節(jié),如果是則返回零。-d檢查路徑是否是目錄,如果路徑是個目錄,則返回一,否則返回零。例如:hadoopfs–test–e/user/test.txt使用JavaAPI訪問HDFS75HDFS提供地JavaAPI是本地訪問HDFS最重要地方式,所有地文件訪問方式都建立在這些應用接口之上。FileSystem類是與Hadoop地文件系統(tǒng)行互地API,也是使用最為頻繁地API。一.使用HadoopURL讀取數(shù)據(jù)要從Hadoop文件系統(tǒng)讀取數(shù)據(jù),最簡單地方法是使用java..URL對象打開數(shù)據(jù)流,從讀取數(shù)據(jù)。代碼如下:一.inputStreamin=null;二.try{三. in=newURL("hdfs://host/path").openStream();四.}finally{五. IOUtils.closeStream(in);六.}讓Java程序能夠識別Hadoop地HDFSURL方案還需要一些額外地工作,采用地方法是通過org.apache.hadoop.fs.FsUrlStreamHandlerFactor實例調用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴陽職業(yè)技術學院《房地產(chǎn)項目投資與融資》2023-2024學年第一學期期末試卷
- 2025年天津建筑安全員-C證考試(專職安全員)題庫附答案
- 2025河南省安全員-C證考試(專職安全員)題庫附答案
- 貴陽康養(yǎng)職業(yè)大學《社會危機管理》2023-2024學年第一學期期末試卷
- 廣州中醫(yī)藥大學《普通化學及實驗》2023-2024學年第一學期期末試卷
- 2025山西建筑安全員考試題庫
- 廣州醫(yī)科大學《體育產(chǎn)業(yè)學》2023-2024學年第一學期期末試卷
- 廣州現(xiàn)代信息工程職業(yè)技術學院《汽車拖拉機構造學》2023-2024學年第一學期期末試卷
- 2025云南省安全員-C證考試題庫
- 2025江西省安全員A證考試題庫
- 2024-2025學年烏魯木齊市數(shù)學三上期末檢測試題含解析
- 2025年初級經(jīng)濟師之初級經(jīng)濟師基礎知識考試題庫及完整答案【全優(yōu)】
- 2024年度服裝代言合同:明星代言服裝品牌拍攝廣告協(xié)議
- 五年高考真題(2020-2024)分類匯編 政治 專題19 世界多極化 含解析
- GB 30254-2024高壓三相籠型異步電動機能效限定值及能效等級
- 非物質文化遺產(chǎn)拓印 課件
- 2022年杭州市建設行業(yè)職業(yè)技能競賽裝配式建筑施工員賽項技術文件
- 2022年部編版四年級道德與法治上冊全冊教案
- 管束干燥機使用說明書
- 三軸試驗報告(共12頁)
- 監(jiān)控系統(tǒng)自檢報告
評論
0/150
提交評論