搜索
搜 索
本版
文章
帖子
用户
图文精华
hadoop-2.6.0+zookeeper-3.4.6+hbase-1.0.0+hive-1.1.0完全分布 ...
首页
Portal
专题
BBS
面试
更多
登录
注册
用户组:游客
主题
帖子
云币
我的帖子
我的收藏
我的好友
我的勋章
设置
退出
导读
淘贴
博客
群组
社区VIP
APP下载
今日排行
本周排行
本周热帖
本月排行
本月热帖
会员排行
About云-梭伦科技
»
专题
›
技术学习(版主发帖区)
›
大数据学习
›
连载型
›
Hadoop二次开发必备,Hadoop源码分析(九)
0
0
0
分享
Hadoop二次开发必备,Hadoop源码分析(九)
sstutu
2014-1-15 22:06:50
发表于
连载型
[显示全部楼层]
只看大图
阅读模式
关闭右栏
0
11379
本帖最后由 pig2 于 2014-1-16 00:16 编辑
我们开始对租约Lease进行分析,下面是类图。Lease可以认为是一个文件写锁,当客户端需要写文件的时候,它需要申请一个Lease,NameNode负责记录那个文件上有Lease,Lease的客户是谁,超时时间(分布式处理的一种常用技术)等,所有这些工作由下面3个类完成。至于租约过期NameNode需要采取什么动作,并不是这部分code要完成的功能。
LeaseManager(左)管理着系统中的所有Lease(右),同时,LeaseManager有一个线程Monitor,用于检查是否有Lease到期。一个租约由一个holder(客户端名),lastUpdate(上次更新时间)和paths(该客户端操作的文件集合)构成。了解了这些属性,相关的方法就很好理解了。LeaseManager的方法也就很好理解,就是对Lease进行操作。注意,LeaseManager的addLease并没有检查文件上是否已经有Lease,这个是由LeaseManager的
调用者来保证
的,这使LeaseManager跟简单。内部类Monitor通过对Lease的最后跟新时间来检测Lease是否过期,如果过期,简单调用FSNamesystem的internalReleaseLease方法。这部分的代码比我想象的简单,主要是大部分的一致性逻辑都存在于LeaseManager的使用者。在开始分析FSNamesystem.java这个4.5k多行的庞然大物之前,我们继续来扫除外围的障碍。下面是关于访问控制的一些类:
Hadoop文件保护采用的UNIX的机制,文件用户分文件属主、文件组和其他用户,权限读,写和执行(FsAction中抽象了所有组合)。
我们先分析包org.apache.hadoop.fs.permission的几个类吧。FsAction抽象了操作权限,FsPermission记录了某文件/路径的允许情况,分文件属主、文件组和其他用户,同时提供了一系列的转换方法,applyUMask用于去掉某些权限,如某些操作需要去掉文件的写权限,那么可以通过该方法,生成对应的去掉写权限的FsPermission对象。PermissionStatus用于描述一个文件的文件属主、文件组和它的FsPermission。
INode在保存PermissionStatus时,用了不同的方法,它用一个long变量,和SerialNumberManager配合,保存了PermissionStatus的所有信息。
SerialNumberManager保存了文件主和文件主号,用户组和用户组号的对应关系。注意,在持久化信息FSImage中,不保存文件主号和用户组号,它们只是SerialNumberManager分配的,只保存在内存的信息。通过SerialNumberManager得到某文件主的文件主号时,如果找不到文件主号,会往对应关系中添加一条记录。
INode的long变量作为一个位串,分组保存了FsPermission(MODE),文件主号(USER)和用户组号(GROUP)。
PermissionChecker用于权限检查。
---------------------------------------------------------------------------------------------------------------------------------------------------
下面我们来分析FSDirectory。其实分析FSDirectory最好的地方,应该是介绍完INode*以后,FSDirectory在INode*的基础上,保存了HDFS的文件目录状态。系统加载FSImage时,FSImage会在FSDirectory对象上重建文件目录状态,HDFS文件目录状态的变化,也由FSDirectory写日志,同时,它保存了文件名à数据块的映射关系。FSDirectory只有很少的成员变量,如下:
final
FSNamesystem namesystem;
final
INodeDirectoryWithQuota rootDir;
FSImage fsImage;
boolean
ready =
false
;
其中,namesystem,fsImage是指向FSNamesystem对象和FSImage对象的引用,rootDir是文件系统的根,ready初值为false,当系统成功加载FSImage以后,ready会变成true,FSDirectory的使用者就可以调用其它FSDirectory功能了。FSDirectory中剩下的,就是一堆的方法(我们不讨论和MBean相关的类,方法和过程)。
loadFSImage用于加载目录树结构,它会去调用FSImage的方法,完成持久化信息的导入以后,它会把成员变量ready置为true。系统调用loadFSImage是在FSNamesystem.java的initialize方法,那是系统初始化重要的一步。addFile用于创建文件或追加数据时创建INodeFileUnderConstruction,下图是它的Call Hierachy图:
addFile首先会试图在系统中创建到文件的路径,如果文件为/home/hadoop/Hadoop.tar,addFile会调用mkdirs(创建路径为/home/hadoop,这也会涉及到一系列方法),保证文件路径存在,然后创建INodeFileUnderConstruction节点,并把该节点加到目录树中(通过addNode,也是需要调用一系列方法),如果成功,就写操作日志(logOpenFile)。
unprotectedAddFile也用于在系统中创建一个目录或文件(非UnderConstruction),如果是文件,还会建立对应的block。FSDirectory中还有好几个unprotected*方法,它们不检查成员变量ready,不写日志,它们大量用于loadFSEdits中(这个时候ready当然是false,而且因为正在恢复日志,也不需要写日志)。
addToParent添加一个INode到目录树中,并返回它的上一级目录,它的实现和unprotectedAddFile是类似的。
persistBlocks比较有意思,用于往日志里记录某inode的block信息,其实并没有一个对应于persistBlocks的写日志方法,它用的是logOpenFile。这个大家可以去检查一下logOpenFile记录的信息。closeFile对应了logCloseFile。
addBlock和removeBlock对应,用于添加/删除数据块信息,同时它们还需要更新FSNamesystem.java中对应的信息。
unprotectedRenameTo和renameTo实现了UNIX的mv命令,主要的功能都在unprotectedRenameTo中完成,复杂的地方在于对各种各样情况的讨论。
setReplication和unprotectedSetReplication用于更新数据块的副本数,很简单的方法,注意,改变产生的对数据块的删除/复制是在FSNamesystem.java中实现。
setPermission,unprotectedSetPermission,setOwner和unprotectedSetOwner都是简单的方法。
Delete和unprotectedDelete又是一对方法,删除如果需要删除数据块,将通过FSNamesystem的removePathAndBlocks进行。……(后续的方法和前面介绍的,都比较类似,都是一些过程性的东西,就不再讨论了)
下一篇
Hadoop二次开发必备,Hadoop源码分析(十)
下一篇
Hadoop二次开发必备,Hadoop源码分析(八)
欢迎加入about云群
425860289
、
432264021
,云计算爱好者群,关注
about云腾讯认证空间
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
没找到任何评论,期待你打破沉寂
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
发表新帖
sstutu
实习版主
关注
405
主题
948
帖子
143
粉丝
TA的主题
Flink基础教程
2018-10-24
39天大数据学习第30天:使用Spark
2018-10-24
Flink使用场景-生产环境【适合架构师、面试者】
2018-10-24
阿里巴巴为什么选择Apache Flink?
2018-10-24
美团点评基于 Flink 的实时数仓建设实践
2018-10-24
24小时热文
像高手一样发言:七种常见工作场景的说话之
幕后产品:打造突破式产品思维
副业警钟,新型法律碰瓷发财方式:批量诉讼
Spark机器学习
Spark机器学习算法、源码及实战详解
关闭
推荐
/2
中文版ChatGPT
1.无需魔法 2.提高编程效率 3.提高文档能力
查看 »
新手帮助
新手帮助:注册遇到问题,领取资源,加入铁粉群,不会使用搜索,如何获取积分等
查看 »
意见
反馈