Hadoop权威指南-ch3 HDFS(4)

注:本文涉及书中3.6小结

数据流

1. 文件读取

Hadoop权威指南-ch3 HDFS(4)_第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. 文件写入


Hadoop权威指南-ch3 HDFS(4)_第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))