hdfs體系結構
冷備份:發生故障以後,先停止一段時間,把一些資料從第二名稱節點慢慢恢復過來,恢復過來後再提供對外服務。
hdfs儲存原理:
冗餘資料儲存的問題:乙個資料塊會被預設儲存3份(可並行操作同一資料,加快資料傳輸速度;很容易檢查資料錯誤,有參照;保證資料可靠性)
資料儲存策略的問題:
2)資料讀取 hdfs提供了乙個api可以確定乙個資料節點所屬的機架id,客戶端也可以呼叫api獲取自己所屬的機架id 當客戶端讀取資料時,從名稱節點獲得資料塊不同副本的存放位置列表,列表中包含了副本所在的資料節點,可以呼叫api來確定客戶端和這些資料節點所屬的機架id,當發現某個資料塊副本對應的機架id和客戶端對應的機架id相同時,就優先選擇該副本讀取資料,如果沒有發現,就隨機選擇乙個副本讀取資料
資料恢復的問題:名稱節點出錯通過第二名稱節點冷備份恢復
資料節點出錯:當隔了乙個週期,名稱節點收不到資料節點的心跳資訊以後,知道這個資料節點發生了故障,將此資料節點結點標記為宕機即不可用,把凡是儲存在故障機上的資料,重新複製分發到其他正常可用的機器上(所有資料冗餘備份,冗餘資料位置可以不斷變化)
資料出錯:校驗碼不對不一致,進行恢復,進行冗餘副本的再次複製
hdfs資料讀寫過程
filesystem是乙個通用檔案系統的抽象基類,可以被分布式檔案系統繼承,所有可能使用hadoop檔案系統的**,都要使用這個類 hadoop為filesystem這個抽象類提供了多種具體實現 distributedfilesystem就是filesystem在hdfs檔案系統中的具體實現 filesystem的open()方法返回的是乙個輸入流fsdatainputstream物件,在hdfs檔案系統中,具體的輸入流就是dfsinputstream;filesystem中的create()方法返回的是乙個輸出流fsdataoutputstream物件,在hdfs檔案系統中,具體的輸出流就是dfsoutputstream。
configuration conf = new configuration(); conf.set("fs.defaultfs","hdfs://localhost:9000"); conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.distributedfilesystem");讀資料的過程:filesystem fs = filesystem.get(conf);
fsdatainputstream in = fs.open(new path(uri));
fsdataoutputstream out = fs.create(new path(uri));
第一步開啟檔案,建立輸入流fsdatainputstream,fsdatainputstream in = fs.open(new path(uri));uri就是你輸入的檔案位址。例如:hdfs://localhost:9000,檔案開啟以後生成了輸入流fsdatainputstream,輸入流裡面封裝了dfsinputstream(真正跟名稱節點打交道),使用者客戶端程式設計只跟前面的fsdatainputstream打交道,不會去訪問dfsinputstream.
第二步,dfsinputstream會和名稱節點進行溝通,通過遠端過程呼叫去溝通(獲得所需要的資料塊被儲存到哪些名稱節點)通過clientprotocal.getblocklocations() 查詢下乙個資料塊。拿到資料位置。
第三步:讀取請求,輸入流中執行read函式,選擇距離客戶端最近的資料節點去建立連線,然後去讀資料。
第四步:讀取資料(把資料從資料節點讀到客戶端)。讀完這個輸入流以後,fsdatainputstream要關閉和資料節點的連線。
按順序迴圈依次完成所有資料塊的讀寫
第六步讀取資料(等同於第四步)
第七步:關閉檔案,呼叫輸入流的關閉操作close
寫資料的過程:
1.建立檔案請求,客戶端打算向hdfs寫入資料,用filesystem例項化乙個物件fs(fs型別是distributedfilesystem)建立乙個輸出流,fsdataoutputstream,建立完以後,hadoop會封裝乙個dfsoutputstream(專門和名稱節點打交道)
2.詢問名稱節點,建立檔案元資料。dfsoutputstream要執行rpc遠端呼叫,去訪問名稱節點,讓名稱節點在檔案系統的命名空間中新建乙個檔案,名稱節點不會直接去建立檔案,先做一些檢查,檢查這個檔案是否已經存在,還有檢查客戶端是否有許可權建立這個檔案。兩個檢查都通過,則名稱節點就會建立這個檔案。
3.往裡寫資料。通過輸出流,流水線複製,把整個資料分成乙個個分包,這些分包會被放在dfsoutputstream這個物件的內部佇列,放上去以後dfsoutputstream就向名稱節點去申請儲存這些資料塊的資料節點
4.申請到以後,寫入資料報。分包先發到第乙個資料節點,第乙個資料節點再發到第二個資料節點,第二個資料節點再發到第三個資料節點,以此類推,完成流水線複製
5.接受確認包,確認包由最後乙個資料節點依次往前傳到客戶端,客戶端收到時都已經寫入完成了
6.完成以後關閉檔案
filesystem是個抽象基類,具體實現:在hdfs中實現為distributedfilesystem子類
啟動hadoop:1.cd /usr/local/hadoop
2../sbin/start-dfs.sh
3.jps判斷是否成功啟動
4.關閉hadoop./sbin/stop-dfs.sh
備註:hadoop中有三種shell命令方式:
hadoop fs適用於任何不同的檔案系統,比如本地檔案系統和hdfs檔案系統
hadoop dfs只能適用於hdfs檔案系統
hdfs dfs跟hadoop dfs的命令作用一樣,也只能適用於hdfs檔案系統
該命令的用法為: hadoop fs [genericoptions] [commandoptions]
hadoop fs -ls :顯示指定的檔案的詳細資訊
hadoop fs -mkdir :建立指定的資料夾
hadoop fs -cat :將指定的檔案的內容輸出到標準輸出
hadoop fs -cp 本地檔案路徑 hdfs路徑 將檔案從本地拷貝上傳到hdfs中。
例項:分布式檔案系統hdfs上是否存在某個檔案
暑假周進度報告(七)
hdfs檔案操作 使用hadoop 使用者登入 linux 系統,啟動 hadoop hadoop 的安裝目錄為 usr local hadoop 為hadoop 使用者在hdfs 中建立使用者目錄 user hadoop 接著在hdfs的目錄 user hadoop 下,建立 test 資料夾,並...
暑假周進度報告3
在本週中,學到了一些新工具,jdk api幫助文件的使用,在其中有 j a 所有類以及 j a 類的使用方法。在 j a 程式設計中可通過此檔案查詢對類的使用方法以及查詢導包。scanner random 以及arraylist 的使用,以上三個都屬於 l a.util 的類,在對 scanner ...
暑假周進度報告(二)
這一周我學習了一下linux shell指令碼,然後按照教程嘗試搭建hadoop平台。然後我把我搭建hadoop平台的過程寫成了一篇部落格 過程很艱辛,遇到了許多問題。有些問題就馬馬虎虎的過了,但是並沒有搭建完成,最後遇到了乙個問題沒法解決,於是就一直擱置著。然後我打算學習python。估計程式設計...