HDFS-Hadoop分佈式文件系統

什麼是分佈式文件系統

數據量愈來愈多,已經超出了一個操做系統的管轄範圍,須要分配到更多的操做系統管理的磁盤中,所以須要一種文件系統來管理多臺機器上的文件,這就是分佈式文件系統。分佈式文件系統是一種容許文件經過網絡在多臺主機上共享的文件系統,可讓多臺機器上的用戶分享文件和存儲空間。
java

HDFS概念

HDFS是Hadoop Distribute File System 的簡稱,也就是Hadoop的一個分佈式文件系統。HDFS設計理念之一就是讓它能運行在普通的硬件之上,即使硬件出現故障,也能夠經過容錯策略來保證數據的可用。node

HDFS架構

NameNode和DataNode

NameNode是整個文件系統的管理節點。它維護着整個文件系統的文件目錄樹,文件/目錄的元信息和每一個文件對應的數據塊列表。同是接收用戶的請求。
文件包括:
fsimage:元數據鏡像文件。存儲某一時段NameNode內存元數據信息。
edits:操做日誌文件。
fstime:保存最近一次checkpoint的時間。
以上這些文件都是保存的Linux文件系統中。shell

DataNode提供真實數據的存儲服務。
文件塊(block):最基本的存儲單位,在Hadoop2中HDFS的默認大小是128M,不一樣於普通文件系統的是,HDFS中,若是一個文件小於一個數據塊的大小,並不佔用整個數據塊存儲空間。安全

HDFS架構圖以下:
dddddd服務器

首先客戶端(client)和namenode進行通信,獲取一些元數據信息,而後namenode查詢相應的元數據信息返回給客戶端(注意:元數據信息保存在內存和磁盤中各有一份,即安全又快速);網絡

而後客戶端開始讀取數據,注意在讀取時依次讀取,不會同時讀取(會採用數據就近原則);架構

同時namanode會給dataname一些信息,datanode會進行數據的水平復制。maven

元數據存儲細節

元數據的存儲格式以下:分佈式

1
NameNode(FileName,replicas,block-ids,id2host...)

 

舉例:oop

1
/test/a.log,3,{blk_1,blk_2},[{blk_1:[h0,h1,h3]},{blk_2:[h0,h2,h4]}]

 

說明:

a.log存放了3個副本,文件被切分紅了三塊,分別是:blk_1,blk_2,第一塊存放在h0,h1,h3三臺機器上,第二塊存放在h0,h2,h4上。

HDFS Shell經常使用命令

調用文件系統(FS)Shell命令應使用 bin/hadoop fs 的形式。

全部的FS shell命令使用URI路徑做爲參數。

URI格式是scheme://authority/path。HDFS的scheme是hdfs,對本地文件系統,scheme是file。其中scheme和authority參數都是可選的,若是未加指定,就會使用配置中指定的默認scheme。

1
hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2

 

將路徑指定文件的內容輸出到指定文件中;

1
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2

 

將文件從源路徑複製到目標路徑。這個命令容許有多個源路徑,此時目標路徑必須是一個目錄;

1
hadoop fs -get /user/hadoop/file localfile

 

複製文件到本地文件系統;

1
hadoop fs -put localfile /user/hadoop/hadoopfile

 

從本地文件系統中複製單個或多個源路徑到目標文件系統。

使用Java接口操做HDFS

新建Java項目以後要添加相應的jar,和HDFS相關的jar文件在/share/hadoop/common和/share/hadoop/common/lib和/share/hadoop/hdfs,若是使用maven不須要一個個導入。

因爲Hadoop是由Java寫的,經過Java API能夠調用全部Hadoop文件系統的交互操做。FileSystem類來提供文件系統的操做。
使用FileSystem以標準輸出來下載HDFS中的文件,代碼以下:

1
2
3
4
FileSystem fs = FileSystem.get(new URI("hdfs://longlong01:9000"), new Configuration());//指定namenode
InputStream in = fs.open(new Path("/hellohdfs.txt"));//hdfs上的文件
FileOutputStream out = new FileOutputStream(new File("/root/myfile"));//打印到root下面的myfile
IOUtils.copyBytes(in, out, 4096, true);//將in中的內容複製到out中

 

讀取本地文件上傳到hdfs中,代碼以下:
FSDataOutputStream out = fs.create(new Path(「/words.txt」));

1
2
3
4
5
6
7
FileInputStream in = new FileInputStream(new File("c:/w.txt"));//讀取本地系統的文件
FSDataOutputStream out = fs.create(new Path("/words.txt"));
IOUtils.copyBytes(in, out, 2048, true);
```
若是上傳不成功,顯示沒有權限,可使用
```java
fs = FileSystem.get(new URI("hdfs://longlong01:9000"), new Configuration(),"root");

 

將當前用戶假裝成root用戶,能夠解決沒有權限的問題。

刪除hdfs中的一個文件:

1
boolean flag = fs.delete(new Path("/hellohdfs.txt"), true);

 

在hdfs中新建一個文件:

1
boolean flag = fs.mkdirs(new Path("/root/hellohdfs"));

 

RPC-遠程過程調用協議

RPC指的是Remote Procedure Call,遠程過程調用協議,是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。

RPC採用客戶機/服務器模式。請求程序就是一個客戶機,服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端。進程保持休眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息。最後,客戶端調用進程接受答覆信息,得到進程結果,而後調用繼續執行。

Hadoop整個體系結果就是構建在RPC之上的。

相關文章
相關標籤/搜索