Hadoop HDFS源码学习笔记(三)

Hadoop HDFS源码学习笔记(三)

3、write 数据

FileSystem类有一系列的create方法,其中简单的方法就是给定一个Path对象,然后返回一个用于写入数据的输出流:

public FSDataOutputStream create(Path f) throws IOException

create方法的多个重载版本中主要是允许我们指定是否需要覆盖已有的文件、文件备份数、写入文件是buffer的大小、block的大小以及文件的权限,并且可以指定是否上报progress

create方法,在创建文件时,如果路径中的parent directory不存在,则会自动创建不存在的父目录,如果不想创建父目录则FileSystem还提供了另外的方法:

public FSDataOutputStream createNonRecursive(Path f, FsPermission permission,

boolean overwrite,

int bufferSize, short replication, long blockSize,

Progressable progress) throws IOException {}

另外FileSystem提供了创建长度为0的file的方法:

public boolean createNewFile(Path f) throws IOException

如果给定的Path对象指定的file已经存在或者创建失败则会返回false

DFSOutputStream类通过byte流来创建一个文件,client端需要写入的数据会被定期的去做cache,数据首先被split成packet,每个packet的大小为64K,packet由chunk组成,每个chunk的大小为512Bytes并且跟着相应的checksum,当client去填充currentPacket的时候,该packet就会被放到dataQueue中,DataStreamer线程从DatatQueue中取出数据,并发送到pipeline的第一个datanode中并将该packet从dataQueue转移到ackQueue中,当接受到所有datanode的ack信息之后,将该packet从ackQueue中移除

另外一种创建文件的方法,是使用append方法,在一个已有的文件末尾追加数据,同样和create方法类似在FileSystem类有很多append方法的重载版本

对于一个已经打开的文件HDFS仅允许顺序写入,也就是说只能对文件进行append操作,既然不支持从文件任意位置的写入,因此FSDataOutputStream就没有必要实现Seekable和PositionedReadable接口了,因为位置定位没有任何意义

相关阅读:

Hadoop HDFS源码学习笔记(一)

Hadoop HDFS源码学习笔记(二)

Hadoop HDFS源码学习笔记(三)

Hadoop HDFS源码学习笔记(四)

Hadoop HDFS源码学习笔记(五)

Hadoop HDFS源码学习笔记(六)

更多Hadoop相关信息见Hadoop 专题页面 ?tid=13

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c7d8150a3d28a2d53b6685d005d64011.html