上次小编说了读取数据的过程,今天小编给你说说怎么写数据,这是很重要的知识,跟CGFT考试中的读数据是相对的哦!


(1)客户端通过FileSystem.create()创建文件。

相应地,在HDFS文件系统中,DistributedFile System具体实现了FileSystem,因此,调用crea0方法后,DistributedFileSystem会创建输出流对象FSDataOutputStream,对于HDFS而言,具体的输出流就是DFSOutputStream

(2)然后,DistributedFileSystem通过RPC远程调用名称节点,在文件系统的命名空间中佳建一个新的文件。名称节点会执行一些检查,比如文件是否已经存在,客户端是否有权限创建文件等。检查通过之后,名称节点会构造一个新文件,并添加文件信息。远程方法调用结束后,DistributedFileSystem会利用DFSOutputStream来实例化FSDataOutputStream,返回给客户端,客户端使用这个输出流写人数据。

(3)获得输出流FSDataOutputStream以后,客户端调用输出流的write()方法向HDFS中对应的文件写入数据。

(4)客户端向输出流FSDataOutputStream中写入的数据,会首先被分成一个个的分包,这些分包被放入DFSOutputStream对象的内部队列。输出流FSDataOutputStream会向名称节点申请保存文件和副本数据块的若干个数据节点,这些数据节点形成一个数据流管道。队列中的分包*后被打包成数据包,发往数据流管道中的*个数据节点,*个数据节点将数据包发送给第二个数据节点,第二个数据节点将数据包发送给第三个数据节点,这样,数据包会流经管道上的各个数据节点(即第3.5.2节介绍的流水线复制策略)。

(5)因为各个数据节点位于不同机器上,数据需要通过网络发送,因此,为了*所有数据节点的数据都是*的,接收到数据的数据节点要向发送者发送“确认包”(ACK Packet)。确认包沿着数据流管道逆流而上,从数据流管道依次经过各个数据节点并*终发往客户端,当客户端收到应答时,它将对应的分包从内部队列移除。不断执行(3)~(5)步,直到数据全部写完。

(6)客户端调用close()方法关闭输出流,此时开始,客户端不会再向输出流中写入数据,所以,当DFSOutputStream对象内部队列中的分包都收到应答以后,就可以使用ClientProtocol.complete()方法通知名称节点关闭文件,完成一次正常的写文件过程。