(1)客户端通过调用FileSystem对象的open()来读取希望打开的文件。
(2)DistributedFileSystem通过RPC来调用namenode,以确定文件的开头部分的块位置。对于每一块,namenode返回具有该块副本的datanode地址。DistributedFileSystem 返回一个FSDataInputStream对象给client读取数据,FSDataInputStream转而包装成一个DFSInputStream对象
(3)client对这个输入流调用read()方法。存储着文件开头部分的块的数据节点的地址DFSInputStream随即与这些块最近的datanode相连接。
(4)通过在数据流中反复调用read(),数据会从datanode返回client。
(5)到达块的末端时,DFSInputStream会关闭与datanode间的联系,然后为下一个块找到最佳的datanode。client端只需要读取一个连续的流,这些对于client来说都是透明的。
client在读取文件时,如果与datanode通信遇到错误,那么它就会去尝试对这个块来说下一个最近的块,并记住那个故障的datanode,以保证不会再对之后的块进行徒劳无益的尝试。
client也会确认datanode发来的数据的校验和。如果发现一个损坏的块,client在会试图从别的datanode中读取一个块的副本之前,将这个错误报告给namenode。
client检索数据时,总是被namenode指引到块中最好的datanode。(这里涉及到一个数据块选择算法)
集群中,namenode仅提供数据块的位置请求(存储在内存中,十分高效),不是提供数据。否则如果客户端数量增长,namenode就会快速成为一个“瓶颈”。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。