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