美文网首页
Hadoop权威指南-ch3 HDFS(4)

Hadoop权威指南-ch3 HDFS(4)

作者: 元素周期表的十七君 | 来源:发表于2018-04-26 14:59 被阅读0次

    注:本文涉及书中3.6小结

    数据流

    1. 文件读取

    客户端读取文件时,HDFS、namenode和datanode之间的数据流

    结合上图,客户端通过调用FileSystem对象的open()方法来打开希望读取的文件

    step1. DistributedFileSystem通过使用RPC来调用namenode,以确定文件的起始块的位置。

    注:RPC是远程过程调用(Remote Procedure Call)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。

    step2. 对于每一个块,那么namenode返回存有该块副本的datanode地址,这些datanode根据它们与客户端的距离来排序。

    (注:Hadoop中的网络距离,详见本书3.6.1小节的图3-3)

    step3. DistributedFileSystem类返回一个FSDataInputStream对象给客户端并读取数据,客户端对这个输入流调用read()方法。

    step4. 通过对数据流反复调用read()方法,可以将数据从datanode传输到客户端

    step5. 到达块的末端时,DFSInputStream关闭与该datanode的连接,然后寻找下一个块的最佳datanode。也就是说不断的读入连续的块。

    step6. 客户端读取完毕,对FSDataInputStream调用close()方法。

    2. 文件写入

    客户端新建文件,写入文件,关闭文件的过程

    step1. 客户端通过对DistributedFileSystem对象调用create()方法来新建文件。

    step2. DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件中还没有相应的数据块。

    step3. DistributedFileSystem向客户端返回一个FSDataOutputStream对象,由此客户端可以开始写入数据

    step4. DFSOutputStream将数据分成一个个数据包,并写入内部队列,称为“数据队列”(data queue)。DataStreamer处理数据队列,根据datanode列表要求namenode分配合适的新块来存储数据复本,这些datanode构成了一个管线

    step5. DFSOutputStream维护一个内部数据包队列来等待datanode的收到确认回执,称为“确认队列”(ack queue)。收到管道中所有datanode确认信息后,该数据包才会从确认队列删除。

    step6. 客户端完成数据写入,对数据流调用close()方法。

    step7. 等待namenode收到文件写入完成的信号。

    3. 一致模型

    文件系统的一致模型(coherency model)描述了文件读/写的数据可见性。

    Hadoop1.x中,HDFS通过对FSDataOutputStream调用sync()方法,来使所有缓存与数据节点强行同步。

    Hadoop2.x中,用hflush()替代了sync(),且增加了hsync()

    sync()可以防止故障时丢失数据,但会增加很多额外的开销,需要在数据鲁棒性和吞吐量之间进行权衡,所以设置sync()的调用频率。

    相关文章

      网友评论

          本文标题:Hadoop权威指南-ch3 HDFS(4)

          本文链接:https://www.haomeiwen.com/subject/tzgplftx.html