Namenode 与client通信

在Hadoop中,是通过自己的代码来实现RPC机制的,而不是通过sun的实现。
Namenode中存在与Datanode通信,与client通信,近期整理了一下与Namenode与client通信的一个流程,最主要的是熟悉Namenode类,FSNamespace类,FSDirectory类,以及Namespace树状结构和BlocksMap结构。以下一一说明。
以下是基于Cloudera h3b2版本,所以以下的接口流程也请参考相应版本。
由于visio图贴上来很麻烦,这次先不贴用例图了.
接口流程
以下各个接口,将根据用例图加用例说明加以解释。
1. mkdir
1) 用例图

2) 用例说明
用例名称:mkdir
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode在NameSpace中增加目录
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用mkdirs()方法
3、调用FSNameSystem中的mkdir()方法,然后调用mkdirInternal()方法,主要检验访问权限
4、mkdirInternal()调用FSDirectory,首先查询内存中NameSpace目录树,检查是否存在该目录,如没有则调用FSDirectory中的mkdir()方法,修改内存中目录树结构
5、返回给client Boolean值,代表添加成功与否

2. create
1) 用例图

2) 用例说明

用例名称:create
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode在NameSpace中增加文件
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用create()方法
3、调用FSNameSystem中的startFile()方法,然后调用startFileInternal()方法用来
4、startFileInternal ()检查safemode、有效性以及读写锁和租约等条件,随后查询内存中NameSpace目录树,检查是否存在该文件
5、如果不存在该文件,则获取租约、生成读写锁,调用FSDirectory中的addFile(),生成一个INodeFileUnderConstruction对象,并加入到内存中目录树结构

3. setReplication
1) 用例图


2) 用例说明
用例名称:setReplicaiton
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode修改指定的INodeFile副本个数
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用setReplication()方法
3、调用FSNameSystem中的setReplication ()方法,然后调用setReplicationInternal()方法
4、setReplicationInternal ()调用FSDirectory查询内存中NameSpace目录树中的对应的INodeFile对象
5、FSDirectory根据INodeFile对象设置副本数,调用FSDirectory.setReplication()获得INodeFile对象对应的block[]数组
6、如果新设置的副本数大于原副本数则将该block数组放置于需要进行复制块的队列中,如果新设置的副本小于原副本数,则将block数组防止与需要移除块的队列中
7、返回给client Boolean值,代表修改成功与否
4. setPermission
1) 用例图

2) 用例说明
用例名称:setPermission
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode根据提供的文件名称和权限类型来对象应的INodeFile对象修改权限
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用setPermission()方法
3、调用FSNameSystem中的setPermission ()方法,检查safemode状态
4、调用FSDirectory的setPermission()方法,随后调用unprotectedSetPermission()方法
5、unprotectedSetPermission ()从内存的NameSpace目录树中的获得对应的INode对象
6、INode对象直接设置权限,调用INode.setPermission()

5. setOwner
1) 用例图


2) 用例说明
用例名称:setOwner
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode根据提供的文件名称和用户、用户组属性来修改对应的INodeFile对象属性
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用setOwner()方法
3、调用FSNameSystem中的setOwner ()方法, 检查safemode状态
4、调用FSDirectory的setOwner()方法,随后调用unprotectedSetOwner ()方法
5、unprotectedSetPermission ()从内存的NameSpace目录树中的获得对应的INode对象
6、INode对象直接设置user 和group,调用INode.setUser(),INode.setGroup()


6. delete
1) 用例图

2) 用例说明
用例名称:delete
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode根据提供的文件名称在NameSpace中删除INode对象,并将对应的block从blocksMap中删除
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用delete()方法
3、调用FSNameSystem中的delete ()方法,随后调用deleteInternal ()方法,检查safemode状态
4、deleteInternal ()调用FSDirectory的delete()方法,随后调用unprotectedDelete()方法
5、unprotectedDelete()方法递归的删除所在路径下的所有子目录和文件,调用removeChild()将对应的所有INode对象从NameSpace中删除
6、调用FSNameSystem.removePathAndBlocks()方法将上一步INode对象对应的Block从BlocksMap中删除
7、将所有删除的block数组放入失效数组队列中,下次心跳响应时发送给DataNode删除相应块
8、返回boolean值提示client删除是否成功


7. rename
1) 用例图

2) 用例说明
用例名称:rename
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode根据提供的参数修改相应的目录或文件名称
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用rename()方法
3、调用FSNameSystem中的renameTo ()方法,调用FSNameSystem的renameToInternal()方法,检查safemode和权限
4、随后调用FSDirectory的renameTo()方法,调用unprotectedRenameTo ()方法,从内存的NameSpace目录树中的获得对应的修改文件或文件夹的父INode对象
5、调用removeChild()方法从父INode对象中移除欲修改的文件名称对应的INode对象,并刷新原父节点INode对象存储信息
6、调用addChild()方法将5中移除的INode对象在NameSpace建立新的目录结构
7、返回boolean值提示client删除是否成功


8. setTimes
1) 用例图

2) 用例说明
用例名称:setTimes
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode根据提供的文件名称修改文件对应的存取时间和修改时间
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用setTimes()方法
3、调用FSNameSystem中的setTimes ()方法, 检查safemode和权限并从NameSpace中获取对应名称的INode对象
4、调用FSDirectory的setTimes()方法,随后调用unprotectedSetTimes ()方法
5、unprotectedSetTimes ()根据前面获得的INode对象直接修改accessTime和ModificationTime


9. setQuota
1) 用例名

2) 用例说明
用例名称:setQuota
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode根据参数值设置目录的Quota值
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用setQuota()方法
3、调用FSNameSystem中的setQuota ()方法,调用FSDirectory的setQuota()方法,随后调用unprotectedSetQuota()方法
4、unprotectedSetQuota()从NameSpace中获得INode对象修改,判断是否是INodeDirectory等条件
5、如果INodeDirectory存在quota属性,调用INodeDirectory.setQuota()方法设置,如果不存在则转化为具有quota属性INodeDirectory对象


10. getListing
1) 用例图

2) 用例说明
用例名称:getListing
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode根据提供的文件名称在NameSpace中获取相应的目录列表,并将相关信息返回给用户
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用getListing()方法
3、调用FSNameSystem中的getListing ()方法,随后调用FSDirectory的getListing()方法
4、根据所要的是文件还是文件夹分别处理,文件夹递归调用。对文件,则从NameSpace中查询对应的INode对象
5、调用createFileStatus()方法根据INode对象封装成FileStatus对象
6、将FileStatus对象返回给用户


11. getStats
1) 用例图

2) 用例说明
用例名称:getStats
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode返回给用户集群使用情况
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用getStats()方法
3、调用FSNameSystem中的getStats ()方法,直接获取集群使用情况
4、封装为long[]数组后返回给client


12. setSafeMode
1) 用例图


2) 用例说明
用例名称:setSafeMode
简要说明:HDFS Client通过RPC与NameNode进行通信,手动对NameNode设置safemode状态
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用setSafeMode()方法
3、调用FSNameSystem中的setSafeMode ()方法,根据参数判定
4、如果参数为SAFEMODE_LEAVE,则调用leaveSafeMode()退出safemode状态,如果参数是SAFEMODE_ENTER,则调用enterSafeMode(),进入safemode状态
4、返回client 目前是否处于safemode状态


13. getFileInfo
1) 用例图


2) 用例说明
用例名称:getFileInfo
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode根据提供的文件名称在NameSpace中获取相应文件状态并返回给用户
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用getFileInfo()方法
3、调用FSNameSystem中的getFileInfo ()方法,随后调用FSDirectory的getFileInfo()方法
4、从NameSpace中查询对应的INode对象
5、调用createFileStatus()方法根据INode对象封装成FileStatus对象
6、将FileStatus对象返回给用户


14. getContentSummary
1) 用例图


2) 用例说明
用例名称:getContentSummary
简要说明:HDFS Client通过RPC与NameNode进行通信,NameNode根据提供的名称在NameSpace中获取相应文件或目录的summary
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用getContentSummary()方法
3、调用FSNameSystem中的getContentSummary ()方法,随后调用FSDirectory的getContentSummary ()方法
4、从NameSpace中查询对应的INode对象,调用INode的computeContentSummary()方法获得contentSummary对象
5、将contetntSummary对象返回给用户


15. distributedUpgradeProgress
1) 用例图


2) 用例说明
用例名称:distributedUpgradeProgress
简要说明:HDFS Client通过RPC与NameNode进行通信,对HDFS升级
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用distributedUpgradeProgress ()方法
3、调用FSNameSystem中的distributedUpgradeProgress ()方法
4、返回client UpgradeStatusReport表示升级状态


16. finalizeUpgrade
1) 用例图


2) 用例说明
用例名称:finalizeUpgrade
简要说明:HDFS Client通过RPC与NameNode进行通信,终止对HDFS升级
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用finalizeUpgrade ()方法
3、调用FSNameSystem中的finalizeUpgrade ()方法
4、最后调用FSImage中的finalizeUpgrade()方法,终止对HDFS升级


17. refreshNodes
1) 用例图


2) 用例说明
用例名称:refreshNodes
简要说明:HDFS Client通过RPC与NameNode进行通信,根据配置删除有关DataNode
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用refreshNodes ()方法
3、调用FSNameSystem中的refreshNodes ()方法,重新检查配置文件,读取DataNode列表中白名单(dfs.hosts)和黑名单(dfs.hosts.exclude),将退役的DataNode从DatanodeMap中删除
4、 调用updateNeededReplications()函数将删除的DataNode节点中的所有block放入需增加拷贝的队列中


18. getBlockLocations
1) 用例图

2) 用例说明
用例名称:getBlockLocations
简要说明:HDFS Client通过RPC与NameNode进行通信,根据文件名称,获取其对应的blocks信息
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用getBlockLocations ()方法
3、调用FSNameSystem中的getBlockLocations ()方法,随后调用getBlockLocationInternal()方法
4、 从NameSpace中获取文件名称对应的INode对象,并根据读取位置(long offset),读取长度(long length)定位到相应的block,从BlocksMap结构中查询所需的block对象
5、最后将文件名称,block位置和大小等封装为LocatedBlocks对象,返回给用户


19. append
1) 用例图


2) 用例说明
用例名称:append
简要说明:HDFS Client通过RPC与NameNode进行通信,根据欲追加(append)的文件名称,返回给client对应文件最后一个块的信息
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用append ()方法
3、调用FSNameSystem中的appendFile ()方法,随后调用startFileInternal()方法
4、startFileInternal()根据文件名称,将该文件转化为INodeFileUnderConstruction状态,获取读写锁等
5、调用FSDirectory的replaceINode()方法,改变NameSpace中该文件状态
6、 随后appendFile()方法从blocksMap中获得该INode对象的block的相关信息,包括block location等
7、最后将文件名称,block位置和大小等封装为LocatedBlocks对象,返回给用户


20. abandonBlock
1) 用例图

2) 用例说明
用例名称:abandonBlock
简要说明:HDFS Client通过RPC与NameNode进行通信,根据参数删除对应block对象
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用abandonBlock ()方法
3、调用FSNameSystem中的abandonBlock ()方法,随后调用FSDirectory的abandonBlock()方法
4、adandonBlock()从NameSpace中得到INodeFile对象,删除对应的block,同时从blocksMap中删除对应的block
5、如果该block在corruptReplicas队列中,则从中移除


21. addBlock
1) 用例图

2) 用例说明

用例名称:addBlock
简要说明:HDFS Client通过RPC与NameNode进行通信,根据文件名称向已有的文件增加一个块
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用addBlock ()方法
3、调用FSNameSystem中的getAdditionalBlock ()方法,对该INodeFile对象申请读写锁,转化为INodeFileUnderConstruction对象,调用ReplicationTargetChooser的chooseTarget为新增的block选择Datanode位置
4、随后调用allocateBlock(),new 一个block,验证正确性,调用FSDirectory的addBlock()方法
5、SDirectory的addBlock()方法更新内存中NameSpace和blocksMap状态即向blocksMap中注册该block及INodeFile,并将该block添加到INodeFile的block[]数组中,
6、最后将该block信息,写入的datanode位置等封装为LocatedBlocks对象,返回给client,client接收后按照datanode位置直接与datanode通信


22. complete
1) 用例图

2) 用例说明
用例名称:complete
简要说明:HDFS Client完成写操作后,通过RPC与NameNode进行通信,将写入的文件状态从INodeFileUnderConstruction转换为INodeFile
流程说明: 1、client完成写操作后与NameNode进行RPC通信
2、NameNode调用complete ()方法
3、调用FSNameSystem中的completeFile ()方法,调用completeFileInternal()方法
4、调用FSDirectory的getFileBlocks()方法,查询该文件的block是否存在
5、如果block不存在则OPERATION_FAILED,如果正在复制中则返回STILL_WAITING,已经存在则返回COMPLETE_SUCCESS
5、若复制成功,则将文件状态从INodeFileUnderConstruction转换为INode
6、最后将该操作成功与否返回给client


23. reportBadBlocks
1) 用例图

2) 用例说明
用例名称:reportBadBlock
简要说明:HDFS Client通过RPC与NameNode进行通信,将损坏的block信息提交
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用reportBadBlocks()方法
3、调用FSNameSystem中的markBlockAsCorrupt ()方法,从blocksMap中获得对应的blockInfo
4、从NameSpace中查询该block对应的INode,如果该INode对象不存在,则调用addToInvalidates将该block放入失效队列中,如果该INode对象存在,则调用addToCorruptReplicasMap()放入损坏队列中


24. renewLease
1) 用例图

2) 用例说明
用例名称:reportBadBlock
简要说明:HDFS Client通过RPC与NameNode进行通信,续签租约
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用renewLease()方法
3、调用FSNameSystem中的renewLease()方法,调用LeaseManager的renewLease()方法进行续签租约等操作


25. getDatanodeReport
1) 用例图

2) 用例说明
用例名称:getDatanodeReport
简要说明:HDFS Client通过RPC与NameNode进行通信,根据参数获得不同状态下的Datanode信息
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用getDatanodeReport ()方法
3、调用FSNameSystem中的datanodeReport()方法,随后调用getDatanodeListForReport()方法
4、首先从列表中获得所有白名单与黑名单中的datanode,然后遍历datanodeMap,根据参数选择返回的是live状态还是dead状态的datanode
5、将Datanode的信息封装为DatanodeInfo,返回给用户


26. getPreferredBlockSize
1) 用例图

2) 用例说明
用例名称:getPreferredBlockSize
简要说明:HDFS Client通过RPC与NameNode进行通信,根据文件名称获得preferred block size
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用getPreferredBlockSize ()方法
3、调用FSNameSystem中的getPreferredBlockSize()方法,随后调用FSDirectory的getPreferredBlockSize()方法
4、FSDirectory的getPreferredBlockSize()方法从NameSpace中查询出该文件名称对应的INode对象,如果是目录则返回一场,如果是文件直接调用INodeFile的getPreferredBlockSize()方法
5、将preferred block size返回给client


27. saveNamespace
1) 用例图

2) 用例说明
用例名称:saveNamespace
简要说明:HDFS Client通过RPC与NameNode进行通信,将内存中的目录树存储至硬盘
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用saveNamespace ()方法
3、调用FSNameSystem中的saveNamespace ()方法,随后调用FSImage的saveFSImage ()方法
4、FSImage的saveFSImage ()方法将内存中的目录是刷新到硬盘中生成新的editlog等操作


28. metaSave
1) 用例图


2) 用例说明
用例名称:metaSave
简要说明:HDFS Client通过RPC与NameNode进行通信,将NameNode中的一些元数据存储至硬盘
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用metaSave ()方法
3、调用FSNameSystem中的metaSave()方法,根据指定文件名称或者默认的hadoop.log.dir配置中选择存储路径
4、将以下信息:datanode信息,等待被复制的块队列,正在被复制的块队列,无效块队列中的所有块信息写入到硬盘中


29. fsync
1) 用例图

2) 用例说明
用例名称:fsync
简要说明:HDFS Client通过RPC与NameNode进行通信,将指定文件所有元数据包括块信息等写入editlog
流程说明: 1、client与NameNode进行RPC通信
2、NameNode调用fsync ()方法
3、调用FSNameSystem中的fsync()方法,从NameSpace中获得INode对象,调用FSDirectory的persistBlocks()方法,调用FSEditLog的logOpenFile
4、将INode所有元信息写入editLog
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值