Hadoop權威指南學習筆記三,hadoop權威學習筆記
HDFS簡介
Hadoop說白了就是一個提供了處理分析大資料的檔案叢集,其中最重要的無疑是HDFS(Hadoop Distributed File System)即HadoopDistributed File System。
1、
HDFS是一種以流式資料訪問模式(一次寫入多次讀取的模式)儲存超大檔案的系統。其不需要的高端的硬體系統,普通市面上的硬體就能滿足要求。
目前不適合應用HDFS的有:低延遲的資料訪問、大量小的檔案、多使用者寫入任意修改檔案等。
2、
HDFS儲存以塊為單位,通常塊大小為64M。之所以要分為這麼大的塊,主要是為了減少定址時間,因為目前來看,資料轉送速率越來越快,對於HDFS處理大資料時,如果頻繁的定址必然會使得已耗用時間變長。
HDFS叢集有兩種節點名稱節點和多個資料節點。其中名稱節點充當管理者,資料節點充當工作者。名稱節點相當於HDFS檔案樹上的枝幹分叉點,而資料節點則標註著所有塊的儲存資訊。所以名稱節點的丟失就意味著HDFS的癱瘓。因此Hadoop提供了兩種機制解決這一問題:
一種是複製組成檔案系統中繼資料的持久狀態檔案。即在本地磁碟寫入的同時也寫入一個遠程NFS掛載。
另一種是設定一個二級名稱節點。
3、
HDFS提供命令列介面的互動。
4、
Hadoop是一個抽象的檔案系統概念,HDFS是其中的一個具體實現,java抽象類別org.apache.hadoop.fs.FileSystem展示了Hadoop的一個檔案系統,而且有幾個具體實現。
如所示,Hadoop提供了許多檔案的介面,通常是通過URL來確定使用何種檔案系統實現互動。
5、
Hadoop是java實現的所以,java介面無疑是其中重中之重,下面是java介面的一些具體實現。
(1) 資料讀取:
使用URL讀取資料
Java識別Hadoop檔案系統的URL方案,就是通過一個FsUrlStreamHandlerFactory執行個體來調用在URL中的setURLStreamHandlerFactory方法。
注意:這種方法在java虛擬機器中只能被調用一次,所以通常設定為static,也因此如果程式其他組件(可能不是在你控制的第三方組件)設定了一個URLStreamHandlerFactory,那麼久再也不能從Hadoop讀取資料。
代碼:
輸入運行:
% hadoop URLCat hdfs://localhost/user/tom/test.txt
結果:
Hello world Hello world
Hello world
Hello world Hello world
使用FileSystem API讀取資料
直接看代碼吧,注意看注釋
(2) 資料寫入
FileSystem類有一系列建立檔案的方法。
public FSDataOutputStream create(Pathf) throws IOException
用create建立檔案是可用exists()判斷其父目錄是否存在。
還有一個用於傳遞迴調介面的重載方法 Progressable,如此一來,我們所寫的應用就會被告知資料寫入資料節點的進度。
package org.apache.hadoop.util;
public interface Progressable{
publicvoid progress();
}
建立檔案的還可以用如下方法:
Public FSDataOutputStream append(Pathf) throws IOException
此方法允許在開啟檔案的末尾追加資料。
(3) 目錄
FileSystem題目了建立目錄的方法:
public Boolean mkdirs(Path f) thorwsIOException
(4) 查詢檔案系統
FileStatus類封裝了檔案系統中檔案和目錄的中繼資料,包括檔案長度、塊大小、副本、修改時間、所有者以及許可資訊。
FileSystem的getFileStatus()提供了擷取一個檔案或目錄的狀態物件方法。
如果只是判斷一個檔案是否存在,則可以使用前文提到的exists(Path f)方法。
Hadoop有時要查詢批量檔案時通常要用到萬用字元,所以它為執行萬用字元提供了
Hadoop支援與Unix bash相同的萬用字元兩個FileSystem方法:
public FileStatus[] globStatus (PathpathPattern) throws IOException
public FileStatus[] globStatus (Path pathPattern,PathFileter filter)throws IOException
萬用字元:
(5) 刪除資料
FileSystem中的delete()方法可以永久刪除目錄。
public Boolean delete(Path f,Boolean recursive) throwsIOException