其实我很害怕阅读源代码,不过得克服自己的恐惧感,所以打算开始阅读HDFS的源码,学习它主要有需要两个方法配合使用一是阅读源码,找到入口函数,然后根据一步步的跳转和关键数据结构的学习来了解 二是运行源码,然后设置断点跟踪执行流程,比如说client端发出ls 命令,然后跟踪此命令执行过程都调用了哪些函数,执行了什么任务,就一目了然了。
HDFS的框架结构,在这篇()日志中已经给出来了,这里就不再重复了。
从框架可以看出,HDFS中主要由namenode和datanode来组成,namenode只有一个,属于人类的大脑级任务,一旦namenode崩溃系统也就崩溃了,虽然有second namenode,但是瓶颈依然在这里。namenode的主要功能有两个一个是扮演着namespace管理者的角色,另外一个则是hDFS的inode table,管理着block的映射。
1) filename->blocksequence (namespace) 此表存储在磁盘上,在namenode启动的时候会加载,是非常重要的资源
2) block->machinelist ("inodes") 此表是在namenode启动后由datanode向namenode上报block信息之后创建起来的。
nn(namenode)提供的是始终被动接收服务的server,主要有协议接口:ClientProtocol接口、DatanodeProtocol接口、NamenodeProtocol接口,RefreshAuthorizationPolicyProtocol接口,RefreshUserMappingsProtocol接口。DataNode(简称dn)主要是用来存储数据文件,hdfs将一个文件分割成一个个的block,这些block可能存储在一个DataNode上或者是多个DataNode上。dn负责实际的底层的文件的读写,如果客户端client程序发起了读hdfs上的文件的命令,那么首先将这些文件分成block,然后nn将告知client这些block数据是存储在那些dn上的,之后,client将直接和dn交互。
nn主要是作为namenode server的角色来执行操作的,大部分的文件操作都转交给FSNamesystem的类来完成,而nn本身则关注于IPC接口,Http Server接口以及一些配置管理操作。
相关阅读:
Hadoop HDFS源码学习笔记(一)
更多Hadoop相关信息见Hadoop 专题页面 ?tid=13
上面的类图结构中仅列出了部分重要的数据结构,查看源码可以了解到以上的每个类文件都很长,也有很多的数据变量,分别应用到各个方面。
FSDirectory
FSDirectory存储整个HDFS的目录状态,通过调用FSImage和FSEditLog的方法从namenode本地磁盘读取元数据信息和向本地磁盘写入元数据信息,并将目录结构所作的修改写入到日志文件中。另外,FSDirectory保存了的映射关系。
INode 基类表示文件文件系统中的一个文件或者文件目录的抽象
INodeDirectory表示文件系统中的目录节点
INodeDirectory的关键数据结构是List children记录了目录下所有的子节点信息
INodeDirectoryWithQuota表示有配额限制的目录,根目录就是这种类型(存储在FSDiretory中)
INodeFile表示文件系统中一个文件节点
INodeFile类中最重要的数据结构是BlockInfo blocks[],它记录了一个文件所包含的所有Block,成员方法的操作大都与Block相关
INodefileUnderConstruction表示正在构建的文件