Hadoop学习日志之HDFS读写策咯

来源:互联网 发布:windows程序开发 编辑:程序博客网 时间:2024/05/29 10:57

关于HDFS读写顺序,有以下几点,首先,先看图:

                                         

1.客户端通过调用FileSystem对象的open()来读取希望打开的文件。

2.DistributedFileSystem通过RPC来调用namenode,以确定文件的开头部分的块位置。namenode返回每块副本的datanode的存储位置,根据他们

所在的位置返回。(就近原则)

3.接着client对这个输入流调用read()。存储着文件开头部分块的数据节点地址的DFSInputStream随即与这些块最近的datanode相连接。

4.通过在数据流中反复调用read(),数据会从datanode返回client。

5.当读取快到末端的时候,就会准备关闭DFS与datanode的联系,寻找下一个合适位置的datanode.


错误处理:在读取的时候,如果client与datanode通信时遇到一个错误,那么它就会去尝试对这个块来说下一个最近的块。它也会记住那个故障节点

的datanode,以保证不会再对之后的块进行徒劳无益的尝试。client也会确认datanode发来的数据的校验和。如果发现一个损坏的块,它就会在

client试图从别的datanode中读取一个块的副本之前报告给namenode。


设计重点:这个设计的一个重点是,client直接联系datanode去检索数据,并被namenode指引到块中最好的datanode。因为数据流在此集群中是

在所有datanode分散进行的。所以这种设计能使HDFS可扩展到最大的并发client数量。同时,namenode只不过提供块的位置请求(存储在内存

中,十分高效),不是提供数据。否则如果客户端数量增长,namenode就会快速成为一个“瓶颈”。


读策略



读策略与写策略类似,但是也有不同点。

1.首先创建文件

2.DistributedFileSystem 使用RPC去调用namenode,在文件系统的命名空间创一个新的文件,没有块与之相联系。namenode执行各种不同的检

查以确保这个文件不会已经存在,并且在client有可以创建文件的适当的许可。如果检查通过,namenode就会生成一个新的文件记录;否则,文件创

建失败并向client抛出一个IOException异常。创建成功后开始写入通过分布式文件系统返回的输入流的数据。

3.将数据封装成包,写入内部队列。

4.数据流将包分流给管线中第一个的datanode,这个节点会存储包并且发送给管线中的第二个datanode。同样地,第二个datanode存储包并且传给

管线中的第三个数据节点。

5.DFSOutputStream也有一个内部的数据包队列来等待datanode收到确认,称为确认队列。一个包只有在被管线中所有的节点确认后才会被移除

出确认队列。只有所有的节点都被确认才会移除该包。

6.数据写完,关闭连接。


副本机制:第2个复本放在与第1个复本不同且随机另外选择的机架的节点上(离架)。第3个复本与第2个复本放在相同的机架,且随机选择另一个节

点。其他复本放在集群中随机的节点上,不过系统会尽量避免相同的机架放太多复本。


总的来说,这一方法不仅提供了很好的稳定性(数据块存储在两个机架中)并实现很好的负载均衡,包括写入带宽(写入操作只需要遍历一个交机)、

读取性能(可以从两个机架中选择读取)和集群中块的均匀分布(客户端只在本地机架上写入一个块)。


原创粉丝点击