大数据导论
上QQ阅读APP看书,第一时间看更新

2.3.4 HDFS数据读/写

1.PRC通信模型

RPC(Remote Procedure Call Protocol,远程过程调用协议)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息。最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。Hadoop的整个体系结构就是构建在RPC之上的。因此读者应对此有所了解。

图2-8所示为RPC的工作原理。

图2-8 PRC的工作原理

具体操作步骤如下:

(1)调用客户端句柄,执行传送参数。

(2)调用本地系统内核,发送网络消息。

(3)消息传送到远程主机。

(4)服务器句柄得到消息并取得参数。

(5)执行远程过程。

(6)执行的过程将结果返回服务器句柄。

(7)服务器句柄返回结果,调用远程系统内核。

(8)消息传回本地主机。

(9)客户句柄由内核接收消息。

(10)客户接收句柄返回的数据。

2.HDFS文件读取

文件的读取是指客户端从HDFS中读取文件的过程,图2-9所示为客户端以及与之交互的HDFS、NameNode、DataNode读数据流过程。

图2-9 客户端以及与之交互的HDFS、NameNode、DataNode读数据流过程

具体过程如下:

(1)使用HDFS提供的客户端(Client)调用DistributedFileSystem的open()函数,打开要读取的文件。

(2)DistributedFileSystem向NameNode发起RPC请求,得到文件的数据块信息。对于每个数据块,元数据节点返回保存数据块的数据节点的地址。

(3)客户端调用stream的read()函数开始读取数据。

(4)DFSInputStream连接保存此文件第一个数据块的最近的数据节点。

(5)当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。

(6)当客户端读取完毕数据时,调用FSDataInputStream的close函数。

3.HDFS文件的写入

文件的写入是指客户端将文件写入HDFS文件系统的过程。图2-10所示为客户端以及与之交互的HDFS、NameNode、DataNode写数据流过程。

图2-10 客户端以及与之交互的HDFS、NameNode、DataNode写数据流过程

具体过程如下:

(1)客户端调用DistributedFileSystem对象的create()函数创建文件。

(2)DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。

(3)元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。

(4)DistributedFileSystem返回DFSOutputStream,客户端用于写数据。

(5)客户端开始写入数据,DFSOutputStream将数据分成块,写入data queue。

(6)data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。

(7)Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。

(8)DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。