客戶端的功能
今天開始分析HDFS源代碼,首先從HDFS的client端分析。對於分布式文件系統,Client端的功能,就是接收用戶的請求,通過網絡,與 NameNode 和 DataNode交互。
首先確定的是,client端是一個hdfs提供的lib庫,用戶的應用程序需要包含該庫,調用該庫提供的函數來訪問NameNode和DataNode
HDFS提供了一個shell程序,通過shell程序,可以通過一下命令比較簡潔的訪問HDFS
抽象類FileSystem提供了一個文件系統的抽象層,它包括了分布式文件系統和local文件系統的一個統一的抽象接口。它囊括了所有的文件系統的操作接口,包括元數據和數據接口。對於HDFS,實現該接口的類為DistributedFileSystem.
DirstrubtedFileSystem類是DFSClient 的wrap類。其主要的功能由DFSClient完成。
客戶端shell程序的啟動
Client 的的shell程序的main函數在類org.apache.Hadoop.fs.FsShell類中。我們順著main函數執行的流程,來逐步分析整個client端代碼。
我們先看一些interface,我們知道,interface沒有具體的實現,只是規定一些操作的規范給其實現的類,這樣就可以實現要做什麼(interface)和實際實現者的功能上的分離。
Interface Configurable 實現了兩個操作,就是
public interface Configurable {
voidsetConf(Configuration conf);
ConfigurationgetConf();
}
然後是接口 Tool,實現了執行命令的接口。
public interface Tool extends Configurable {
int run(String []args) throws Exception;
}
我們看到,具體實現以上兩個接口的,就是FsShell類。
public class FsShell extends Configured implements Tool {
}
下面正式看一下類org.apache.hadoop.fs.FsShell的main函數來的運行過程。
其主要的過程如下: 分析命令行參數,調用FsShell 的run函數來處理相關的命令。
我們再看一下FsShell裡的run函數,其就是匹配各種命令,調用FsShell裡相關的處理函數。其對於的處理命令被最終由FileSystem處理。在FsShell類的init函數裡,通過從配置文件獲取具體的文件系統類(FileSystem)的實現,當client端起來後,其處理相關的命令的功能交給DistributedFileSystem類來實現。
我們重點關注一下讀寫出錯時的錯誤處理,這是分布式系統的關鍵。
我們看到數據操作,無論數據操作,無論是寫,還是讀,在客戶端都沒有緩存,都是在寫或者讀的系統調用返回後,對於寫,數據都flush都DataNode上,對於read,客戶端的系統裡是沒有數據緩存的。
我們先一下block,packet,chunk之間的區別。
Packet類,一個Packet就是數據發送的基本單位,一個Packet由多個chunk組成,一個數據塊就是數據校驗的單位,默認為512字節,也就是說一個512字節的數據塊加一個checksum,checksum的長度一般為4字節。一個Block有多個packet組成。一個block為64M,一個packet默認為64k,