文件写入
image.png- 客户端通过对DistributedFileSystem对象调用create()函数来创建文件
- DistributedFileSystem对NameNode创建一个RPC调用,在文件系统的命名空间中创建文件名,但是没有相应的数据块
- 在客户端写入数据时,FSDataOutputStream将数据分为一个个的数据包,并写入数据队列,同时向namenode申请一个新的block来存放数据。
- 将数据队列中的数据写入到一个datanode中,其余datanode之间(管道线pipeline)传数据包。
- 直到收到所有datanode的确认信息后,该数据包才会从确认队列删除
- 客户端完成所有数据包的写入后,会对数据流调用close()方法
- 通知namenode写入成功。
文件读取
image.png- 客户端通过调用DistributedFileSystem对象的open()方法来打开希望读取的文件。
- DistributedFileSystem通过RPC调用namenode,确定文件起的位置。
- 客户端对输入流调用read()方法。
- 对数据流反复调用read()方法,将数据从datanode传输到客户端。
- 当读到block的末尾时,转而读下一个block。
文件复制
- NameNode发现文件的文件块不符合最小复制数或者Datanode失效时
- NameNode就通知DataNode相互复制文件块
- DataNode开始互相复制。默认的布局策略是同一个机架不同节点放一个副本、不同机架的节点上放一个副本。
网友评论