歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Hadooo 源代碼分析

Hadooo 源代碼分析

日期:2017/3/1 10:04:43   编辑:Linux編程

HDFS

HDFS client 分析

客戶端的功能

今天開始分析HDFS源代碼,首先從HDFS的client端分析。對於分布式文件系統,Client端的功能,就是接收用戶的請求,通過網絡,與 NameNode 和 DataNode交互。

首先確定的是,client端是一個hdfs提供的lib庫,用戶的應用程序需要包含該庫,調用該庫提供的函數來訪問NameNode和DataNode

HDFS提供了一個shell程序,通過shell程序,可以通過一下命令比較簡潔的訪問HDFS

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類來實現。

Client 元數據的操作

Client的數據操作

我們重點關注一下讀寫出錯時的錯誤處理,這是分布式系統的關鍵。

我們看到數據操作,無論數據操作,無論是寫,還是讀,在客戶端都沒有緩存,都是在寫或者讀的系統調用返回後,對於寫,數據都flush都DataNode上,對於read,客戶端的系統裡是沒有數據緩存的。

我們先一下block,packet,chunk之間的區別。

Packet類,一個Packet就是數據發送的基本單位,一個Packet由多個chunk組成,一個數據塊就是數據校驗的單位,默認為512字節,也就是說一個512字節的數據塊加一個checksum,checksum的長度一般為4字節。一個Block有多個packet組成。一個block為64M,一個packet默認為64k,

Copyright © Linux教程網 All Rights Reserved