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,

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 下一页

相关内容

    暂无相关文章