参考《hadoop权威指南》
读取
客户端通过DistributedFileSystem对象的open()方法打开希望读取的文件。
-
这个对象通过RPC(远程过程调用)调用namenode来确定文件的起始块位置
-
DistributedFileSystem类返回一个FSDataInputStream输入流对象。
-
客户端对这个输入流调用read()方法,连接距离最近的文件中第一个块所在datanode。验证datanode中的校验和。
如果检测到数据块有错误,向namenode报告已损坏的数据块和正在读的datanode。
namenode标记这个数据块已损坏。
安排这个数据块的一个副本复制到另一个datanode。
删除已损坏副本。 -
读取数据。
到达块末尾时,关闭与此datanode的连接,然后寻找下一个块的最佳Datanode -
客户端读取完成,对输入流调用close方法。
写入
-
客户端通过DistributedFileSystem对象调用create()创建文件。
-
DistributedFileSystem对namenode创建一个RPC调用,在文件系统命名空间创建一个文件,namenode执行检查(已存在,权限)
-
DistributedFileSystem类返回一个FSDataInputStream输入流对象。
输入流将数据分成数据包(分块),形成数据队列。
DataStreamer挑选合适的一组datanode存放数据,称为一个管线。
(默认)复本存放策略:
1 客户端所在节点(客户端在集群外的话,随机选节点)
2 不同于第一个节点的机架上
3 同2机架的不同节点
其他 随机 -
数据包和校验和流式传入管线中的节点
-
当datanode发生故障,关闭管线。
在该数据块所在的其他datanode做个标识,发送给namenode。
管线中删除故障datanode。
数据包继续在管线中的正常namenode间发送。
(副本量不足时,在另一个节点上创建新副本) -
一个数据包写完后datanode通知客户端和namendoe,然后写下一个数据包。
-
都写完以后,通知namenode
-
客户端对数据流调用close方法