Hadoop權威指南學習筆記三
HDFS簡單介紹
聲明:本文是本人基於Hadoop權威指南學習的一些個人理解和筆記,僅供學習參考。有什麽不到之處還望指出,一起學習一起進步。
轉載請註明:http://blog.csdn.net/my_acm
Hadoop說白了就是一個提供了處理分析大數據的文件集群,當中最重要的無疑是HDFS(Hadoop Distributed File System)即Hadoop分布式文件系統。
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
Hadoop權威指南學習筆記三