本节内容
本节我们重点来学习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 IOExceptionpublic static FileSystem get(URI uri,Configuration conf)throws IOExceptionpublic 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 IOExceptionpublic abstract FSDataInputStream open(Path f,int bufferSize)throws IOException
第一个方法使用默认的缓冲区大小为4KB。
了解了这些,我们在来回顾上文代码,就能更好的理解这些方法的作用了:
image.png
学以致用
编写代码实现如下功能:
通过命令行上传文件至HDFS的
/user/hadoop/
目录下;使用
FSDataInputStream
获取HDFS的/user/hadoop/
目录下的的文件内容,并输出;
作者:MasterXiao
链接:https://www.jianshu.com/p/c4feb00874b0