Chinaunix首页 | 论坛 | 博客
  • 博客访问: 120933
  • 博文数量: 91
  • 博客积分: 167
  • 博客等级: 入伍新兵
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-22 17:26
文章分类

全部博文(91)

文章存档

2012年(91)

分类: 云计算

2012-11-11 16:58:28

      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文档:
 
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之间的通信
阅读(827) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~