现在的位置: 首页 > 综合 > 正文

Hadoop HDFS源码学习笔记(三)

2013年10月30日 ⁄ 综合 ⁄ 共 1406字 ⁄ 字号 评论关闭

继续上一篇blog,进一步分析FileSystem的API,并完善类图


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接口了,因为位置定位没有任何意义


4、mkdir 创建目录

public boolean mkdirs(Path f) throws IOException 这个方法可以一次性的创建不存在的目录,其实在create方法中如果不存在父目录就会直接创建,所以可以不必显示的创建一个目录


5、FileStatus 文件元数据

FileStatus类在client提供了file的元数据信息,主要包括文件长度、块大小、备份数、修改时间、所有者以及权限信息


除此之外还有列出文件或目录信息的方法listStatus  删除数据delete方法等



抱歉!评论已关闭.