1. 程式人生 > >Hadoop權威指南學習筆記三

Hadoop權威指南學習筆記三

支持 第三方 handle line src factory 模式 多個 重要

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權威指南學習筆記三