Hadoop大数据入门到实战(第五节) - HDFS文件系统(JavaApi)

本节内容

本节我们重点来学习HDFS系统提供的JavaApi,首先我们要深入探索Hadoop的FileSystem类,它是与Hadoop的某一文件系统进行交互的API。

《Hadoop大数据入门到实战(第五节) - HDFS文件系统(JavaApi)》 image.png

我们先来学习并掌握:1.FileSystem对象的使用,2.FSDataInputSteam对象的使用。

如果你想要在windows下调试编写Hadoop程序,可以查看这篇帖子:
https://www.jianshu.com/p/e037f4fd1798

<a href=”https://www.jianshu.com/p/e037f4fd1798″ target=”_blank”> 在Windows下开发Hadoop程序 </a>

FileSystem对象

要从Hadoop文件系统中读取文件,最简单的办法是使用java.net.URL对象打开数据流,从中获取数据。不过这种方法一般要使用FsUrlStreamHandlerFactory实例调用setURLStreamHandlerFactory()方法。不过每个Java虚拟机只能调用一次这个方法,所以如果其他第三方程序声明了这个对象,那我们将无法使用了。
因为有时候我们不能在程序中设置URLStreamHandlerFactory实例,这个时候咱们就可以使用FileSystem API来打开一个输入流,进而对HDFS进行操作。

接下来我们通过一个实例来学习它的用法。

首先我们在本地创建一个文件,然后上传到HDFS以供测试。

《Hadoop大数据入门到实战(第五节) - HDFS文件系统(JavaApi)》 image.png
《Hadoop大数据入门到实战(第五节) - HDFS文件系统(JavaApi)》 image.png
《Hadoop大数据入门到实战(第五节) - HDFS文件系统(JavaApi)》 image.png

接下来,我们使用FileSystem,查看咱们刚刚上传的文件。
代码如下:

public sattic void main(String[] args){
    URI uri = URI.create("hdfs://localhost:9000/user/tmp/test.txt");
    Configuration config = new Configuration();
    FileSystem fs = FileSystem.get(uri, config);
    InputStream in = null;
    try {
        in = fs.open(new Path(uri));
        IOUtils.copyBytes(in, System.out, 2048, false);
    } catch (Exception e) {
        IOUtils.closeStream(in);
    }
}

运行成功效果如下:

《Hadoop大数据入门到实战(第五节) - HDFS文件系统(JavaApi)》 image.png

上文中,FileSystem是一个通用的文件系统API,FileSystem实例有下列几个静态工厂方法用来构造对象。

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

Configuration对象封装了客户端或服务器的配置,通过设置配置文件读取类路径来实现(如:/etc/hadoop/core-site.xml)。

  • 第一个方法返回的默认文件系统是在core-site.xml中指定的,如果没有指定,就使用默认的文件系统。
  • 第二个方法使用给定的URI方案和权限来确定要使用的文件系统,如果给定URI中没有指定方案,则返回默认文件系统,
  • 第三个方法作为给定用户来返回文件系统,这个在安全方面来说非常重要。
FSDataInputStream对象

实际上,FileSystem对象中的open()方法返回的就是FSDataInputStream对象,而不是标准的java.io类对象。这个类是继承了java.io.DataInputStream的一个特殊类,并支持随机访问,由此可以从流的任意位置读取数据。

在有了FileSystem实例之后,我们调用open()函数来获取文件的输入流。

public FSDataInputStream open(Path p)throws IOException
public abstract FSDataInputStream open(Path f,int bufferSize)throws IOException

第一个方法使用默认的缓冲区大小为4KB。

了解了这些,我们在来回顾上文代码,就能更好的理解这些方法的作用了:

《Hadoop大数据入门到实战(第五节) - HDFS文件系统(JavaApi)》 image.png

学以致用

编写代码实现如下功能:

  • 通过命令行上传文件至HDFS的/user/hadoop/目录下;
  • 使用FSDataInputStream获取HDFS的/user/hadoop/目录下的的文件内容,并输出;
    原文作者:MasterXiao
    原文地址: https://www.jianshu.com/p/c4feb00874b0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞