上节中我们已经学习了HDFS的体系结构及其优缺点,本节我们将着重学习HDFS的几个主要流程。
[color=blue][b]客户端在NameNode上的文件与目录操作[/b][/color]
[b]创建文件目录[/b]
客户端命令:
hadoop fs -mkdir test
示意图如下:
[img]http://dl2.iteye.com/upload/attachment/0084/9559/9909a544-84a1-310e-b1be-8076c8308955.jpg[/img]
当客户点通过命令行穿件文件目录时,实际上是调用HDFS的FileSystem实例,也就是DistributedFileSystem的mkdir方法时,DistributedFileSystem对象通过RPC调用NameNode节点上的远程方法mkdir(),让名字节点执行具体的创建子目录的操作:在NameNode的目录上数据结构的对应位置创建新的目录节点,同时将这个操作并持久化到编辑日志中,方法执行成功后返回true,结束这一操作过程。
在创建目录的整个过程中,客户端不需要和DataNode节点进行交互。但是一些复杂的操作,比如复制副本和删除HDFS上的文件时,都需要数据节点的配合执行这样的操作——但是不是理解和DataNode节点交互,这要通过主从节点之间的“心跳”来交互这些操作信息,然后由DataNode数据节点来具体执行这些操作。
接下来我们再看客户端是如何删除HDFS上的文件的,命令行删除命令:
hadoop fs -rm example.txt
整个删除流程如下:
[img]http://dl2.iteye.com/upload/attachment/0084/9573/faf18193-71ab-3e78-8bd3-09a3360dc8d8.jpg[/img]
1)、客户端调用HDFS的FileSystem实例,也就是DistributedFileSystem的delete()方法向NameNode发送数据的“删除”操作;
2)、DistributedFileSystem对象通过RPC调用DateNode节点上的delete(),它值标记操作要涉及的需要被删除的数据块,并将delete操作信息持久化到编辑日Edit log;
3)、当保存着这些数据块的DateNode节点向NameNode节点发送“心跳”,向DateNode节点报告自己当前的相关信息;
4)、在NameNode给DataNode的心跳回答中,NameNode节点会通过DatanodeCommand命令NameNode节点删除相应的数据。
在整个删除过程中,DateNode不会主动联系保存这些要被删除的数据块所在的DataNode节点,立即删除这些数据,而是在删除操作完成一段时间之后,才会被真的删除。
NameNode节点和DateNode节点之间永远为此着简单的主从关系,NameNode名字节点不会向DateNode数据发送任何RPC调用请求,DateNode节点需要配合NameNode节点执行的所有操作,都是通过DateNode节点心跳应答中携带的DatanodeCommand命令返回。