在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
分享到:
相关推荐
五、安全通信与身份验证 Hadoop支持Kerberos等安全协议,用于确保客户端和服务端的身份验证和授权。客户端需要获取Kerberos票据才能与服务器进行安全通信,防止未授权的访问和攻击。 六、工具支持 Hadoop提供了...
4. HDFS中的Heartbeats是指DataNode周期性地向NameNode发送的通信信号,用于汇报DataNode的状态,包括存储情况、健康状况等,同时也是NameNode监控DataNode运行状态的重要方式。 通过以上解析,我们可以看到HDFS是...
大家都知道HDFS的架构由NameNode,SecondaryNameNode和DataNodes组成,其源码类图如下图所示:正如上图所示,NameNode和DataNode继承了很多的protocol用于彼此间的通信,其实nameNode还实现了...实现了ClientProtocol...
首先,当客户端需要写入Block时,它会通过Remote Procedure Call (RPC) 协议与NameNode交互,请求创建文件。接着,客户端启动一个dataStreamer线程,该线程负责实际的数据传输。客户端主线程将本地数据读入内存,...
* Client 与 Namenode 之间的通信:HDFS使用RPC机制来实现Client与Namenode之间的通信,以便于实现文件的读写操作。 DataNode工作状态分析 DataNode是HDFS中的一个核心组件,负责存储和管理文件块。在HDFS中,...
DFSClient类中的成员变量主要包括与NameNode通信所需的RPC客户端实例,这些实例对于理解DFSClient的工作原理至关重要。 - **ClientProtocol namenode**:表示到NameNode的RPC客户端,包含了失败重试功能。 - **...
- `DFSClient`类:客户端与HDFS通信的主要接口。 ### Hadoop的RPC机制 Remote Procedure Call(RPC)是Hadoop中服务间通信的基础,NameNode与DataNode、客户端与NameNode之间的通信都依赖于RPC。Hadoop的RPC机制...
5. DataNode通常通过长连接与NameNode保持通信,以便实时更新Block状态。 6. Hadoop的安全性和权限管理是有限的,它不能防止恶意行为,只能防止误操作。 7. 不应简单地认为Slave节点的磁盘越大越好,数据恢复和...
心跳网络用于NameNode间的通信和ZooKeeper,而数据网络则用于数据节点与NameNode的通信。 10. **测试和监控**:部署完成后,务必进行充分的测试,包括手动和自动故障切换,确保系统能够在NameNode故障时正确恢复。...
客户端通过与NameNode通信获取文件的元数据信息,并且在执行文件读写操作时直接与DataNode通信。 HDFS适用于大规模数据存储,因为其设计可以很容易地扩展存储容量。它通过将数据分割成固定大小的数据块(默认大小是...
当用户提交作业时,Client首先会与ResourceManager通信,获取一个ApplicationID,然后将作业的配置信息、JAR文件、脚本等打包成一个应用程序包,通过YARN API提交给ResourceManager。ResourceManager会根据资源情况...
- **8019**:`dfs.ha.zkfc.port`,ZKFC与ZooKeeper之间的通信端口,用于实现NameNode的故障转移。 #### YARN(Yet Another Resource Negotiator)端口配置 - **ResourceManager** - **8032**:`yarn....
NameNode根据Clinet的请求提供DataNode的位置信息,以便Clinet能够直接与对应的DataNode进行通信。Clinet通过NameNodes所提供DataNode的位置进而与DataNode进行通信,请求读取或写入文件数据。DataNode根据Clinet的...
HDFS的架构主要包括 Namenode、Datanode、Secondary Namenode和Client四个组件。Namenode是HDFS的核心组件,负责维护文件系统的目录树和文件元数据。Datanode是数据存储节点,负责存储文件的数据块。Secondary ...
**解析:** 当客户端(Client)上传文件到HDFS时,首先会将文件分割成一系列固定大小的数据块(Block),然后通过与NameNode通信确定每个数据块应该存储的位置,并直接将这些数据块发送到指定的Datanode。在这个过程中,...
NameNode是HDFS中的名称节点,负责管理文件系统的命名空间,DataNode是HDFS中的数据节点,负责存储文件数据,Client是HDFS中的客户端,负责与NameNode和DataNode进行通信,实现文件的读写操作。 HDFS存储原理是指...
5. **DFSClient**: 虽然在客户端API中并不直接使用,但DFSClient是HDFS客户端与NameNode和DataNode交互的核心类。它处理所有的网络通信,包括打开、关闭文件,以及数据的读写。 为了在客户端进行HDFS操作,需要确保...
22. **DataNode 与 NameNode 通信**:DataNode通过长连接与NameNode保持通信,以报告状态和接收指令。 23. **Hadoop 权限管理**:Hadoop提供了基本的权限管理和安全性,但需要额外的安全组件如Kerberos来增强集群...
22. DataNode 用长连接与 NameNode 通信 - 正确 23. Hadoop 有严格的权限管理 - 正确 24. Slave 节点磁盘越大越好 - 正确 25. dfsadmin –report 检测损坏块 - 正确 26. 默认调度器是 FIFO - 正确 27. 集群节点应配 ...
22. DataNode通信:DataNode通过心跳机制与NameNode保持长连接通信。 23. Hadoop权限管理:Hadoop有基本的权限管理,但需要配合其他安全措施以确保集群的安全运行。 24. Slave节点磁盘:Slave节点(如DataNode)的...