暑假周進度報告(四)

HDFS體系結構java

 

 

 冷備份:發生故障之後,先中止一段時間,把一些數據從第二名稱節點慢慢恢復過來,恢復過來後再提供對外服務。apache

HDFS存儲原理:編程

冗餘數據保存的問題:一個數據塊會被默認保存3份(可並行操做同一數據,加快數據傳輸速度;很容易檢查數據錯誤,有參照;保證數據可靠性)分佈式

數據保存策略的問題:函數

1)oop

 

 

2)數據讀取 HDFS提供了一個API能夠肯定一個數據節點所屬的機架ID,客戶端也能夠調用API獲取本身所屬的機架ID 當客戶端讀取數據時,從名稱節點得到數據塊不一樣副本的存放位置列表,列表中包含了副本所在的數據節點,能夠調用API來肯定客戶端和這些數據節點所屬的機架ID,當發現某個數據塊副本對應的機架ID和客戶端對應的機架ID相同時,就優先選擇該副本讀取數據,若是沒有發現,就隨機選擇一個副本讀取數據spa

數據恢復的問題:名稱節點出錯經過第二名稱節點冷備份恢復3d

數據節點出錯:當隔了一個週期,名稱節點收不到數據節點的心跳信息之後,知道這個數據節點發生了故障,將此數據節點結點標記爲宕機即不可用,把凡是存儲在故障機上的數據,從新複製分發到其餘正常可用的機器上(全部數據冗餘備份,冗餘數據位置能夠不斷變化)對象

數據出錯:校驗碼不對不一致,進行恢復,進行冗餘副本的再次複製blog

 

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文件系統

 

fs命令能夠說是HDFS最經常使用的命令 利用該命令能夠查看HDFS文件系統的目錄結構、上傳和下載數據、 建立文件等。

該命令的用法爲: hadoop fs [genericOptions] [commandOptions]

 

hadoop fs -ls <path>:顯示<path>指定的文件的詳細信息

hadoop fs -mkdir <path>:建立<path>指定的文件夾

hadoop fs -cat <path>:將<path>指定的文件的內容輸出到標準輸出

hadoop fs -cp 本地文件路徑 HDFS路徑 將文件從本地拷貝上傳到HDFS中。

實例:分佈式文件系統HDFS上是否存在某個文件

相關文章
相關標籤/搜索