Hadoop HDFS源码学习笔记(一)

其实我很害怕阅读源代码,不过得克服自己的恐惧感,所以打算开始阅读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接口以及一些配置管理操作。

上面的类图结构中仅列出了部分重要的数据结构,查看源码可以了解到以上的每个类文件都很长,也有很多的数据变量,分别应用到各个方面。

<一> FSDirectory

FSDirectory存储整个HDFS的目录状态,通过调用FSImage和FSEditLog的方法从namenode本地磁盘读取元数据信息和向本地磁盘写入元数据信息,并将目录结构所作的修改写入到日志文件中。另外,FSDirectory保存了<filename, blocks>的映射关系。

INode 基类表示文件文件系统中的一个文件或者文件目录的抽象

INodeDirectory表示文件系统中的目录节点

INodeDirectory的关键数据结构是List<INode> children记录了目录下所有的子节点信息

INodeDirectoryWithQuota表示有配额限制的目录,根目录就是这种类型(存储在FSDiretory中)

INodeFile表示文件系统中一个文件节点

INodeFile类中最重要的数据结构是BlockInfo blocks[],它记录了一个文件所包含的所有Block,成员方法的操作大都与Block相关

INodefileUnderConstruction表示正在构建的文件


<二> FSImage

FSImage持久化着文件和目录的元数据信息,每次namenode启动时都从磁盘将FSImage加载到内存中构建目录结构树,之后的操作都存储在editLog中,系统会定期的将editLog中的操作与FSImage进行刷新合并,从而保存最新的FSImage。


fsimage是一个二进制文件,当中记录了HDFS中所有文件和目录的元数据信息,格式如下,这是网上流传的一张经典图,这是淘宝的一个师兄画的:


imageVersion(int)——image版本号

namespaceID(int)——命名空间ID,在namenode的生命期内保持不变,datanode注册时返回作为其registrationID,每次和namenode通信时都要检查,不认识的namespaceID拒绝连接.

numFiles(16版以后long型)记录文件系统中的文件数

genstamp(long)生成image时间戳


下面是numFiles个文件(目录)信息:

path(String)——文件或目录路径

replication(int)——副本数,会调用FSEditLog.adjustReplication(replication);调整,目录的为0

mtime(long)——修改时间

atime(long)——访问时间

blockSize(long)——块大小,目录是0

NumBlocks(int)——文件包含的块数(imageVersion 9以后的版本numBlocks>=0时表示文件,之前的版本>0时表示文件),目录的为-1,saveINode2Image方法中可以看到

如果是文件,下面是NumBlocks个block的相关信息:

blockId(long)——该文件的block的blockid,

numBytes(long)——该block的大小

generationStamp(long)——该block的时间戳

如果是目录,读入quota信息:

nsQuota(long)命名空间大小配额,默认-1

dsQuota(long)磁盘空间配额,默认-1

下面是权限相关

username(String)文件或目录的所属用户名

groupname(String)组名

permission(short)权限

如果前面的path.length==0,表示根目录,设置根目录的配额,修改时间,访问时间和权限信息。

将这些信息读入内存之后,构造一个文件目录结构树,将表示文件或目录的节点填入到结构中。

再之后是加载FilesUnderConstruction.

今天就写到这里吧 果然看代码还是挺累 挺慢的







  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 HDFS 1 1.1 HDFS概述 1 1.1.1 HDFS体系结构 1 1.1.2 HDFS基本概念 2 1.2 HDFS通信协议 4 1.2.1 Hadoop RPC接口 4 1.2.2 流式接口 20 1.3 HDFS主要流程 22 1.3.1 HDFS客户端读流程 22 1.3.2 HDFS客户端写流程 24 1.3.3 HDFS客户端追加写流程 25 1.3.4 Datanode启动、心跳以及执行名字节点指令流程 26 1.3.5 HA切换流程 27 第2章 Hadoop RPC 29 2.1 概述 29 2.1.1 RPC框架概述 29 2.1.2 Hadoop RPC框架概述 30 2.2 Hadoop RPC的使用 36 2.2.1 Hadoop RPC使用概述 36 2.2.2 定义RPC协议 40 2.2.3 客户端获取Proxy对象 45 2.2.4 服务器获取Server对象 54 2.3 Hadoop RPC实现 63 2.3.1 RPC类实现 63 2.3.2 Client类实现 64 2.3.3 Server类实现 76 第3章 Namenode(名字节点) 88 3.1 文件系统树 88 3.1.1 INode相关类 89 3.1.2 Feature相关类 102 3.1.3 FSEditLog类 117 3.1.4 FSImage类 138 3.1.5 FSDirectory类 158 3.2 数据块管理 162 3.2.1 Block、Replica、BlocksMap 162 3.2.2 数据块副本状态 167 3.2.3 BlockManager类(done) 177 3.3 数据节点管理 211 3.3.1 DatanodeDescriptor 212 3.3.2 DatanodeStorageInfo 214 3.3.3 DatanodeManager 217 3.4 租约管理 233 3.4.1 LeaseManager.Lease 233 3.4.2 LeaseManager 234 3.5 缓存管理 246 3.5.1 缓存概念 247 3.5.2 缓存管理命令 247 3.5.3 HDFS集中式缓存架构 247 3.5.4 CacheManager类实现 248 3.5.5 CacheReplicationMonitor 250 3.6 ClientProtocol实现 251 3.6.1 创建文件 251 3.6.2 追加写文件 254 3.6.3 创建新的数据块 257 3.6.4 放弃数据块 265 3.6.5 关闭文件 266 3.7 Namenode的启动和停止 268 3.7.1 安全模式 268 3.7.2 HDFS High Availability 276 3.7.3 名字节点的启动 301 3.7.4 名字节点的停止 306 第4章 Datanode(数据节点) 307 4.1 Datanode逻辑结构 307 4.1.1 HDFS 1.X架构 307 4.1.2 HDFS Federation 308 4.1.3 Datanode逻辑结构 310 4.2 Datanode存储 312 4.2.1 Datanode升级机制 312 4.2.2 Datanode磁盘存储结构 315 4.2.3 DataStorage实现 317 4.3 文件系统数据集 334 4.3.1 Datanode上数据块副本的状态 335 4.3.2 BlockPoolSlice实现 335 4.3.3 FsVolumeImpl实现 342 4.3.4 FsVolumeList实现 345 4.3.5 FsDatasetImpl实现 348 4.4 BlockPoolManager 375 4.4.1 BPServiceActor实现 376 4.4.2 BPOfferService实现 389 4.4.3 BlockPoolManager实现 396 4.5 流式接口 398 4.5.1 DataTransferProtocol定义 398 4.5.2 Sender和Receiver 399 4.5.3 DataXceiverServer 403 4.5.4 DataXceiver 406 4.5.5 读数据 408 4.5.6 写数据(done) 423 4.5.7 数据块替换、数据块拷贝和读数据块校验 437 4.5.8 短路读操作 437 4.6 数据块扫描器 437 4.6.1 DataBlockScanner实现 438 4.6.2 BlockPoolSliceScanner实现 439 4.7 DirectoryScanner 442 4.8 DataNode类的实现 443 4.8.1 DataNode的启动 444 4.8.2 DataNode的关闭 446 第5章 HDFS客户端 447 5.1 DFSClient实现 447 5.1.1 构造方法 448 5.1.2 关闭方法 449 5.1.3 文件系统管理与配置方法 450 5.1.4 HDFS文件与操作方法 451 5.1.5 HDFS文件读写方法 452 5.2 文件读操作与输入流 452 5.2.1 打开文件 452 5.2.2 读操作――DFSInputStream实现 461 5.3 文件短路读操作 481 5.3.1 短路读共享内存 482 5.3.2 DataTransferProtocol 484 5.3.3 DFSClient短路读操作流程 488 5.3.4 Datanode短路读操作流程 509 5.4 文件写操作与输出流 512 5.4.1 创建文件 512 5.4.2 写操作――DFSOutputStream实现 516 5.4.3 追加写操作 543 5.4.4 租约相关 546 5.4.5 关闭输出流 548 5.5 HDFS常用工具 549 5.5.1 FsShell实现 550 5.5.2 DFSAdmin实现 552
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值