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

本节内容

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

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以供测试。

image.png
image.png
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);
    }
}

运行成功效果如下:

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。

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

image.png

学以致用

编写代码实现如下功能:

  • 通过命令行上传文件至HDFS的/user/hadoop/目录下;
  • 使用FSDataInputStream获取HDFS的/user/hadoop/目录下的的文件内容,并输出;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 当数据量增大到超出了单个物理计算机存储容量时,有必要把它分开存储在多个不同的计算机中。那些管理存储在多个网络互连的...
    单行线的旋律阅读 5,979评论 0 7
  • HDFS的设计 HDFS以流式数据访问模式来存储超大文件,运行于商用硬件集群上。 超大文件:指的是几百MB、几百G...
    Vechace阅读 4,338评论 0 1
  • 工作# 今天休息,但我今天早上8点就醒来了。晚上把明天要上班东西准备好了。其实我的工作很简单。001#我该如何把现...
    从0721开始日更阅读 1,378评论 0 0
  • 有朋友问有没有Excel公式可以自动翻译公式中的文本。找了几个帖子,是用VBA请求翻译网站的API,返回结果。尝试...
    usrbin阅读 6,228评论 3 2
  • 说出你印象最深刻的项目? 你觉得产品经理需要具备什么样的素质和能力? 你觉得怎样的产品才是一个成功的产品?成功的产...
    点滴产品阅读 4,001评论 0 2

友情链接更多精彩内容