Hadooo 源代码分析

2014-11-24 08:52:03 ? 作者: ? 浏览: 1

客户端的功能


今天开始分析HDFS源代码,首先从HDFS的client端分析。对于分布式文件系统,Client端的功能,就是接收用户的请求,通过网络,与 NameNode 和 DataNode交互。


首先确定的是,client端是一个hdfs提供的lib库,用户的应用程序需要包含该库,调用该库提供的函数来访问NameNode和DataNode


HDFS提供了一个shell程序,通过shell程序,可以通过一下命令比较简洁的访问HDFS


抽象类FileSystem提供了一个文件系统的抽象层,它包括了分布式文件系统和local文件系统的一个统一的抽象接口。它囊括了所有的文件系统的操作接口,包括元数据和数据接口。对于HDFS,实现该接口的类为DistributedFileSystem.


DirstrubtedFileSystem类是DFSClient 的wrap类。其主要的功能由DFSClient完成。


客户端shell程序的启动


我们先看一些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,


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: