1. 文件系統從頭說
2. Hadoop的文件系統
3. 如何將文件複製到HDFS
3.1 目錄和文件結構
3.2 FileCopy.java文件的源代碼
3.3 編譯
3.4打包
3.5 運行
3.6 檢查結果java
1. 文件系統從頭說
文件系統的做用就是永久存儲數據。計算機能夠存儲數據的地方是內存,硬盤,優盤,SD卡等等。若是計算機斷電關機,存放在內存裏的數據就沒有了,而存放在硬盤優盤SD卡這些上的數據會仍然存在。硬盤優盤SD卡上的數據是以文件的形式存在,文件系統就是文件的組織和處理。總之,凡是斷電以後不會消失的數據,就必須由文件系統存儲和管理。
從用戶的角度來講,文件系統須要提供文件的建立,刪除,讀,寫,追加,重命名,查看屬性,更改屬性等各類功能。文件夾,也叫目錄,它的做用相似容器,保存其餘文件夾和文件。因而,各級文件夾和各級文件就共同組成了文件系統的層次,看起來象一棵倒放的樹,最上層是最大的目錄,也叫根目錄,而後這個目錄包含子目錄和文件,子目錄又包含更多的子目錄和文件,這棵樹的術語叫目錄樹。
起初,Linux使用的文件系統是Minix文件系統。但Minix系統有很多限制,諸如最大文件尺寸只有64M,文件名最可能是14個字符長度。後來,Linux內核加入了VFS,也就是虛擬文件系統Virtual File System。VFS是Linux內核和真正文件系統之間的抽象層,它提供統一的接口,真正的文件系統和Linxu內核必須經過VFS的接口進行溝通。隨後,Linux逐步使用基於VFS的ext文件系統,ext2文件系統,ext3文件系統等等。基於VFS,Linux對Windows的FAT和NTFS格式也提供支持。
一般狀況下,Linux的文件系統是單機的,也就說,從物理的角度看,文件系統只存儲單臺計算機的數據。分佈式文件系統在物理上分散的計算機上存儲數據。好比,NFS(NetWork File System)是一種很是經典的分佈式文件系統,它基於VFS,由Sun公司開發的。本質上,NFS是在物理上分散的計算機之間增長了一個客戶-服務器層。對NFS,能夠這麼理解:計算機A有本身的VFS,計算機B也有本身的VFS,那麼,若是A想操做B上的文件,A的數據和命令依次經過的路線是:A的VFS-->A的NFS客戶端-->網絡-->B的NFS服務器端-->B的VFS-->B的文件系統。apache
2. Hadoop的文件系統
Hadoop借鑑了VFS,也引入了虛擬文件系統機制。HDFS是Hadoop虛擬文件系統的一個具體實現。除了HDFS文件系統以外,Hadoop還實現不少其餘文件系統,諸如本地文件系統,支持HTTP的HFTP文件系統,支持Amazon的S3文件系統等等。
HDFS從設計上來講,主要考慮如下的特徵:超大文件,最大能支持PB級別的數據;流式數據訪問,一次寫入,屢次讀取;在不可靠的文件,故障率高的商用硬件上能運行。Hadoop的不利之處,是不適應低時間延遲的數據訪問,不適應大量的小文件,也不適應多用戶寫入任意修改文件的狀況。
假設有一個HDFS集羣,那麼這個集羣有且僅有一臺計算機作名字節點NameNode,有且僅有一臺計算機作第二名字節點SecondaryNameNode , 其餘機器都是數據節點DataNode 。在僞分佈式的運行方式下,
NameNode,SecodaryNameNode,DataNode都由同一臺機器擔任。
NameNode是HDFS的管理者。SecondaryNameNode是NameNode的輔助者,幫助NameNode處理一些合併事宜,注意,它不是NameNode的熱備份,它的功能跟NameNode是不一樣的。DataNode以數據塊的方式分散存儲HDFS的文件。HDFS將大文件分割成數據塊,每一個數據塊是64M,也能夠設置成128M或者256M,而後將這些數據塊以普通文件的形式存放到數據節點上,爲了防止DataNode意外失效,HDFS會將每一個數據塊複製若干份放到不一樣的數據節點。
執行」hadoop fs -help」能夠看到HDFS的命令行工具和用法。
如前所說,文件系統主要做用是提供文件的建立,刪除,讀,寫,追加,重命名,查看屬性,更改屬性等各類功能 。在隨後部分,本章選取若干功能,給出了HDFS的文件操做示例代碼。熟悉這些以後會對HDFS的操做有一個形象瞭解。這樣未來參考Hadoop API的FileSystem類及其相關子類,就能夠寫出更多的文件系統操做。服務器
3. 如何將文件複製到HDFS
3.1 目錄和文件結構
這個例子的功能跟」hadoop fs -put」是同樣的。建立目錄~/filecopy存放源代碼、編譯和打包結果。在filecopy目錄下,有兩個子目錄,分別是src目錄和classes目錄,src目錄存放Java源代碼,class存放編譯結果。在src目錄下,只有一個源代碼文件FileCopy.java。
3.2 FileCopy.java文件的源代碼網絡
apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; public class FileCopy { public static void main(String[] args) throws Exception
{ if (args.length != 2)
{ System.err.println("Usage: filecopy <source> <target>"); System.exit(2); }
Configuration conf = new Configuration(); InputStream in = new BufferedInputStream(new FileInputStream(args[0])); FileSystem fs = FileSystem.get(URI.create(args[1]), conf); OutputStream out = fs.create(new Path(args[1])); IOUtils.copyBytes(in, out, 4096, true); }
}
3.3 編譯分佈式
「cd ~/filecopy」
「javac -cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d ./classes ./src/*.java」
3.4打包
「jar -cvf filecopy.jar -C ./classes/ .」
3.5 運行
「cd /home/brian/usr/hadoop/hadoop-1.2.1」
「./bin/hadoop jar ~/filecopy/filecopy.jar com.brianchen.hadoop.FileCopy README.txt readme.txt」
首先確認Hadoop已是運行的,而後切換到Hadoop的安裝目錄,仍然用README.txt作測試,將這個文件複製到HDFS,另存爲readme.txt文件。
3.6 檢查結果
「./bin/hadoop fs -ls」
執行這個命令能夠看到readme.txt是否存在。
「./bin/hadoop fs -ls cat readme.txt」
輸出readme.txt文件到屏幕查看其內容。工具