Hadooo 源代码分析
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,