org.apache.hadoop.fs.FileSystem 是HDFS的文件系统抽象,在分布式系统中管理HDFS文件和目录。文件内容存储在由多个相同大小的块(如64M)构成的datanode节点中,namenode节点存储着这些块的信息和元信息。FileSystem按顺序访问这些块数据。FileSystem首先通过NameNode节点获取块信息,然后一个接一个地打开,读取,关闭。当FileSystem打开第一个块之后在完成读取后关闭之,然后打开第二个块。HDFS会对块数据进行多次复制以获取更高的可靠性和可扩展性。如果客户端本身就是datanode,则它会先尝试本地读取块数据,如果读取失败,则会尝试集群中的两一个datanode。FileSystem用FSDataOutputStream和FSInputStream两个类以流的方式读写内容。此外Hadoop还提供了多个FileSystem的子类。如下:
  • DistributedFileSystem:访问分布式环境中的HDFS文件
  • LocalFileSystem:          访问本地系统中的HDFS文件
  • FTPFileSystem:            To access HDFS file FTP client
  • WebHdfsFileSystem:     访问整个互联上的HDFS文件
 
URI和Path类:
Hadoop的URI类用来锁定文件位置。它通过FileSystem以 hdfs://host:port/location 来访问文件。例如:
hdfs://localhost:9000/user/joe/TestFile.txt
URI uri = URI.creat("hdfs://host:port/path")
Host和port可以在 conf/core-site.xml文件中做如下配置:

<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>

Path实例由URI实例构造,可以避免URI的OS依赖性,如Windows在路径中使用\\path 然而Linxu使用//。可以避免父子依赖性。

创建过程如下:

Path path=new Path (uri); //It constitute URI
 
Configuration
  Configuration类传递Hadoop的配置信息给FileSystem。它通过类加载器来加载core-site.xml 和core-default.xml,并且保存Hadoop的配置信息如:fs.defaultFS, fs.default.name等。
创建过程如下:
Configuration conf = new  Configuration();
此外,可以通过Configuration实例来配置参数,如:

conf.set("fs.default.name","hdfs://localhost:9000");

FileSystem

创建FileSystem实例的方法如下:

public static FileSystem get(Configuration conf);
public static FileSystem get(URI uri, Configuration conf);
public static FileSystem get(URI uri, Configuration conf, String user);
FileSystem 通过NameNode来定位DataNode ,然后按照序列顺序访问DataNode中的块数据来读取整个文件内容。FileSystem 主要的使用Java IO FileSystem 接口方法有DataInputStream和DataOutputStream。此外,如果想要获得本地文件系统实例,可以直接通过getLocal方法,如下:
public static LocalFileSystem getLocal(Configuration conf);

FSDataInputStream类

FSDataInputStream包装了DataInputStream类并且实现了Seekable, PositionedReadable接口,从而提供了诸如getPos(),seek()方法来实现对HDFS文件的随机访问。
FIleSystem的open()方法可以返回一个FSDataInputStream实例,如下:
URI uri = URI.create("hdfs://host:port/file Path");
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(rui, conf);
FSDataInputStream in = fs.open(new Path(uri));

以上方法得到的FSDataInputStream是默认缓冲空间4096byte。我们可以在创建输入流的时候指定缓冲空间大小,如下:

public abstract FSDataInputStream open(Path path, int sizeBuffer)
FSDataInputStream实现了Seekable接口的seek(long pos)和getPos()方法。
public interface Seekable{
void seek(long pos) throws IOException;
long getPos() throws IOException;
boolean seekToNewSource(long targetPos) throws IOException;
}

seek()方法搜寻给定的offset偏移量的文件位置,从而使read()方法可以从给定的文件位置开始读取。getPos()方法返回输入流当前的文件位置。一个小例子:

FileSystem fs = FileSystem.get(uri, conf);
FSDataInputStream in = fs.open(new Path(uri));
byte[] buffer = new byte[5];
in.seek(5); // sent to 5th position
in.read(buffer, 0, 5);//从输入流的第5个位置开始读取5个字节到buffer
System.out.println(new String(buffer));//打印从第5个位置开始的连续5个字节。(相对与输入流而言的!)
in.read(10, buffer, 0, 5);//从第10个位置开始读取5个字节到buffer

FSDataInputStream 也实现了PositionedReadable接口,从而提供了read和readFully方法来从seek的位置开始读取部分字节数据。如下:

read(long position, byte[] buffer, int offset, int length);

FSDataOutputStream

FileSytem的create()方法返回FSDataOutputStream,此方法可以创建新的HDFS文件或者在文件末尾EOF追加内容。它没有提供seek()方法,所以只能在EOF处写入内容。它包装了Java IO的DataOutputStream方法,并且提供了getPos()方法,获取文件位置信息,write()方法,在末尾写入内容。
如下:
public FSDataOutputStream create(Path f) // 创建空文件
public FSDataOutputStream append(Path f)//在已存在文件后追加

Creat()方法还可以传递Progressable接口参数,用来追踪文件创建状态,如下:

public FSDataOutputStream create(Path f, Progressable progress);

FileStatus

FileSystem的getFileStatus()方法可以返回FileStatus,FileStatus提供了HDFS文件的元信息。
如下:

URI uri = URI.create(strURI);
FileSystem fileSystem = FileSystem.get(uri, conf);
FileStatus fileStatus = fileSystem.getFileStatus(new Path(uri));
System.out.println("AccessTime:" + fileStatus.getAccessTime());
System.out.println("Len:"+fileStatus.getLen());
System.out.println("ModificationTime:"+fileStatus.getModificationTime());
System.out.println("Path:"+fileStatus.getPath());

如果uri是一个目录而不是文件,则listStatus()会返回一个FileStatus数组。如下:

public FileStatus[] listStatus(Path f)

Directories

FileSystem提供了如下方法来创建目录:
public boolean mkdirs(Path f);

Delete file

public boolean delete(Path f, boolean recursive) throws IOException
在文件系统中永久性删除文件或目录。
 
 
 
 
 
 
 

Hadoop HDFS Basic JAVA API的更多相关文章

  1. Hadoop HDFS 用java API 进行读写

    public class HdfsApp { public static FileSystem getFileSystem() throws Exception { Configuration con ...

  2. Hadoop之HDFS(三)HDFS的JAVA API操作

    HDFS的JAVA API操作 HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS ...

  3. Hadoop(五):HDFS的JAVA API基本操作

    HDFS的JAVA API操作 HDFS在生产应用中主要是客户端的开发,其核心步骤是从HDFS提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件. 主 ...

  4. HDFS中JAVA API的使用

    HDFS中JAVA API的使用   HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的 ...

  5. HDFS的Java API

    HDFS Java API 可以用于任何Java程序与HDFS交互,该API使我们能够从其他Java程序中利用到存储在HDFS中的数据,也能够使用其他非Hadoop的计算框架处理该数据 为了以编程方式 ...

  6. 使用HDFS客户端java api读取hadoop集群上的信息

    本文介绍使用hdfs java api的配置方法. 1.先解决依赖,pom <dependency> <groupId>org.apache.hadoop</groupI ...

  7. [转]HDFS中JAVA API的使用

    HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的文件进行操作的过程. 对分HDFS中的 ...

  8. Sample: Write And Read data from HDFS with java API

    HDFS: hadoop distributed file system 它抽象了整个集群的存储资源,可以存放大文件. 文件采用分块存储复制的设计.块的默认大小是64M. 流式数据访问,一次写入(现支 ...

  9. 熟练掌握HDFS的Java API接口访问

    HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:She ...

随机推荐

  1. 口袋微博android源码服务端和客户端

    刚刚在源码天堂看到了一个不错的安卓SNS应用源码,而且也比较完整的,它基本具备了新浪微博的所有功能,包括查看最新的微博.微博评论.好友资料.回复评论以及发私信等,除此之外,还提供了许多独有的特色功能: ...

  2. springMVC分页,interceptor实现

    PageInterceptor.java @Intercepts({ @Signature(type = StatementHandler.class, method = "prepare& ...

  3. PHP内核探索之变量(7)- 不平凡的字符串

    切,一个字符串有什么好研究的. 别这么说,看过<平凡的世界>么,平凡的字符串也可以有不平凡的故事.试看: (1)       在C语言中,strlen计算字符串的时间复杂度是?PHP中呢? ...

  4. Java经典实例:正则表达式,找到匹配的文本

    import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by Frank */ public cla ...

  5. Xamarin 手动安装步骤+破解(最新版Xamarin V3)

    Create native iOS, Android, Mac and Windows apps in C#. 看到这句话,你就知道Xamarin是什么了,对于C#开发者,这样的标语还是会让你激动一下 ...

  6. [js开源组件开发]query组件,获取url参数和form表单json格式

    query组件,获取url参数和form表单json格式 距离上次的组件[js开源组件开发]ajax分页组件一转眼过去了近二十天,或许我一周一组件的承诺有了质疑声,但其实我一直在做,只是没人看到……, ...

  7. js实现标准无缝滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 在Android中引入Java8的lambda表达式

    我用的是retrolambda这个插件,下面来说下如何添加它. 项目地址:https://github.com/evant/gradle-retrolambda 在根项目的build.gradle中添 ...

  9. 《Kotli­n for ­androi­d Deve­lopers­》中文翻译

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4939080.html 之前一直在关注Kotlin和Androi ...

  10. Android忘记密码功能实现

    连续好几天学习都没有什么进展,然而在今天这个烂漫的日子.突然有了学习的动力.想起来前几日老师给布置的android忘记密码的功能实现.今天也有了想法.就是按照老师的建议,简单的回答一个问题,实现此功能 ...