HDFS和KFS都是GFS的開源實現,而HDFS是Hadoop的子項目,用Java實現,爲Hadoop上層應用提供高吞吐量的可擴展的大文件存儲服務。KFS是web級一個用如存儲log data、Map/Reduce數據的分佈式文件系統,也是基於google文件系統項目簡歷,用C++實現。 html
http://www.cnblogs.com/chinacloud/archive/2010/12/03/1895369.html
java
1、HDFS的基本概念 node
HDFS爲分佈式計算存儲提供底層支持。HDFS的設計思想:構建一個很是龐大的分佈式文件系統。在集羣中節點失效是正常的,節點的數量在Hadoop中不是固定的。單一的文件命名空間,保證數據的一致性,寫入一次屢次讀取。典型的64MB數據塊大小,每一個數據塊在多個DN(DataNode)有複製客戶端經過NN(NameNode)獲得數據塊的位置,直接訪問DN獲取數據。 web
1.1數據塊(block) 服務器
1.2NameNode功能 數據結構
管理文件系統的命名空間,映射一個文件到一批數據塊,映射數據塊到DN節點上。集羣配置管理,數據塊的管理和複製。處理事務日誌:記錄文件建立、刪除等。由於NameNode的所有元數據存儲在內存中,因此NN的內存大小決定整個集羣的存儲量。 分佈式
NN內存中保存的數據: 函數
一、文件列表 oop
二、每一個文件的塊列表 測試
三、每一個DN中塊列表
四、文件屬性:生成時間、複製參數,文件許可(ACL)
1.3 Secondary Namenode功能
Secondary Namenode輔助NN處理Fsimage(文件系統鏡像)和事物日誌的Server,它從NN拷貝FsImage和事務日誌到臨時目錄,合併FsImage和事務日誌生成一個新的FsImage,上傳新的FsImage到NN上,NN更新FsImage並清理原來的事務日誌。
1.4 DataNode功能
在本地文件系統存儲數據塊,存儲數據塊的元數據,用於CRC校驗。響應客戶端對數據塊和元數據的請求,週期性的向NN報告這個DN存儲的全部數據塊信息。客戶端要存儲數據時從NN獲取存儲數據塊的DN位置列表,客戶端發送數據塊到第一個DN上,第一個DN收到數據經過管道流的方式把數據塊發送到另外的DN 上。當數據塊被全部的節點寫入後,客戶端繼續發送下一個數據塊。DN每3秒鐘發送一個心跳到NN,若是NN沒有收到心跳在從新嘗試後宣告這個DN失效。當 NN察覺到DN節點失效了,選擇一個新的節點複製丟失的數據塊。
數據塊的放置位置和數據正確性:
在典型的配置裏,數據塊一個放在當前的節點,一個放在遠程的機架上的一個節點,一個放在相同機架上的一個節點,多於3個的數據塊隨意選擇放置。客戶端選擇最近的一個節點讀取數據。Hadoop使用CRC32效驗數據的正確性,客戶端每512個byte計算一次效驗,DN負責存儲效驗數據。客戶端從DN獲取數據和效驗數據,若是效驗出錯,客戶端嘗試另外節點上覆制的數據。
HDFS如何存儲?
流水線複製:當客戶端向HDFS文件寫入數據的時候,一開始是寫到本地臨時文件中。假設該文件的副本系數設置爲3,當本地臨時文件累積到一個數據塊的大小時,客戶端會從Namenode獲取一個Datanode列表用於存放副本。而後客戶端開始向第一個Datanode傳輸數據,第一個Datanode一小部分一小部分(4 KB)地接收數據,將每一部分寫入本地倉庫,並同時傳輸該部分到列表中第二個Datanode節點。第二個Datanode也是這樣,一小部分一小部分地接收數據,寫入本地倉庫,並同時傳給第三個Datanode。最後,第三個Datanode接收數據並存儲在本地。所以,Datanode能流水線式地從前一個節點接收數據,並在同時轉發給下一個節點,數據以流水線的方式從前一個Datanode複製到下一個。
1.2.1元數據文件夾結構
VERSION文件是java properties文件,保存了HDFS的版本號。
2.1讀文件的過程
客戶端(Client)用FileSystem的open()函數打開文件。
DistributedFileSystem用RPC調用元數據節點,獲得文件的數據塊信息。
對於每個數據塊,元數據節點返回保存數據塊的數據節點的地址。
DistributedFileSystem返回FSDataInputStream給客戶端,用來讀取數據。
客戶端調用stream的read()函數開始讀取數據。
DFSInputStream鏈接保存此文件第一個數據塊的最近的數據節點。
Data從數據節點讀到客戶端(client)
當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的鏈接,而後鏈接此文件下一個數據塊的最近的數據節點。
當客戶端讀取完畢數據的時候,調用FSDataInputStream的close函數。
在讀取數據的過程當中,若是客戶端在與數據節點通訊出現錯誤,則嘗試鏈接包含此數據塊的下一個數據節點。
失敗的數據節點將被記錄,之後再也不鏈接。
2.二、寫文件的過程
客戶端調用create()來建立文件
DistributedFileSystem用RPC調用元數據節點,在文件系統的命名空間中建立一個新的文件。
元數據節點首先肯定文件原來不存在,而且客戶端有建立文件的權限,而後建立新文件。
DistributedFileSystem返回DFSOutputStream,客戶端用於寫數據。
客戶端開始寫入數據,DFSOutputStream將數據分紅塊,寫入data queue。
Data queue由Data Streamer讀取,並通知元數據節點分配數據節點,用來存儲數據塊(每塊默認複製3塊)。分配的數據節點放在一個pipeline裏。
Data Streamer將數據塊寫入pipeline中的第一個數據節點。第一個數據節點將數據塊發送給第二個數據節點。第二個數據節點將數據發送給第三個數據節點。
DFSOutputStream爲發出去的數據塊保存了ack queue,等待pipeline中的數據節點告知數據已經寫入成功。
若是數據節點在寫入的過程當中失敗:
關閉pipeline,將ack queue中的數據塊放入data queue的開始。
當前的數據塊在已經寫入的數據節點中被元數據節點賦予新的標示,則錯誤節點重啓後可以察覺其數據塊是過期的,會被刪除。
失敗的數據節點從pipeline中移除,另外的數據塊則寫入pipeline中的另外兩個數據節點。
元數據節點則被通知此數據塊是複製塊數不足,未來會再建立第三份備份。
當客戶端結束寫入數據,則調用stream的close函數。此操做將全部的數據塊寫入pipeline中的數據節點,並等待ack queue返回成功。最後通知元數據節點寫入完畢。
2.3 文件系統命名空間影響文件及修改日誌
http://www.cnblogs.com/forfuture1978/archive/2010/11/10/1874222.html
待完成
HDFS 存儲測試
測試環境:
服務器:Linux
masters:192.168.4.128
slaves:192.168.4.12八、192.168.4.42