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

Hadoop HDFS源码学习笔记(二)

2013年05月03日 ⁄ 综合 ⁄ 共 2069字 ⁄ 字号 评论关闭

Hadoop文件系统中有一个抽象的文件系统类,HDFS只是其中的一个实现。java抽象类org.apache.hadoop.fs.FileSystem 定义了Hadoop中一个文件系统接口,并且该抽象类有几个具体的实现,例如LocalFileSystem,hdfs.DistributeFileSystem等

虽然我们关注的是HDFS的DistributedFileSystem但还是应该集成FileSystem抽象类,并以此来编写代码,以此来保持不同的文件系统中的可移植性。

从FileSystem类开始入手,发现向上追踪到Configurable接口之后,看到一对set/get函数,其中的参数为Configuration类,而在查看源码的过程中也发现Configuration类无处不在,初学Hadoop的人都知道配置参数是在core-site.xml文件中进行的,所以这个类的目的也就明确了,默认情况下hadoop的Configuration类会按照顺序加载两个文件,文件的路径是通过classpath得到的(这里的classpath是指应用运行的类路径。服务端hadoop的classpath指向的是conf。客户端,classpath就是客户端应用的类路径src):

1、core-default.xml: hadoop的只读文件 位于src/core/文件夹中

2、core-site.xml: 指定hadoop安装过程需要的一些参数配置

xml文件中:资源以xml形式的数据表示,由一系列的键值对组成。资源可以用String或path命名,String-指示hadoop在classpath中查找该资源;Path-指示hadoop在本地文件系统中查找该资源。

关于该类的具体的描述可以查看hadoop的官方的javadoc文档:

http://hadoop.apache.org/common/docs/current/api/

http://hadoop.apache.org/hdfs/docs/current/api/


FileSystem class

与hadoop的文件系统交互的接口。可以被实现为一个分布式文件系统,或者一个本地件系统。使用hdfs都要重写FileSystem,可以像操作一个磁盘一样来操作hdfs。

1、 FileSystem是一个通用的文件系统API,首先检索我们需要的文件系统实例,获取FileSystem实例有两种静态工厂方法:

 public static FileSystem get(Configuration conf) throws IOException

public static FileSystem get(URI uri, Configuration conf) throws IOException

第一个方法返回的是默认文件系统(在core-site.xml文件中指定的,如果没有指定,则使用默认的本地文件系统)

第二个方法通过给定的URI方案和权限来确定要是用的文件系统,如果给定的URI中没有指定方案,则返回默认文件系统

2、 read数据

public FSDataInputStream open(Path f) throws IOException:打开指定路径的文件,返回输入流。默认4kB的缓冲。
public abstract FSDataInputStream open(Path f, int bufferSize)  throws IOException:buffersize为读取时的缓冲大小

FSDataInputStream类继承自java.io.DataInputStream,并支持随机访问

public class FSDataInputStream extends DataInputStream
    implements Seekable, PositionedReadable, Closeable {

}

可以看出Seakable借口支持文件中找到指定位置(seek()),并提供一个查询当前相对于文件起始位置的偏移量(getPos())

调用seek方法类定位大于文件长度的位置将导致IOException,与java.io.InputStream的skip()不同,seek可以定位到文件的任意绝对位置,而skip只能相对于当前位置定位到另一个位置。seek方法是一个相对高开销的操作,需慎重使用,最好使用流数据来构建应用的访问模式。

FSDataInputStream还是先了PositionedReadable接口,从一个指定偏移处读取文件的一部分

read()方法从文件指定的position出读取之多为length字节的数据并存入到缓冲区buffer的指定便宜量offset处,返回至使实际读到的字节数,调用者需要检查这个值,因为它有可能小于length。

所有的read方法都是线程安全的,并且不会改变当前文件的偏移量

DFSInputStream类可以从一个指定文件中返回数据,并且处理与namenode和多个datanode之间的通信


抱歉!评论已关闭.